在Linux中,假设线程的pid为[pid],则从目录/ proc / [pid]中我们可以获得许多有用的信息。例如,这些proc文件/ proc / [pid] / status,/ proc / [pid] / stat和/ proc / [pid] / schedstat都是有用的。但是,如何获取线程正在运行的CPU核心号?如果线程处于睡眠状态,我如何才能知道线程在再次调度后将在哪个内核上运行?
顺便说一句,有没有一种方法可以转储每个CPU内核的正在运行和正在hibernate的任务的进程(线程)列表?
任务不会睡在任何特定的内核中。而且调度程序不会提前知道它将在哪个内核上运行线程,因为这将取决于这些内核的未来使用情况。
要获取所需的信息,请查看/ proc / / task / / status。如果线程正在运行,则第三个字段将为“ R”。从最后一个字段开始的第六个将是线程当前正在运行的核心,或者如果线程当前未在运行,则它将最后运行(或已迁移到)该核心。
31466(bc) S 31348 31466 31348 34819 31466 4202496 2557 0 0 0 5006 16 0 0 20 0 1 0 10196934 121827328 1091 18446744073709551615 4194304 4271839 140737264235072 140737264232056 217976807456 0 0 0 137912326 18446744071581662243 0 0 17 3 0 0 0 0 0 0
当前未运行。最后一次运行在核心3上。
31466(bc) R 31348 31466 31348 34819 31466 4202496 2557 0 0 0 3818 12 0 0 20 0 1 0 10196934 121827328 1091 18446744073709551615 4194304 4271839 140737264235072 140737264231824 4235516 0 0 0 2 0 0 0 17 2 0 0 0 0
当前在核心2上运行。
要了解其余字段的含义,请查看Linux内核源代码- 尤其是或中的do_task_stat函数。fs/proc/array.cDocumentation/filesystems/stat.txt
do_task_stat
fs/proc/array.c
Documentation/filesystems/stat.txt
请注意,所有这些信息在您获得时可能已过时。在您open在proc中对该文件进行调用与该调用返回之间的某个时间点是正确的。
open