~によると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_DEAD
。task_struct
release_task
de_thread
、release_task
それ自体とexit_notify
。
まだロック状態を詳しく確認していませんが、読者は変更されたプロセスの状態を見ることができますEXIT_DEAD
;しかし、あるプロセスが別のプロセスでその状態を見る可能性はほとんどありません。
表示されているかどうかにかかわらず、プロセスが完全に終了して削除されようとすると、task_struct
「X」状態になります。