卡住的过程:这是一个坏兆头吗?

ale*_*ail 26 osx process

有时有几个进程处于卡住状态。例如:

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_sleephttp://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-米。)

  • @mareoraft 在 OS X 中,在 `ps axug` 或 `ps -eo user,pid,stat,args` 的输出中带有“U”状态代码的那些。在 Linux 中,带有 'D' 状态代码的那些具有相同的 `ps` 命令。有关详细信息,请参阅“man ps”中的 state 关键字 (OS X) 或 PROCESS STATE CODES 部分 (Linux) 的说明。或者,在 OS X 中,您可以运行 `top` 并在 STATE 列中查找标记为 `stuck` 的进程。 (3认同)