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

Med*_*ine 9 c++ linux operating-system ace job-scheduling

这是在Linux操作系统上.App是用C++用ACE库编写的.

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

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

jxh*_*jxh 4

如果某个进程资源匮乏,对该进程的自我监控就不会那么高效。但是,如果您只是想让该进程注意到它有一段时间没有运行,它可以times定期调用并将经过时间的相对差异与计划用户时间的相对差异进行比较(如果需要,您可以将tms_utime和字段相加)tms_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);
Run Code Online (Sandbox Code Playgroud)

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