这纯粹是学术问题,我真的不需要知道这些信息,但我想更多地了解内核: - )
根据内核文档http://www.tldp.org/LDP/tlk/kernel/processes.html,linux内核中的进程具有以下状态:
运行
该过程正在运行(这是当前的过程 系统)或它准备好运行(等待分配到其中一个 系统的CPU)。
等待
进程正在等待事件或资源。 Linux的 区分两种类型的等待过程;可中断的 不间断。可以中断可中断的等待进程 信号,而不间断的等待过程直接等待 在硬件条件和任何不能打断 情况。
停止
此过程已停止,通常是通过接收信号。一个过程 正在调试的可以处于停止状态。
僵尸
这是一个暂停的过程,由于某种原因,仍然有一个 task_struct任务向量中的数据结构。听起来就是这样 比如,一个死的过程。
正如您所看到的,当我使用ps
之类的命令拍摄进程状态的快照时,我可以看到,如果它处于Running
状态,那么该进程要么字面上正在运行,要么只是等待由内核分配给某个CPU。
在我看来,这两个州(实际上都由task_struct
中的一个州代表)是完全不同的。
为什么没有像“Ready”这样的状态意味着该进程“已准备好运行”但到目前为止尚未分配给任何CPU,因此task_struct
将更清楚地了解真实状态?是否有可能检索到这些信息,或者出于什么原因,它在CPU上“逐字运行”的过程中是否保密?
答案 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
他们中的许多人都在为每个进程提供执行的时间片,让他们每个人在切换(称为上下文切换)到另一个进程之前做一些工作。
由于时间片的长度在显示您请求的信息时大约是毫秒级,因此状态肯定会发生变化,因此区分“真正运行”和“准备但不是真正运行”可能导致(大部分时间)不准确的信息。