~에 따르면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_struct
release_task
de_thread
,release_task
그 자체, 그리고exit_notify
.
아직 잠금상태를 자세히 확인하진 못했는데,독자는 변경된 프로세스 상태를 볼 수 있습니다EXIT_DEAD
;그러나 한 프로세스가 다른 프로세스에서 그 상태를 볼 수 있는 가능성은 거의 없습니다 .
표시 여부에 관계없이 프로세스 가 완전히 종료되어 삭제되려고 하면 task_struct
"X" 상태가 됩니다 .