我正在尝试将 Linux 进程状态代码(如ps
)映射到操作系统状态图中的状态,但我似乎无法映射它们。是因为Linux进程状态不一定与理论操作系统状态图相符吗?具体来说,我不确定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
OS进程状态图来自维基百科:
如同“stopped”是否属于“blocked”状态?但答案相当不完整。
答案1
简短回答:
各州(大致)地图如下:
状态 | 意义 |
---|---|
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 |
过程是终止进程列表中的条目只是为了父进程可以收集退出状态信息而存在。 |