在Linux中,假设线程的pid为[pid],我们可以从目录/proc/[pid]中获得许多有用的信息.例如,这些proc文件、/proc/[pid]/status、/proc/[pid]/stat和/proc/[pid]/schedstat都很有用.但是,如何获取线程运行的CPU核心号呢?如果一个线程处于睡眠状态,我怎么知道在再次调度后它将运行哪个内核?
顺便问一下,有没有办法转储每个CPU内核的运行和Hibernate 任务的进程(线程)列表?
在Linux中,假设线程的pid为[pid],我们可以从目录/proc/[pid]中获得许多有用的信息.例如,这些proc文件、/proc/[pid]/status、/proc/[pid]/stat和/proc/[pid]/schedstat都很有用.但是,如何获取线程运行的CPU核心号呢?如果一个线程处于睡眠状态,我怎么知道在再次调度后它将运行哪个内核?
顺便问一下,有没有办法转储每个CPU内核的运行和Hibernate 任务的进程(线程)列表?
任务不存在于任何特定的核心.调度程序将不会提前知道它将在哪个内核上运行线程,因为这将取决于这些内核的future 使用情况.
要获取所需信息,请查看/proc/<;pid>/任务/<;tid>/地位如果线程正在运行,第三个字段将是"R".最后一个字段中的第六个将是线程当前正在运行的核心,或者是线程上次运行(或迁移到)的核心(如果当前未运行).
31466(公元前)S 31348 31466 31348 34819 31466 4202496 2557 0 0 0 5006 16 0 0 20 0 0 1 0 396934 121827328 1091 18446744073709551615 4194304 4271839 140737264235072 140737264232056 21797807456 0 0 137912326 18446744071581662243 0 17 3 0 0 0 0 0 0 0 0
目前没有运行.上次在core 3上运行.
31466(公元前)R 31348 31466 31348 34819 31466 4202496 2557 0 0 0 3818 12 0 0 0 0 0 0 0 1 0 296934 121827328 1091 18446744073709551615 4194304 4271839 140737264235072 140737264231824 4235516 0 0 0 0 0 0 0 0 0 0 0 0 0
目前在core 2上运行.
要了解其余字段的含义,请查看Linux内核源代码——特别是fs/proc/array.c
或Documentation/filesystems/stat.txt
中的do_task_stat
函数.
请注意,当您获得这些信息时,这些信息可能都已过时.从您在proc中对文件进行open
次调用到该调用返回之间的某个时刻,这是真的.