Med*_*ine 9 c++ linux operating-system ace job-scheduling
这是在Linux操作系统上.App是用C++用ACE库编写的.
我怀疑这个过程中的一个线程有时会被异常长时间(5到40秒)阻塞.该应用程序大多数时间运行良好,除了每天有几次这个问题.还有其他类似的5个应用程序在盒子上运行,由于大量的套接字传入数据,它们也受I/O限制.
我想知道是否有任何我可以以编程方式做的事情,看看线程/进程是否正在获得他们的时间片.
如果某个进程资源匮乏,对该进程的自我监控就不会那么高效。但是,如果您只是想让该进程注意到它有一段时间没有运行,它可以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
系统上任何库实际导出的系统调用,即使它已被记录。但是,它可能在您身上可用。