どのような状況でプロセスが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 (Linux 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_DEADtask_structrelease_taskde_threadrelease_taskそれ自体exit_notify

まだロック状態を詳しく確認していませんが、読者は変更されたプロセスの状態を見ることができますEXIT_DEAD;しかし、あるプロセスが別のプロセスでその状態を見る可能性はほとんどありません。

表示されているかどうかにかかわらず、プロセスが完全に終了して削除されようとすると、task_struct「X」状態になります。

関連情報