web-dev-qa-db-ja.com

行き詰まったプロセス:それは悪い兆候ですか?

いくつかのプロセスがスタックした状態になることがあります。例えば:

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

プロセスの通常のライフサイクルの一部ですか?特にこのプロセスはなぜですか?

正確にはどういう意味ですか?

24
alecail

これは必ずしも悪い兆候ではありませんが、最初の最後の質問に答えさせてください。

正確にはどういう意味ですか?

topソースコード( http://www.opensource.Apple.com/release/mac-os-x-1082/ から) stuck状態は識別子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
        };
(...)
}

後で同じファイルで、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;
(...)
}

したがって、stuck状態のプロセスは、プロセス/スレッドが割り込み不可能な待機状態であることを意味します。カーネル構造体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_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 詳細については) 。

(通常、Linuxの場合のようにBSDオプションを使用しない場合、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-m 。)

39
jaume