在Linux中,“top”命令中的所有值都代表什么意思?

72

当你运行top并看到所有正在运行的进程时,我总是想知道每个状态代码的实际含义,例如所有正在运行的进程的各种单字母状态代码(R = Running, S = Sleeping等)。

我在哪里可以找到这些信息?

3个回答

144

这个man页面说明了状态代码的映射,但没有解释它们实际上代表什么意思。从top man页面中可以得知:

'D' = uninterruptible sleep
'R' = running
'S' = sleeping
'T' = traced or stopped
'Z' = zombie

'R'状态最简单;进程已准备好运行,只要轮到它使用CPU就会运行。

'S'和'D'是两种睡眠状态,进程在等待某些事件发生。不同之处在于'S'可以被信号中断,而'D'则不行(通常在进程等待磁盘时出现)。

'T'是进程停止的状态,通常通过SIGSTOPSIGTSTP实现。也可以通过调试器(ptrace)停止。当你看到这个状态时,通常是因为你使用Ctrl+ Z将命令放在后台。

'Z'是进程死亡的状态(已完成执行),剩下的只是内核中描述它的结构。它正在等待其父进程检索其退出代码,没有更多的操作。在其父进程完成后,它将消失。


这并没有说明是什么导致了 S 状态。相比之下,我知道磁盘活动可以导致 D 状态。 - Asclepius
1
@A-B-B:这是因为有许多事情可能会导致S状态。最常见的原因是当进程正在等待事件和/或超时(select/poll/epoll,从终端或网络进行阻塞read等),以及其他许多情况。 - CesarB
2
更详细的相关答案请参考:https://dev59.com/KXVC5IYBdhLWcg3wpi98#224042 - CesarB
3
这个答案是否有现代化的更新?我看到具有状态码'I'的进程-而手册没有说明那是什么! - Phil
1
如果被调试器停止,状态不是 T 而是 t,对吗? - forest

18

您可以使用命令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

2
嘿,伙计!你抄袭了我的答案! - BubbaT
3
在这里,“RTFM不是一个有效的答案”,因为仅凭手册无法确定状态的真正含义。 - ApolloLV
[~]# man top sh:man:未找到命令 我知道,我知道:https://www.man7.org/linux/man-pages/man1/top.1.html - noname

8

topps 这样的程序会从内核本身中获取这些值。您可以在此处找到其定义的源代码:

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 */
};

了解更多信息请见此问题: https://unix.stackexchange.com/q/462098/79648


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接