리눅스가 좀비 프로세스를 처리하는 방법


12

좀비 프로세스는 Unix / Linux 시스템에서 생성됩니다. kill명령을 통해 제거 할 수 있습니다 .

그러나 좀비 프로세스를 처리하기 위해 Linux에 내장 된 정리 메커니즘이 있습니까?

답변:


18

좀비 프로세스는 이미 죽었습니다. 당신은 그들을 죽일 수 없습니다. kill명령 또는 시스템 호출은 좀비 프로세스에 영향을주지 않습니다. (좀비를 버릴 kill수는 있지만 잠시 후에 보 겠지만 좀비가 아닌 부모를 쏴야합니다.)

좀비 프로세스는 실제로 프로세스가 아니며 프로세스 테이블의 항목 일뿐입니다. 좀비 프로세스와 관련된 다른 리소스는 없습니다. 메모리 나 실행중인 코드가 없으며 열려있는 파일이 없습니다.

프로세스가 종료되면 다른 모든 리소스를 정리 한 후 마지막으로 수행해야 할 것은 프로세스 테이블의 항목입니다. 이 항목은 좀비를 형성하여 부모 프로세스가 자식의 종료 상태를 추적 할 수 있도록 유지됩니다. 부모 wait는 syscall 패밀리 중 하나를 호출하여 종료 상태를 읽습니다 . 이 시점에서 좀비가 사라집니다. 전화 wait는 아이 를 거두어 죽은 좀비의 은유를 확장하지만 어떤 식 으로든 여전히 내세로 완전히 처리되지는 않는다고합니다. 부모는 SIGCHLD 신호를 무시하거나 플래그 로 호출 sigaction하여 상관하지 않음을 나타낼 수도 있습니다 SA_NOCLDWAIT.이 경우 자식이 죽으면 프로세스 테이블의 항목이 즉시 삭제됩니다.

따라서 좀비는 프로세스가 종료되고 해당 부모가 wait아직 호출 되지 않은 경우에만 존재합니다 . 이 상태는 부모가 여전히 실행중인 동안에 만 지속될 수 있습니다. 부모가 자식보다 먼저 죽거나 자식의 상태를 읽지 않고 죽으면 좀비의 부모 프로세스는 PID 1 인 프로세스로 설정됩니다 init. 작업 중 하나는 루프 init를 호출 wait하여 부모가 남긴 좀비 프로세스를 얻는 것입니다.


6

당신은 kill이미 죽었 기 때문에 좀비 프로세스 가 아닙니다 .

좀비 프로세스는 wait부모가 종료해야하므로 종료 상태를 수집해야합니다.

리눅스에 존재하는 유일한 "내장 정리 메커니즘"은 부모 프로세스가 자식 종료 상태를 수집하기 전에 죽는 경우에 효과적입니다. 이 경우 각 하위는 init프로세스에서 상속되며, 하위 프로세스 wait는 종료 상태를 수집하고 프로세스 테이블에서 해당 항목을 제거합니다.


3

프로세스의 부모가 죽 자마자 프로세스는 고아가되어 좀비인지 아닌지를 무시합니다. 고아는 어떻게 되나요? 그들은이라는 새로운 부모를 얻습니다 init. init것이다 wait그것을 따라서 고아 베기, 수집하는 각 고아에 (즉,도 아니라 좀비일지도 모른다).


1
제 정확한이기 때문에, init죽이지 않는 어떤 과정을. wait자녀의 신분을 수집하는 것만 입니다.
chrk

1
@chrk, Philipp : 일반적인 용어는 reap 입니다.
Gilles 'SO- 악마 그만'

1

아니요, 좀비를위한 청소 메커니즘이 내장되어 있지 않습니다. 좀비는 부모가 죽으면 좀비 천국으로갑니다. 그때까지 OS는 종료 상태를 상위로 리턴하도록 유지합니다.


그래서 .. 이것이 메모리 등의 부정적인 영향을 미치지 않습니까?

1
실제로, 좀비의 부모가 죽으면 init과정이 wait

아니요, 프로세스 테이블의 항목을 제외하고 프로세스에 할당 된 모든 리소스가 해제됩니다.
unxnut
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.