ps 命令中无法识别的进程状态输出

ps 命令中无法识别的进程状态输出

运行ps auxUbuntu 18.04我看到一些进程具有 state I,如......

root         1  0.0  0.0 225520  9144 ?        Ss   10:36   0:02 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    10:36   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<   10:36   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        I<   10:36   0:00 [mm_percpu_wq]

然而,联机帮助页中没有提到这种状态ps

进程状态代码 以下是 s、stat 和状态输出说明符(标题“STAT”或“S”)将显示的不同值,用于描述进程的状态:

           D    uninterruptible sleep (usually IO)
           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

   For BSD formats and when the stat keyword is used, additional characters may be displayed:

           <    high-priority (not nice to other users)
           N    low-priority (nice to other users)
           L    has pages locked into memory (for real-time and custom IO)
           s    is a session leader
           l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
           +    is in the foreground process group

这是什么I状态?

答案1

意思是“闲着”

    /* states beyond TASK_REPORT: */
    "I (idle)",             /* 0x80 */
参考:顶部输出中的 Linux 进程状态“I”是什么意思?

在内核源代码中进行更多挖掘,我发现 I 的记录是TASK_REPORT_IDLE,当进程处于状态 TASK_IDLE 时从内核内部(函数)返回__get_task_state,它实际上是

#define TASK_IDLE   (TASK_UNINTERRUPTIBLE | TASK_NOLOAD)

另请参阅此对内核的提交,标题为:sched/wait:引入TASK_NOLOAD和TASK_IDLE

目前,人们习惯于TASK_INTERRUPTIBLE闲置kthreads并等待“工作”,因为TASK_UNINTERRUPTIBLE这会增加平均负载。让所有空闲都kthreads贡献于平均负载有点愚蠢。

现在大部分情况下都可以正常工作,因为kthreads所有信号都被屏蔽了。然而,除了 loadavg 问题之外,有一些网站会导致问题并且 TASK_UNINTERRUPTIBLE应该使用它。

此补丁添加了TASK_NOLOADTASK_UNINTERRUPTIBLE避免 loadavg 会计结合使用的功能。

由于大多数想象的使用站点都是线程想要空闲、等待工作的循环,因此TASK_IDLE引入了一个助手。

笔记:这似乎已添加到4.14-rc3 中的 Linux 内核:

sched/debug:添加显式 TASK_IDLE 打印

/进程

鉴于这来自 Linux 内核,下游工具(例如 和 )ps可以top立即显示这个新状态 ,I而无需明确告知,因为它们从 中获取信息/proc

您可以/proc通过以下方式查看 a 的状态/proc/<PID>/stat

$ cat /proc/10/stat
10 (lru-add-drain) S 2 0 0 0 -1 69247072 ....
                   ^--- state = S = Sleep

参考

相关内容