질문의 가장 높은 순위 답변에서 :
컴퓨터가 0부터 계산하기 시작하면 init 프로세스의 PID가 1인 이유는 무엇입니까?
각 프로세스에는 PPID(부모)가 있다고 명시되어 있습니다.
그러나 나는 부모가 없는 프로세스가 많다는 것을 읽었습니다(나중에 링크 제공 예정).
누구든지 모순되는 진술을 합리적인 맥락에 넣을 수 있습니까?
답변1
프로세스에는 항상 상위 프로세스가 있습니다. 그러나 기존 프로세스가 종료될 때 새 상위 프로세스가 되는 프로세스가 반드시 PID 1일 필요는 없습니다.Linux가 수행하는 방법은 다음과 같습니다.:
/*
* When we die, we re-parent all our children, and try to:
* 1. give them to another thread in our thread group, if such a member exists
* 2. give it to the first ancestor process which prctl'd itself as a
* child_subreaper for its children (like a service manager)
* 3. give it to the init process (PID 1) in our pid namespace
*/
static struct task_struct *find_new_reaper(struct task_struct *father,
struct task_struct *child_reaper)
{
struct task_struct *thread, *reaper;
thread = find_alive_thread(father);
if (thread)
return thread;
if (father->signal->has_child_subreaper) {
unsigned int ns_level = task_pid(father)->level;
/*
* Find the first ->is_child_subreaper ancestor in our pid_ns.
* We can't check reaper != child_reaper to ensure we do not
* cross the namespaces, the exiting parent could be injected
* by setns() + fork().
* We check pid->level, this is slightly more efficient than
* task_active_pid_ns(reaper) != task_active_pid_ns(father).
*/
for (reaper = father->real_parent;
task_pid(reaper)->level == ns_level;
reaper = reaper->real_parent) {
if (reaper == &init_task)
break;
if (!reaper->signal->is_child_subreaper)
continue;
thread = find_alive_thread(reaper);
if (thread)
return thread;
}
}
return child_reaper;
}
답변2
프로세스의 부모가 종료되면 해당 프로세스는 "부모가 없다"고 말할 수 있습니다. 이 경우 PPID
의 PID는 1로 설정됩니다 init
.
모든 프로세스는 $STATUS
종료 시 값을 반환합니다. 부모는 이 값을 사용하여 작업을 수행할 수 있지만 반드시 free
메모리가 $STATUS
저장되어 있고 커널에서 프로세스 데이터를 해제해야 합니다.