좀비 프로세스는 Unix/Linux 시스템에서 생성됩니다. kill
명령을 통해 삭제할 수 있습니다 .
하지만 Linux에는 좀비 프로세스를 처리하기 위한 기본 제공 정리 메커니즘이 있습니까?
답변1
좀비 프로세스가 종료되었습니다. 당신은 그들을 죽일 수 없습니다. 명령 kill
이나 시스템 호출은 좀비 프로세스에 영향을 미치지 않습니다. (좀비를 쫓아낼 수는 있지만 kill
나중에 살펴보겠지만 좀비가 아닌 부모를 쏴야 합니다.)
좀비 프로세스는 실제 프로세스가 아니며 프로세스 테이블의 항목일 뿐입니다. 좀비 프로세스와 관련된 다른 리소스는 없습니다. 메모리나 실행 코드가 없으며 열려 있는 파일도 보유하지 않습니다.
프로세스가 종료되면 다른 모든 리소스가 정리된 후 마지막으로 사라지는 것은 프로세스 테이블의 항목입니다. 이 항목은 유지되어 좀비를 형성하여 상위 프로세스가 하위 프로세스의 종료 상태를 추적할 수 있도록 합니다. 부모는 다음 중 하나를 호출하여 종료 상태를 읽습니다.wait
시스템 호출 family 이 시점에서 좀비는 사라진다. wait
전화가 왔다고 하네요보상The Child는 좀비가 죽었으나 어떤 면에서는 아직 완전히 사후 세계에 있지 않다는 비유를 확장합니다. 부모는 또한 (SIGCHLD 신호를 무시하거나 다음을 호출하여) 상관하지 않음을 나타낼 수도 있습니다.sigaction
플래그 SA_NOCLDWAIT
), 이 경우 프로세스 테이블의 항목은 하위 프로세스가 종료되는 즉시 삭제됩니다.
따라서 좀비는 프로세스가 종료되고 그 부모가 아직 호출되지 않은 경우에만 존재합니다 wait
. 이 상태는 상위 프로세스가 계속 실행되는 동안에만 지속됩니다. 부모 프로세스가 자식 프로세스보다 먼저 죽거나 자식 프로세스 상태를 읽지 않고 죽으면 좀비 프로세스의 부모 프로세스는 PID 1을 가진 프로세스로 설정됩니다.init
. 그 작업 중 하나 init
는 wait
호출을 반복하여 부모가 남겨둔 좀비 프로세스를 선택하는 것입니다.
답변2
kill
이미 죽었기 때문에 좀비 프로세스 가 아닙니다 .
wait
종료 상태를 수집하려면 좀비 프로세스를 상위 프로세스에서 편집해야 합니다 .
Linux의 유일한 "내장 정리 메커니즘"은 하위 프로세스의 종료 상태를 수집하기 전에 상위 프로세스가 종료되는 모든 상황에 적용됩니다. 이 경우 각 하위 프로세스는 process 에 의해 상속되며 init
, process 는 wait
하위 프로세스의 종료 상태를 수집하고 프로세스 테이블에서 해당 항목을 삭제합니다.
답변3
프로세스의 부모가 죽으면 프로세스는 좀비 프로세스인지 여부에 관계없이 고아가 됩니다. 고아들은 어떻게 되나요? 그들은 이름이 새로운 부모입니다 init
. 수집한 모든 고아에 대해 init
조치를 취하여 wait
고아(및 좀비)를 수확합니다.
답변4
아니요, 좀비 정리 메커니즘이 내장되어 있지 않습니다. 부모가 죽으면 좀비들은 좀비 천국으로 들어갑니다. 그때까지 운영 체제는 종료 상태를 상위 항목으로 반환하도록 합니다.