tra*_*shi 18 process process-management linux-kernel
我正在尝试将 Linux 进程状态代码(如ps
)映射到操作系统状态图中的状态,但我似乎无法映射它们。是不是因为 Linux 进程状态不一定与理论上的 OS 状态图匹配?具体地讲,我不确定其中D
/ S
/ T
/I
配合的图中
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 。这种状态进入与大多数系统调用,等待一些事件(sleep ,select ,poll ,wait ,等)。 |
T |
该过程阻止从由等的信号被调度SIGSTOP 。此状态与理论状态“阻塞”不完全匹配,因为进程本身不会等待事件,但通常会被另一个进程或用户 ( Ctrl+ Z) 的干预阻止进一步运行。 |
t |
与上面类似。该进程被调试器或跟踪进程阻止调度,而不是由它自己等待事件。 |
W |
过时的。该进程被阻塞,等待将内存页从交换区读取到 RAM 中。这段代码一直使用到 Linux v1.1.30。从 v2.3.43 开始,无法再将进程置于此状态,并且自 v2.5.50 以来,对该状态的每个引用都已删除。 |
X |
进程终止,当前正在从进程列表中删除。您不会经常看到这种状态,因为它只ps 在内核清理另一个 CPU 内核上的进程条目的瞬间运行时才会出现。 |
Z |
进程终止,进程列表中的条目仅存在,以便父进程可以收集退出状态信息。 |