如何快速获取多核处理器当前正在执行的所有进程?

时间:2019-04-21 21:18:03

标签: linux linux-kernel

我正在研究实现驱动程序的内核模块。

调用read()文件op时,可以使用 current 获取当前正在运行的进程。但是,当输入read()时,我还打算获取多核平台上其他核当前正在执行的所有进程。

我可以使用 for_each_process()来迭代每个struct task_struct以查看它是否为 TASK_RUNNING 。但是我知道这不能解决我的问题,因为 TASK_RUNNING 无法提供有关该进程是否正在由CPU执行的信息(这仅意味着相应的进程是可运行的)。此外,我不想重复所有过程以节省一些开销。

关于如何解决此问题的任何想法?谢谢!

1 个答案:

答案 0 :(得分:1)

有一条命令echo l > /proc/sysrq-trigger,它显示CPU(https://en.wikipedia.org/wiki/Magic_SysRq_key)上的活动任务。您可以通过l函数发送read()

或者您可以尝试编写自己的转储函数。这就是当前Linux内核中的工作方式:

sysrq_handle_showallcpushttps://elixir.bootlin.com/linux/v5.0.8/source/drivers/tty/sysrq.c#L234)=>

trigger_all_cpu_backtracehttps://elixir.bootlin.com/linux/v5.0.8/source/include/linux/nmi.h#L144)=>

arch_trigger_cpumask_backtrace(取决于拱门)