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]
Run Code Online (Sandbox Code Playgroud)
但是,ps
联机帮助页中未提及此状态:
进程状态代码 以下是 s、stat 和 state 输出说明符(标题“STAT”或“S”)将显示的不同值来描述进程的状态:
Run Code Online (Sandbox Code Playgroud)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
状态?
slm*_*slm 11
意思是“空闲”
/* states beyond TASK_REPORT: */
"I (idle)", /* 0x80 */
Run Code Online (Sandbox Code Playgroud)
参考:Linux 进程状态“I”在顶部输出中是什么意思?
在内核源代码中挖掘更多,我发现 I 的记录是
TASK_REPORT_IDLE
,__get_task_state
当进程状态为 TASK_IDLE 时从内核胆量(函数)返回,这实际上是Run Code Online (Sandbox Code Playgroud)#define TASK_IDLE (TASK_UNINTERRUPTIBLE | TASK_NOLOAD)
另外,请参阅题为:sched/wait: Introduce TASK_NOLOAD 和 TASK_IDLE的内核提交。
目前人们习惯于
TASK_INTERRUPTIBLE
空闲kthreads
并等待“工作”,因为这TASK_UNINTERRUPTIBLE
会增加负载。让所有空闲的资源都kthreads
贡献给 loadavg 有点傻。现在大多数情况下都可以正常工作,因为
kthreads
它们的所有信号都被屏蔽了。但是,有一些站点会导致问题并且TASK_UNINTERRUPTIBLE
应该使用,除了 loadavg 问题。此补丁添加了
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
Run Code Online (Sandbox Code Playgroud)