【问题标题】:how to figure out if process is really running or waiting to run on Linux?如何确定进程是否真的在运行或等待在 Linux 上运行?
【发布时间】:2014-02-28 17:11:06
【问题描述】:

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

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

跑步

进程要么正在运行(它是当前进程在 系统)或它已准备好运行(它正在等待分配给其中之一 系统的 CPU)。

等待

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

已停止

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

僵尸

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

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

在我看来,这 2 个状态(实际上都由 task_struct 中的 1 个状态表示)是完全不同的。

为什么没有像“Ready”这样的状态表示进程“准备好运行”但到目前为止还没有分配给任何 CPU,这样task_struct 就可以更清楚地了解真实状态?是否有可能检索到这些信息,或者无论出于何种原因,哪个进程在 CPU 上“真正运行”是秘密的?

【问题讨论】:

  • 我不认为这是秘密信息,因为调度程序需要知道要切换什么。找到答案的最佳方法可能是注册内核邮件列表或自己查看the source

标签: linux-kernel


【解决方案1】:

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

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

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

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

struct task_struct *curr, *idle, *stop;

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 2010-09-13
      • 2016-02-20
      • 1970-01-01
      • 2010-12-08
      • 2012-09-17
      • 1970-01-01
      • 2012-07-17
      • 2011-07-09
      相关资源
      最近更新 更多