2012-06-19 167 views
8

这是在Linux操作系统上。应用程序是用C++和ACE库编写的。如何检测由于操作系统调度而导致线程或进程是否饿死

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

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

回答

3

如果一个过程饿死了,那么这个过程的自我监控就不会那么有效。但是,如果您只是希望该流程注意到该流程尚未运行一段时间,则可以定期呼叫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/proc/<pid>/task/目录检查权task

tid = syscall(__NR_gettid); 

我这样做,因为我不能尽管它已被记录,但找到系统调用实际上是由我的系统上的任何库导出的。但是,它可能适用于你的。

相关问题