상위 프로세스가 죽은 하위 프로세스의 종료 상태를 수신할 때 wait
실제로 하위 프로세스의 메모리를 재할당하고 프로세스 테이블에서 제거하는 사람이 누구인지 설명할 수 있습니까?
답변1
프로세스 테이블과 메모리 맵을 조작하는 것은 항상 커널의 작업입니다. 프로세스가 시스템 호출을 하면 커널이 조치를 취합니다. 프로세스가 종료되면 프로세스가 사용한 모든 리소스(프로세스 테이블의 항목을 제외한 메모리 포함)가 삭제됩니다. 이것이 _exit
시스템 호출이 수행하는 작업입니다. 그런 다음 상위 프로세스가 wait
또는 를 호출할 때 waitpid
해당 시스템 호출 작업의 일부는 프로세스 테이블 항목을 정리하는 것입니다. 상위 프로세스는 wait
필요할 때 호출하기로 결정할 수 있습니다(상위 프로세스가 이면 거의 항상 init
호출 wait
합니다).
답변2
커널은 상위 프로세스가 자신이 분기하는 하위 프로세스의 결과를 알고 싶어한다고 가정합니다. 자식 프로세스가 종료되면 자동으로 SIGCHLD
부모 프로세스에 신호를 보냅니다. 상위 프로세스가 명시적으로 SIGCHLD
신호를 무시하면 하위 프로세스는 즉시 정리되고 완전히 제거됩니다(그리고 좀비 프로세스가 되지 않습니다). 그렇지 않으면, 상위 프로세스가 wait
하위 프로세스로부터 종료 상태를 검색하는 함수 중 하나를 호출할 때까지 하위 프로세스는 좀비 프로세스가 됩니다 .
상태가 검색되지 않으면 자식은 좀비로 남습니다. 그러나 상위 프로세스가 하위 프로세스보다 먼저 종료되면 하위 프로세스가 init
채택되어(프로세스 1) 즉시 상태를 수집하여 좀비 프로세스를 효과적으로 제거합니다.