如何检测线程或进程是否因操作系统调度而变得饥饿

时间:2012-06-19 21:21:31

标签: c++ linux operating-system job-scheduling ace

这是在Linux操作系统上。 App是用C ++编写的,带有ACE库。

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

我想知道是否有任何我可以以编程方式进行查看线程/进程是否正在获取时间片。

1 个答案:

答案 0 :(得分:4)

如果某个流程正在被淘汰,那么对该流程进行自我监控就不会那么有效。但是,如果您只是希望该过程注意到它还没有运行一段时间,它可以定期调用times并将经过时间的相对差异与预定用户时间的相对差异进行比较(您可以将tms_utimetms_cutime字段,如果您希望将等待的孩子视为生产时间,如果您计算在您的内核上花费的时间,则可以在tms_stimetms_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系统调用,即使它已被记录。但是,它可能会出现在您的身上。