操作系统理论中的进程状态与 Linux 中的进程状态

tra*_*shi 18 process process-management linux-kernel

我正在尝试将 Linux 进程状态代码(如ps)映射到操作系统状态图中的状态,但我似乎无法映射它们。是不是因为 Linux 进程状态不一定与理论上的 OS 状态图匹配?具体地讲,我不确定其中D/ S/ T/I配合的图中

  • ps来自手册页的进程状态代码

    PROCESS STATE CODES
           Here are the different values that the s, stat and state output
           specifiers (header "STAT" or "S") will display to describe the
           state of a process:
    
                   D    uninterruptible sleep (usually IO)
                   I    Idle kernel thread
                   R    running or runnable (on run queue)
                   S    interruptible sleep (waiting for an event to
                        complete)
                   T    stopped by job control signal
                   t    stopped by debugger during the tracing
                   W    paging (not valid since the 2.6.xx kernel)
                   X    dead (should never be seen)
                   Z    defunct ("zombie") process, terminated but not
                        reaped by its parent
    
    Run Code Online (Sandbox Code Playgroud)
  • 来自维基百科的操作系统进程状态图

    操作系统进程状态图

类似于“停止”是否属于“阻塞”状态?但答案很不完整。

cg9*_*909 37

简短的回答:

各州(大致)映射如下:

状态 意义
D 被封锁
I 被封锁
R 等待或运行
S 被封锁
T 阻止(或多或少)
t 阻止(或多或少)
W 已阻止(自 Linux 1.1.30 起过时)
X 已终止
Z 已终止

长答案:

Linux 中外部可见的进程状态代码试图将系统管理员可能感兴趣的信息打包成一个字符,因此它们还包括为什么一个进程被阻塞(因而,如果它能够畅通,什么可以解锁)。

“等待”和“运行”之间的区别是模糊的,因为进程在如此小的时间片中运行,以至于对于坐在计算机前的人来说,准备运行的进程和正在运行的进程之间没有太大区别。

此外,Linux 不会换出整个进程,而是换出单个内存页,因此您不会找到映射到“换出并等待”或“换出并被阻止”的状态。

状态 意义
D 进程被阻塞并且该状态不能被中断(例如用kill)。通常在这种状态下,内核代表进程执行 I/O,并且有问题的内核代码无法处理中断。
I 该进程是一个内核线程,当前无事可做,被阻塞等待新的工作。此状态在技术上与D(因为通常内核线程不可中断)相同。它是出于会计/美容原因引入的,因为处于D状态的进程被认为对系统负载有贡献。
R 进程正在等待运行或正在运行。这些都是调度程序可以并且将在可用 CPU 上调度的所有进程。内核可以在内部区分正在运行和等待的进程,但这不会通过进程状态代码公开。
S 该进程被阻塞,该状态可以用 中断kill。这种状态进入与大多数系统调用,等待一些事件(sleepselectpollwait,等)。
T 该过程阻止从由等的信号被调度SIGSTOP。此状态与理论状态“阻塞”不完全匹配,因为进程本身不会等待事件,但通常会被另一个进程或用户 ( Ctrl+ Z) 的干预阻止进一步运行。
t 与上面类似。该进程被调试器或跟踪进程阻止调度,而不是由它自己等待事件。
W 过时的。该进程被阻塞,等待将内存页从交换区读取到 RAM 中。这段代码一直使用到 Linux v1.1.30。从 v2.3.43 开始,无法再将进程置于此状态,并且自 v2.5.50 以来,对该状态的每个引用都已删除。
X 进程终止,当前正在从进程列表中删除。您不会经常看到这种状态,因为它只ps在内核清理另一个 CPU 内核上的进程条目的瞬间运行时才会出现。
Z 进程终止,进程列表中的条目仅存在,以便父进程可以收集退出状态信息。

  • @AustinHemmelgarn 当然 Linux 并不是唯一使用基于页面交换的操作系统,但问题是关于 Linux 中的进程状态,所以我只写了 Linux 上的情况 (5认同)
  • Linux 远不是唯一一个进行基于页面的交换而不是整个进程的交换的操作系统。事实上,我认为_任何_现代消费者操作系统都不会交换整个进程,动态链接使得这样做变得相当复杂,并且与基于页面的交换相比几乎没有好处。 (2认同)