프로그램이 SIGKILL 신호를 보낼 때 무엇을합니까?


39

killall -9 name프로그램을 죽일 때 상태는 좀비가됩니다. 몇 분 후, 그것은 정말로 멈췄습니다. 그렇다면 몇 분 동안 무슨 일이 일어나고 있습니까?

답변:


66

SIGKILL은 운영 체제 / 커널에 의해 완전히 처리되므로 프로그램은 실제로 SIGKILL 신호를 수신하지 않습니다.

특정 프로세스에 대한 SIGKILL이 전송되면 커널의 스케줄러는 해당 프로세스에 사용자 공간 코드를 실행하기위한 CPU 시간을 더 이상 제공하지 않습니다. 스케줄러가이 결정을 내릴 때 프로세스에 다른 CPU / 코어에서 사용자 공간 코드를 실행하는 스레드가있는 경우 해당 스레드도 중지됩니다. (단일 코어 시스템에서는 훨씬 간단했습니다. 시스템의 유일한 CPU 코어가 스케줄러를 실행 중이면 정의에 따라 동시에 프로세스를 실행하지 않았습니다!)

프로세스 / 스레드가 SIGKILL시 커널 코드 (예 : 시스템 호출 또는 메모리 매핑 된 파일과 관련된 I / O 작업)를 실행하는 경우 약간 까다로워집니다. 일부 시스템 호출 만 인터럽트 가능하므로 커널은 시스템 호출 또는 I / O 작업이 해결 될 때까지 내부적으로 프로세스를 특수 "죽음"상태로 표시합니다. 이를 해결하기위한 CPU 시간은 평소대로 예약됩니다. 인터럽트 가능한 시스템 호출 또는 I / O 작업은 호출 한 프로세스가 적절한 중지 지점에서 종료되고 있는지 확인하고이 경우 일찍 종료됩니다. 무정전 조작이 완료되고 사용자 공간 코드로 리턴하기 직전에 "죽음"상태를 점검합니다.

프로세스 내 커널 루틴이 해결되면 프로세스 상태가 "죽음"에서 "죽음"으로 변경되고 프로그램이 정상적으로 종료 될 때와 유사하게 커널이 정리를 시작합니다. 정리가 완료되면 128 개 이상의 결과 코드가 할당되어 (신호에 의해 프로세스가 종료되었음을 나타냅니다. 지저분한 세부 사항은이 답변 참조 ) 프로세스가 "좀비"상태로 전환됩니다. . 종료 된 프로세스의 부모에게 SIGCHLD 신호가 통지됩니다.

결과적으로 프로세스 자체는 실제로 SIGKILL을 수신 한 정보를 처리 할 기회를 얻지 못합니다.

프로세스가 "좀비"상태 인 경우 프로세스가 이미 종료되었음을 의미하지만 wait(2)시스템 호출을 사용하여 종료 된 프로세스의 종료 코드를 읽음으로써 상위 프로세스가 아직이를 인식하지 못했습니다 . 기본적으로 좀비 프로세스가 더 이상 소비하는 유일한 리소스는 프로세스 테이블에 PID, 종료 코드 및 프로세스 종료시 프로세스의 다른 "핵심 통계"를 보유하는 슬롯입니다.

상위 프로세스가 하위 프로세스보다 먼저 종료 된 경우 독립된 하위 프로세스는 PID # 1에 의해 자동으로 채택되며, 이는 wait(2)고아 프로세스가 좀비로 고착되지 않도록 계속 호출해야하는 특별한 의무가 있습니다.

좀비 프로세스를 지우는 데 몇 분이 걸리면 좀비의 상위 프로세스가 어려움을 겪고 있거나 제대로 작동하지 않는 것입니다.

운영 체제와 같은 유닉스에서 좀비 문제가있는 경우에 무엇을해야하는지에 놀림조의 설명이있다 : "그들은 이미 죽은 것처럼 당신은 좀비 스스로 아무것도 할 수 없습니다 대신. 악한 좀비 마스터를 죽일! " (즉, 성가신 좀비의 부모 과정)


5
SIGKILL이 전송 될 때 프로세스가 커널 호출 (예 : I / O 수행)에 있으면 어떻게됩니까?
gidds

9
@gidds SIGKILL을 실행하기 위해 I / O가 취소되거나 I / O가 완료 될 때까지 SIGKILL이 지연됩니다. 이것은 'S'와 'D'슬립 상태의 차이점입니다 ps. 'S'는 신호를 전달하기 위해 커널이 취소 할 수있는 I / O 대기 및 그렇지 않은 경우 'D'입니다.
zwol

6
일정이 프로세스 CPU 시간을 즉시 중단한다고 말하는 것은 전적으로 정확하지 않습니다. 신호 처리의 커널 측은 여전히 ​​해당 프로세스에서 실행되지만 프로세스는 커널 코드 만 실행하므로 프로그램이 신호를 수신하지 않는다고 말할 때 적절합니다. 프로세스는 대부분의 리소스 정리 (파일 열기, 가상 메모리 등)를 담당하는 커널 코드를 실행합니다.이 정리 코드의 마지막 단계는 프로세스 상태를 좀비로 변경하고 스케줄러를 호출하는 것입니다. 그런 다음 다시 예약되지 않습니다.
kasperd

4
@gidds 최소한 4 가지 상태가 프로세스에있을 수 있습니다. 현재 커널 코드를 실행 중이거나 3 가지 다른 슬립 상태 중 하나에서 슬립 상태 일 수 있습니다. 슬립 상태는 치명적인 신호를 제외하고 인터럽트 가능, 인터럽트 불가능 또는 인터럽트 불가능 상태 일 수 있습니다. 중단 할 수없는 수면 상태 인 경우, 필요한만큼 잠자기 상태로 유지되며 깨어 난 후에는 사망 할 수 있습니다. 다른 두 가지 절전 상태 중 하나에 있으면 사용 가능한 CPU가 확보되는 즉시 즉시 깨어나고 예약됩니다.
kasperd

2
@gidds 다음에 일어날 일은 커널 코드에 달려 있습니다. 이미 실행 중이거나 먼저 깨어 났는지 여부에 관계없이 당시 커널 코드 실행을 시작할 수 있습니다. 그리고 커널 코드는 프로세스가 죽고 그에 따라 작동하도록 지시 받았다는 사실을 알아 차릴 책임이 있습니다. 대부분의 경우 커널 코드에서 처리하는 적절한 방법은 실행중인 함수에서 오류를 반환하는 것입니다. 커널 호출 스택이 풀리면 신호 처리 코드가 사용자 모드로 돌아 가기 직전에 인수 할 수 있습니다.
kasperd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.