有时有几个进程处于卡住状态。例如:
PID COMMAND %CPU TIME #TH #WQ #POR #MREGS RPRVT RSHRD RSIZE VPRVT VSIZE PGRP PPID STATE
99357 plugin-container 0.1 12:07.07 10 1 224 2097 40M 84M 66M 82M 2757M 91688 99346 sleeping
99346 firefox 0.4 48:54.20 29 1 265 16250 467M 172M 799M 538M 4210M 91688 1 sleeping
88029- Aquamacs 1.2 31:24.12 4 3 126 268 19M 49M 32M 36M 777M 88029 152 stuck
Run Code Online (Sandbox Code Playgroud)
它是流程正常生命周期的一部分吗?为什么要特别注意这个过程?
它到底是什么意思?
jau*_*ume 42
这不一定是一个坏兆头,但让我先回答你的最后一个问题:
它到底是什么意思?
在top
源代码(来自http://www.opensource.apple.com/release/mac-os-x-1082/)中,卡住状态被称为标识符LIBTOP_STATE_STUCK
(来自libtop.c
):
libtop_state_str(uint32_t state)
{
const char *strings[] = {
"zombie",
#define LIBTOP_STATE_ZOMBIE 0
"running",
#define LIBTOP_STATE_RUN 1
"stuck",
#define LIBTOP_STATE_STUCK 2
"sleeping",
#define LIBTOP_STATE_SLEEP 3
"idle",
#define LIBTOP_STATE_IDLE 4
"stopped",
#define LIBTOP_STATE_STOP 5
"halted",
#define LIBTOP_STATE_HALT 6
"unknown"
#define LIBTOP_STATE_UNKNOWN 7
};
(...)
}
Run Code Online (Sandbox Code Playgroud)
稍后在同一个文件中,LIBTOP_STATE_STUCK
映射到内核状态TH_STATE_UNINTERRUPTIBLE
:
/* Translate a mach state to a state in the state breakdown array. */
static int
libtop_p_mach_state_order(int state, long sleeptime)
{
switch (state) {
case TH_STATE_RUNNING:
return LIBTOP_STATE_RUN;
case TH_STATE_UNINTERRUPTIBLE:
return LIBTOP_STATE_STUCK;
(...)
}
Run Code Online (Sandbox Code Playgroud)
所以处于卡住状态的进程意味着进程/线程处于不可中断的等待状态,这是TH_STATE_UNINTERRUPTIBLE
内核结构中定义的方式thread_basic_info
(参见http://web.mit.edu/darwin/src/modules/xnu/osfmk/ man/thread_basic_info.html):
struct thread_basic_info
{
(...)
integer_t run_state;
(...)
};
Run Code Online (Sandbox Code Playgroud)
在哪里run_state
:
run_state:线程的运行状态。可能的值为:
(……)
- TH_STATE_UNINTERRUPTIBLE:线程处于不可中断的等待状态。
(……)
这通常是由进程等待 I/O 引起的,即进程已请求从磁盘或网络读取或写入,并等待系统调用返回(参见http://en.wikipedia.org /wiki/Sleep_%28operating_system%29#Uninterruptible_sleep或http://www.novell.com/support/kb/doc.php?id=7002725了解更多信息)。
(当不使用 BSD 选项时,就像在 Linux 中通常的情况一样,将ps
不间断睡眠显示为D状态。)
它是流程正常生命周期的一部分吗?
是的。什么是不正常的是进程停留在这种状态下很长一段时间。这是一个不好的迹象。
为什么要特别注意这个过程?
很难说。这通常是由于使用网络文件系统时磁盘活动繁重或连接性下降的 I/O 瓶颈造成的(根据我的经验,这是最常见的情况)。
(这是 Ask Different 中的一个相关问题:https : //apple.stackexchange.com/questions/58697/how-does-stuck-in-results-of-top-relate-to-not-responding-in-activity-米。)