답변:
SIGKILL은 운영 체제 / 커널에 의해 완전히 처리되므로 프로그램은 실제로 SIGKILL 신호를 수신하지 않습니다.
특정 프로세스에 대한 SIGKILL이 전송되면 커널의 스케줄러는 해당 프로세스에 사용자 공간 코드를 실행하기위한 CPU 시간을 더 이상 제공하지 않습니다. 스케줄러가이 결정을 내릴 때 프로세스에 다른 CPU / 코어에서 사용자 공간 코드를 실행하는 스레드가있는 경우 해당 스레드도 중지됩니다. (단일 코어 시스템에서는 훨씬 간단했습니다. 시스템의 유일한 CPU 코어가 스케줄러를 실행 중이면 정의에 따라 동시에 프로세스를 실행하지 않았습니다!)
프로세스 / 스레드가 SIGKILL시 커널 코드 (예 : 시스템 호출 또는 메모리 매핑 된 파일과 관련된 I / O 작업)를 실행하는 경우 약간 까다로워집니다. 일부 시스템 호출 만 인터럽트 가능하므로 커널은 시스템 호출 또는 I / O 작업이 해결 될 때까지 내부적으로 프로세스를 특수 "죽음"상태로 표시합니다. 이를 해결하기위한 CPU 시간은 평소대로 예약됩니다. 인터럽트 가능한 시스템 호출 또는 I / O 작업은 호출 한 프로세스가 적절한 중지 지점에서 종료되고 있는지 확인하고이 경우 일찍 종료됩니다. 무정전 조작이 완료되고 사용자 공간 코드로 리턴하기 직전에 "죽음"상태를 점검합니다.
프로세스 내 커널 루틴이 해결되면 프로세스 상태가 "죽음"에서 "죽음"으로 변경되고 프로그램이 정상적으로 종료 될 때와 유사하게 커널이 정리를 시작합니다. 정리가 완료되면 128 개 이상의 결과 코드가 할당되어 (신호에 의해 프로세스가 종료되었음을 나타냅니다. 지저분한 세부 사항은이 답변 참조 ) 프로세스가 "좀비"상태로 전환됩니다. . 종료 된 프로세스의 부모에게 SIGCHLD 신호가 통지됩니다.
결과적으로 프로세스 자체는 실제로 SIGKILL을 수신 한 정보를 처리 할 기회를 얻지 못합니다.
프로세스가 "좀비"상태 인 경우 프로세스가 이미 종료되었음을 의미하지만 wait(2)
시스템 호출을 사용하여 종료 된 프로세스의 종료 코드를 읽음으로써 상위 프로세스가 아직이를 인식하지 못했습니다 . 기본적으로 좀비 프로세스가 더 이상 소비하는 유일한 리소스는 프로세스 테이블에 PID, 종료 코드 및 프로세스 종료시 프로세스의 다른 "핵심 통계"를 보유하는 슬롯입니다.
상위 프로세스가 하위 프로세스보다 먼저 종료 된 경우 독립된 하위 프로세스는 PID # 1에 의해 자동으로 채택되며, 이는 wait(2)
고아 프로세스가 좀비로 고착되지 않도록 계속 호출해야하는 특별한 의무가 있습니다.
좀비 프로세스를 지우는 데 몇 분이 걸리면 좀비의 상위 프로세스가 어려움을 겪고 있거나 제대로 작동하지 않는 것입니다.
운영 체제와 같은 유닉스에서 좀비 문제가있는 경우에 무엇을해야하는지에 놀림조의 설명이있다 : "그들은 이미 죽은 것처럼 당신은 좀비 스스로 아무것도 할 수 없습니다 대신. 악한 좀비 마스터를 죽일! " (즉, 성가신 좀비의 부모 과정)
ps
. 'S'는 신호를 전달하기 위해 커널이 취소 할 수있는 I / O 대기 및 그렇지 않은 경우 'D'입니다.