寻找Linux上等待CPU的进程

前几天碰到一个(面试)问题:

在Linux上,你如何找到哪些进程处于等待CPU的状态?

第一个想到的工具是PS。但看了一下PS的手册,它的状态栏中’R’可以表示正在运行,或者已经准备好了但正在等待运行。

然后尝试了grep State /proc/$pid/status,还是同样的问题。继续查找相关资料,发现Linux的进程管理中,进程的状态是RUNNING(正在运行)还是 Ready to run (等待运行)是不加区分的。跟PS中的状态是一样的。但对于排错来讲,这两种状态差别就大了。或许Linux的调度机制可以确保处于Ready to run状态的进程一定可以分配到CPU?

再换个角度考虑,进程的状态是一个动态的东西,应该是在不同的状态之间不停的切换的。确实,如果一个进程处于Ready to run的状态,那么它确实应该很快就能获得CPU资源,变成真正意义上的RUNNING的状态。至少理论上是如此,如果一个进程处于Ready to run的状态却又很长时间都得不到CPU,那么可以认为这个系统出了问题,或者是负载严重过载。

因此,更准确的说,一个进程如果处于等待的状态,那么它应该不是等待CPU,而是应该等待其它东西(I/O)。所以说,这个”等待CPU“的说法是不太合适的,或者说这是及其少见的。更常见的是处于等待状态的进程,也即PS中显示为D (uninterruptible sleep (usually IO))或S (interruptible sleep (waiting for an event to complete))状态的进程。

也就是这个问题有一定的误导性。估计也不是问题设计者的本意。

那么,我们究竟能否找到在某个特定时间点上处于Ready to run状态的进程呢?

未完待续…

Understanding Linux Process States Author: Yogesh Babar

https://access.redhat.com/sites/default/files/attachments/processstates_20120831.pdf