当您运行top
并查看所有正在运行的进程时,我一直想知道一切实际意义。例如,运行进程的所有各种单字母状态代码(R = 运行中,S = 睡眠等等…)
我可以在哪里找到这个?
当您运行top
并查看所有正在运行的进程时,我一直想知道一切实际意义。例如,运行进程的所有各种单字母状态代码(R = 运行中,S = 睡眠等等…)
我可以在哪里找到这个?
这个man页列出了状态码的映射关系,但没有解释它们具体意义。来自top
man页:
D = uninterruptible sleep
R = running
S = sleeping
T = traced or stopped
Z = zombie
R是最容易的; 过程已准备就绪,并将在其使用CPU时随时运行。
S和D是两种睡眠状态,进程在等待某些事情发生。它们的区别在于S可以被信号打断,而D则不能(通常在进程等待磁盘时出现)。
T是进程停止的状态,通常是通过SIGSTOP或SIGTSTP来实现的。它也可以被调试器(ptrace)停止。当您看到该状态时,通常是因为您使用Ctrl + Z将命令放在后台。
Z是一个无法再执行的状态(它已经完成了它的执行),唯一剩下的就是描述它的内核结构。它在等待它的父进程检索它的退出代码,没有其他事情要做。在其父进程完成它之后,它将消失。
您可以使用命令 man top
查找状态:
D = uninterruptible sleep
I = idle
R = running
S = sleeping
T = stopped by job control signal
t = stopped by debugger during trace
Z = zombie
像 top
和 ps
这样的程序从内核本身获取这些值。您可以在此处找到其定义的源代码:
请将以下内容翻译为中文:https://github.com/torvalds/linux/blob/3950e975431bc914f7e81b8f2a2dbdf2064acb0f/fs/proc/array.c#L129-L143
static const char * const task_state_array[] = {
/* states in TASK_REPORT: */
"R (running)", /* 0x00 */
"S (sleeping)", /* 0x01 */
"D (disk sleep)", /* 0x02 */
"T (stopped)", /* 0x04 */
"t (tracing stop)", /* 0x08 */
"X (dead)", /* 0x10 */
"Z (zombie)", /* 0x20 */
"P (parked)", /* 0x40 */
/* states beyond TASK_REPORT: */
"I (idle)", /* 0x80 */
};