本文介绍如何在Linux
系统上查看某个进程(线程)所运行的CPU
,但在此之前我们需要弄清楚两个基本概念:
(1)Linux
操作系统上的进程和线程没有本质区别,在内核看来都是一个task
。属于同一个进程的各个线程共享某些资源,每一个线程都有一个ID
,而“主线程”的线程ID
同进程ID
,也就是我们常说的PID
是一样的。
(2)使用lscpu
命令,可以得到当前系统CPU
的数量:
$ lscpu
......
CPU(s): 24
On-line CPU(s) list: 0-23
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 2
......
系统有2
个物理CPU
(Socket(s): 2
),每个CPU
有6
个core
(Core(s) per socket: 6
),而每个core
又有2
个hardware thread
(Thread(s) per core: 2
)。所以整个系统上一共有2X6X2=24
(CPU(s):24
)个逻辑CPU
,也就是实际运行程序的CPU
。
使用htop
命令可以得到进程(线程)所运行的CPU
信息,但是htop
默认情况下不会显示这一信息:
开启方法如下:
(1)启动htop
后,按F2
(Setup
):
(2) 在Setup
中选择Columns
,然后在Available Columns
中选择PROCESSOR - ID of the CPU the process last executed
, 接下来按F5
(Add
)和F10
(Done
)即可:
现在htop
就会显示CPU
的相关信息了。需要注意的是,其实htop
显示的只是“进程(线程)之前所运行的CPU
”,而不是“进程(线程)当前所运行的CPU
”,因为有可能在htop
显示的同时,操作系统已经把进程(线程)调度到其它CPU
上运行了。
下面是一个运行时会包含4
个线程的程序:
#include <omp.h>
int main(void){
#pragma omp parallel num_threads(4)
for(;;)
{
}
return 0;
}
编译并运行代码:
$ gcc -fopenmp thread.c
$ ./a.out &
[1] 17235
使用htop
命令可以得到各个线程ID
,以及在哪个CPU
上运行:
参考资料:
How to find out which CPU core a process is running on;
闲侃CPU(一)。