如何判断进程是否真正在运行或等待在Linux上运行?

时间:2014-02-28 17:11:06

标签: linux-kernel

这纯粹是学术问题,我真的不需要知道这些信息,但我想更多地了解内核: - )

根据内核文档http://www.tldp.org/LDP/tlk/kernel/processes.html,linux内核中的进程具有以下状态:

  

运行

     

该过程正在运行(这是当前的过程   系统)或它准备好运行(等待分配到其中一个   系统的CPU)。

     

等待

     

进程正在等待事件或资源。 Linux的   区分两种类型的等待过程;可中断的   不间断。可以中断可中断的等待进程   信号,而不间断的等待过程直接等待   在硬件条件和任何不能打断   情况。

     

停止

     

此过程已停止,通常是通过接收信号。一个过程   正在调试的可以处于停止状态。

     

僵尸

     

这是一个暂停的过程,由于某种原因,仍然有一个   task_struct任务向量中的数据结构。听起来就是这样   比如,一个死的过程。

正如您所看到的,当我使用ps之类的命令拍摄进程状态的快照时,我可以看到,如果它处于Running状态,那么该进程要么字面上正在运行,要么只是等待由内核分配给某个CPU。

在我看来,这两个州(实际上都由task_struct中的一个州代表)是完全不同的。

为什么没有像“Ready”这样的状态意味着该进程“已准备好运行”但到目前为止尚未分配给任何CPU,因此task_struct将更清楚地了解真实状态?是否有可能检索到这些信息,或者出于什么原因,它在CPU上“逐字运行”的过程中是否保密?

2 个答案:

答案 0 :(得分:2)

struct task_struct包含一个表示当前状态的long:

volatile long state;          /* -1 unrunnable, 0 runnable, >0 stopped */

这只是表明进程是否“可运行”。

要查看当前正在执行的进程,您应该查看runqueue。具体来说,struct rq(在kernel / sched / sched.h中定义)包含:

struct task_struct *curr, *idle, *stop;

指针* curr是此runqueue上当前正在运行的进程(每个CPU都存在一个runqueue)。

您应该查看kernel / sched /下的文件,看看内核如何根据不同的调度算法确定应该调度哪些进程,如果您对它到达运行状态的确切方式感兴趣的话。

答案 1 :(得分:0)

这不是linux内核的答案,而是关于调度^^的更一般的答案 任何操作系统的核心部分是调度程序:http://en.wikipedia.org/wiki/Process_scheduler

他们中的许多人都在为每个进程提供执行的时间片,让他们每个人在切换(称为上下文切换)到另一个进程之前做一些工作。

由于时间片的长度在显示您请求的信息时大约是毫秒级,因此状态肯定会发生变化,因此区分“真正运行”和“准备但不是真正运行”可能导致(大部分时间)不准确的信息。