运行ps aux
中Ubuntu 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_NOLOAD
与TASK_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