9

这是在 Linux 操作系统上。应用程序是用 ACE 库用 C++ 编写的。

我怀疑进程中的一个线程有时会被阻塞很长时间(5 到 40 秒)。该应用程序在大多数情况下运行良好,除了一天几次它有这个问题。由于大量的套接字传入数据,还有其他类似的 5 个应用程序在盒子上运行,它们也是 I/O 绑定的。

我想知道我是否可以以编程方式做任何事情来查看线程/进程是否正在获得他们的时间片。

4

1 回答 1

4

如果某个流程被饿死,那么对该流程的自我监控就不会那么高效。但是,如果您只是希望该进程注意到它有一段时间没有运行,它可以times定期调用并将经过时间的相对差异与计划用户时间的相对差异进行比较(如果需要,您可以对tms_utimeandtms_cutime字段求和将等待孩子计算为生产时间,如果您将代表您花费的内核时间计算为生产时间,您将在tms_stime和字段中求和)。tms_cstime对于线程时间,我知道的唯一方法是查阅/proc文件系统。

高优先级外部进程或高优先级线程可以通过读取进程(和线程)的适当/proc/<pid>/stat条目来从外部监视感兴趣的进程(和/proc/<pid>/task/<tid>/stat线程)。用户时间位于stat文件的第 14 和第 16 字段中。系统时间位于第 15 和第 17 字段中。(对于我的 Linux 2.6 内核,字段位置是准确的。)

在两个时间点之间,您可以确定经过的时间量(监控进程或线程通常会定期唤醒)。然后,每个时间点的累积处理时间之间的差异表示在此期间感兴趣的线程运行了多少时间。处理时间与经过时间的比率将代表时间片。

最后一点信息:在 Linux 上,我使用以下命令获取tid当前线程的权限task以检查/proc/<pid>/task/目录中的权限:

tid = syscall(__NR_gettid);

我这样做是因为我找不到gettid系统上任何库实际导出的系统调用,即使它已记录在案。但是,它可能在您的身上可用。

于 2012-06-19T21:45:57.910 回答