一尘不染

如何查看线程在哪个CPU内核中运行?

linux

在Linux中,假设线程的pid为[pid],则从目录/ proc / [pid]中我们可以获得许多有用的信息。例如,这些proc文件/ proc /
[pid] / status,/ proc / [pid] / stat和/ proc / [pid] /
schedstat都是有用的。但是,如何获取线程正在运行的CPU核心号?如果线程处于睡眠状态,我如何才能知道线程在再次调度后将在哪个内核上运行?

顺便说一句,有没有一种方法可以转储每个CPU内核的正在运行和正在hibernate的任务的进程(线程)列表?


阅读 876

收藏
2020-06-03

共1个答案

一尘不染

截至2014年,以下答案不再准确

任务不会睡在任何特定的内核中。而且调度程序不会提前知道它将在哪个内核上运行线程,因为这将取决于这些内核的未来使用情况。

要获取所需的信息,请查看/ 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

请注意,所有这些信息在您获得时可能已过时。在您open在proc中对该文件进行调用与该调用返回之间的某个时间点是正确的。

2020-06-03