프로그램을 종료 하면 killall -9 name
상태가 좀비가 됩니다. 몇 분 후에 실제로 중지되었습니다. 그렇다면 이 몇 분 동안 무슨 일이 일어난 걸까요?
답변1
SIGKILL은 운영 체제/커널에 의해 전적으로 처리되기 때문에 프로그램은 실제로 SIGKILL 신호를 수신하지 않습니다.
특정 프로세스에 대해 SIGKILL이 전송되면 커널 스케줄러는 해당 프로세스에 사용자 공간 코드를 실행하는 데 더 많은 CPU 시간을 제공하는 것을 즉시 중지합니다. 스케줄러가 이 결정을 내릴 때 프로세스에 다른 CPU/코어에서 사용자 공간 코드를 실행하는 스레드가 있는 경우 해당 스레드도 중지됩니다. (단일 코어 시스템에서는 이것이 훨씬 더 간단했습니다. 시스템의 유일한 CPU 코어가 스케줄러를 실행하는 경우 정의상 해당 프로세스를 동시에 실행하지 않을 것입니다!)
SIGKILL이 호출될 때 프로세스/스레드가 커널 코드(예: 메모리 매핑 파일과 관련된 시스템 호출 또는 I/O 작업)를 실행하는 경우 상황이 조금 더 까다로워집니다. 특정 시스템 호출만 인터럽트 가능하므로 커널은 내부적으로 프로세스를 다음과 같이 표시합니다. 시스템 호출이나 I/O 작업이 해결될 때까지 특별한 "죽은" 상태에 있습니다. 이러한 문제를 해결하기 위한 CPU 시간은 평소대로 할당됩니다. 인터럽트 가능한 시스템 호출 또는 I/O 작업은 이를 호출하는 프로세스가 적절한 중지 지점에서 종료되었는지 여부를 확인하고 이 경우 일찍 종료됩니다. 중단되지 않은 작업은 완료될 때까지 실행되며 사용자 공간 코드로 돌아가기 전에 "죽은" 상태를 확인합니다.
프로세스 내 커널 루틴이 해결되면 프로세스 상태가 "dead"에서 "dead"로 변경되고 커널은 프로그램이 정상적으로 종료될 때와 유사하게 이를 정리하기 시작합니다. 정리가 완료되면 128보다 큰 결과 코드가 할당됩니다(프로세스가 신호에 의해 종료되었음을 나타냄).혼란스러운 세부 사항은 이 답변을 참조하십시오.), 프로세스는 "좀비" 상태로 변환됩니다. 종료된 프로세스의 상위 프로세스는 SIGCHLD 신호 알림을 받습니다.
따라서 프로세스 자체는 수신한 SIGKILL 메시지를 실제로 처리할 기회가 전혀 없습니다.
프로세스가 "좀비" 상태에 있다는 것은 프로세스가 종료되었지만 해당 부모 프로세스가 wait(2)
시스템 호출을 사용하여 종료된 프로세스의 종료 코드를 읽어 이를 확인하지 않았음을 의미합니다. 기본적으로 좀비 프로세스가 소비하는 유일한 리소스는 프로세스가 종료될 때 프로세스의 PID, 종료 코드 및 기타 프로세스의 "중요한 통계"를 보유하는 프로세스 테이블의 슬롯입니다.
wait(2)
상위 프로세스가 하위 프로세스보다 먼저 종료되면 고아 프로세스가 좀비로 계속 존재하지 않도록 계속 호출해야 하는 특별한 책임이 있는 PID #1에 의해 고아 프로세스가 자동으로 채택됩니다 .
좀비 프로세스를 지우는 데 몇 분이 걸리는 경우 이는 해당 프로세스가부모좀비 프로세스가 어려움을 겪고 있거나 제대로 작동하지 않습니다.
다음은 유닉스 계열 운영 체제에서 좀비 문제에 대해 무엇을 해야 하는지에 대한 농담 설명입니다. “좀비는 이미 죽었기 때문에 좀비 자체에 대해서는 아무것도 할 수 없습니다.사악한 좀비 마스터를 처치하세요!"(즉, 귀찮은 좀비의 부모 프로세스)