어떤 상황에서 프로세스가 X(죽음) 상태가 되나요?

어떤 상황에서 프로세스가 X(죽음) 상태가 되나요?

~에 따르면fs/proc/array.c:130에서 다음 배열은 다양한 프로세스 상태를 정의합니다.

/*
 * The task state array is a strange "bitmap" of
 * reasons to sleep. Thus "running" is zero, and
 * you can test for combinations of others with
 * simple bit tests.
 */
static const char * const task_state_array[] = {

    /* states in TASK_REPORT: */
    "R (running)",      /* 0x00 */
    "S (sleeping)",     /* 0x01 */
    "D (disk sleep)",   /* 0x02 */
    "T (stopped)",      /* 0x04 */
    "t (tracing stop)", /* 0x08 */
    "X (dead)",         /* 0x10 */
    "Z (zombie)",       /* 0x20 */
    "P (parked)",       /* 0x40 */

    /* states beyond TASK_REPORT: */
    "I (idle)",         /* 0x80 */
};

~에 따르면proc(5), 이 X상태는 커널 2.6.0에 추가되었습니다.

X Dead (리눅스 2.6.0부터)

x Dead(Linux 2.6.33~3.13에만 해당)

그리고 기반으로ps(1), X표시되지 않아야 합니다.

X는 죽었습니다(보여서는 안 됩니다)

나머지 소스코드를 보면 이렇습니다.커널에서 내부적으로 사용됩니다. 소스 파일에kernel/sched.core.c:4176, 한 의견은 간단하게 설명했습니다.

/*
 * A task struct has one reference for the use as "current".
 * If a task dies, then it sets TASK_DEAD in tsk->state and calls
 * schedule one last time. The schedule call will never return, and
 * the scheduled task must drop that reference.
 *
 * We must observe prev->state before clearing prev->on_cpu (in
 * finish_task), otherwise a concurrent wakeup can get prev
 * running on another CPU and we could rave with its RUNNING -> DEAD
 * transition, resulting in a double drop.
 */

그런 것 같아요필수의일부 경우에. 존재하다kernel/fork.c:424:

static void release_task_stack(struct task_struct *tsk)
{
    if (WARN_ON(tsk->state != TASK_DEAD))
        return;  /* Better to leak the stack than to free prematurely */

    account_kernel_stack(tsk, -1);
    free_thread_stack(tsk);
    tsk->stack = NULL;
#ifdef CONFIG_VMAP_STACK
    tsk->stack_vm_area = NULL;
#endif
}

TASK_DEAD프로세스가 종료될 때 커널이 최종적으로 프로세스를 파괴하기 전에 프로세스에 대해 설정된 것처럼 보이 task_struct므로 프로세스를 정리할 수 없는 커널 버그가 없는 한 프로세스 상태로 표시되어서는 안 됩니다. 게다가이 유인물이는 다음과 같은 아이디어를 강화합니다.

TASK_DEAD – 프로세스가 정리되고 작업이 삭제되는 중입니다.

그래서 내 진짜 질문은 다음과 같습니다.

어떤 상황에서 프로세스가 ps상태 X에 있다고 보고됩니까?

답변1

"X"로 표시되는 작업 상태는 가 TASK_DEAD아니지만종료 EXIT_DEAD상태. TASK_DEAD꼭 그렇진 않아보고 대상 국가, 그리고 동시에 EXIT_DEAD,실제로는 보이지 않아야 합니다..

EXIT_DEAD역할은 설명하는 것과 유사합니다 TASK_DEAD. 작업의 종료 상태는 삭제되기 직전에 설정됩니다 EXIT_DEAD.task_structrelease_taskde_thread,release_task그 자체, 그리고exit_notify.

아직 잠금상태를 자세히 확인하진 못했는데,독자는 변경된 프로세스 상태를 볼 수 있습니다EXIT_DEAD;그러나 한 프로세스가 다른 프로세스에서 그 상태를 볼 수 있는 가능성은 거의 없습니다 .

표시 여부에 관계없이 프로세스 가 완전히 종료되어 삭제되려고 하면 task_struct"X" 상태가 됩니다 .

관련 정보