[unix] 멈춤 과정 : 나쁜 징조입니까?

때때로 일부 프로세스가 멈춤 상태에 있습니다. 예를 들면 다음과 같습니다.

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

프로세스의 정상적인 수명주기의 일부입니까? 왜이 과정이 특히 그렇습니까?

정확히 무엇을 의미합니까?



답변

반드시 나쁜 징조는 아니지만 마지막 질문에 먼저 대답하겠습니다.

정확히 무엇을 의미합니까?

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
        };
(...)
}

같은 파일에서 나중에 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;
(...)
}

따라서 멈춤 상태의 프로세스는 프로세스 / 스레드가 인터럽트 불가능한 대기 상태에 있음을 의미하며 , 이는 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 )

BSD 옵션을 사용하지 않으면 일반적으로 Linux에서 ps와 같이 무정전 절전 모드가 D 상태로 표시됩니다.

정상적인 프로세스 수명주기의 일부입니까?

그렇습니다. 정상적이지 않은 것은 프로세스 가이 상태를 오랫동안 유지 한다는 것입니다. 그건 나쁜 로그인합니다.

왜이 과정이 특히 그렇습니까?

말하기 어렵다. 일반적으로 네트워크 파일 시스템을 사용할 때 디스크 활동이 많거나 연결 성능이 저하되는 I / O 병목 현상이 발생합니다 (가장 경험상 가장 일반적인 시나리오).

(이것은 Ask Different의 관련 질문입니다 : /apple/58697/how-does-stuck-in-results-of-top-relate-to-not-responding-in-activity- m )


답변