프로세스 테이블에서 좀비 프로세스 제거

프로세스 테이블에서 좀비 프로세스 제거

상위 프로세스가 죽은 하위 프로세스의 종료 상태를 수신할 때 wait실제로 하위 프로세스의 메모리를 재할당하고 프로세스 테이블에서 제거하는 사람이 누구인지 설명할 수 있습니까?

답변1

프로세스 테이블과 메모리 맵을 조작하는 것은 항상 커널의 작업입니다. 프로세스가 시스템 호출을 하면 커널이 조치를 취합니다. 프로세스가 종료되면 프로세스가 사용한 모든 리소스(프로세스 테이블의 항목을 제외한 메모리 포함)가 삭제됩니다. 이것이 _exit시스템 호출이 수행하는 작업입니다. 그런 다음 상위 프로세스가 wait또는 를 호출할 때 waitpid해당 시스템 호출 작업의 일부는 프로세스 테이블 항목을 정리하는 것입니다. 상위 프로세스는 wait필요할 때 호출하기로 결정할 수 있습니다(상위 프로세스가 이면 거의 항상 init호출 wait합니다).

답변2

커널은 상위 프로세스가 자신이 분기하는 하위 프로세스의 결과를 알고 싶어한다고 가정합니다. 자식 프로세스가 종료되면 자동으로 SIGCHLD부모 프로세스에 신호를 보냅니다. 상위 프로세스가 명시적으로 SIGCHLD신호를 무시하면 하위 프로세스는 즉시 정리되고 완전히 제거됩니다(그리고 좀비 프로세스가 되지 않습니다). 그렇지 않으면, 상위 프로세스가 wait하위 프로세스로부터 종료 상태를 검색하는 함수 중 하나를 호출할 때까지 하위 프로세스는 좀비 프로세스가 됩니다 .

상태가 검색되지 않으면 자식은 좀비로 남습니다. 그러나 상위 프로세스가 하위 프로세스보다 먼저 종료되면 하위 프로세스가 init채택되어(프로세스 1) 즉시 상태를 수집하여 좀비 프로세스를 효과적으로 제거합니다.

관련 정보