当你运行top
并看到所有正在运行的进程时,我总是想知道每个状态代码的实际含义,例如所有正在运行的进程的各种单字母状态代码(R = Running, S = Sleeping等)。
我在哪里可以找到这些信息?
当你运行top
并看到所有正在运行的进程时,我总是想知道每个状态代码的实际含义,例如所有正在运行的进程的各种单字母状态代码(R = Running, S = Sleeping等)。
我在哪里可以找到这些信息?
这个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
这样的程序会从内核本身中获取这些值。您可以在此处找到其定义的源代码:
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 */
};
了解更多信息请见此问题: https://unix.stackexchange.com/q/462098/79648
S
状态。相比之下,我知道磁盘活动可以导致D
状态。 - AsclepiusS
状态。最常见的原因是当进程正在等待事件和/或超时(select
/poll
/epoll
,从终端或网络进行阻塞read
等),以及其他许多情况。 - CesarBT
而是t
,对吗? - forest