Appearance
좀비 프로세스(Zombie Process) & 고아 프로세스(Orphan Process)
부모-자식 관계로 이루어진 프로세스 트리 구조에서 프로세스의 종료 및 회수(Reap) 과정이 올바르게 이루어지지 않을 때 발생하는 두 가지 대표적인 비정상 상태이다.
좀비 프로세스 (Zombie Process)
실행을 완료하여 종료되었지만, 부모 프로세스가 아직 자식의 종료 상태(Exit Status)를 회수하지 않아 시스템의 프로세스 테이블에 남아 있는 상태의 프로세스를 말한다.
- 발생 원인:
- 자식 프로세스가
exit()시스템 콜을 호출해 종료하면, 자원(메모리 등)은 해제되지만 프로세스 ID(PID)와 종료 상태 등 최소한의 정보는 커널의 프로세스 테이블에 남는다. - 부모 프로세스가
wait()또는waitpid()시스템 콜을 호출하여 이 정보를 읽어갈 때까지 자식은 좀비 상태로 머문다.
- 자식 프로세스가
- 문제점:
- 좀비 프로세스 자체는 CPU나 메모리를 거의 차지하지 않지만, PID를 점유하고 프로세스 테이블의 슬롯을 차지한다.
- 시스템의 최대 PID 개수는 제한되어 있으므로, 좀비 프로세스가 계속 누적되면 새로운 프로세스를 생성할 수 없게 되는 자원 고갈 문제가 발생한다.
- 해결 방안:
- 부모 프로세스에서 주기적으로
wait()계열 함수를 호출한다. SIGCHLD시그널 핸들러를 등록하여 비동기적으로 자식의 종료를 처리한다.
- 부모 프로세스에서 주기적으로
고아 프로세스 (Orphan Process)
자식 프로세스보다 부모 프로세스가 먼저 종료되어, 부모를 잃어버린 자식 프로세스를 말한다.
- 발생 원인:
- 자식이 아직 실행 중인데 부모가 먼저 정상 또는 비정상으로 종료될 경우 발생한다.
- 처리 방식 (OS의 개입):
- 운영체제는 고아 프로세스가 발생하면 이를 시스템의 최상위 프로세스(일반적으로 PID 1인
init또는systemd)의 자식으로 입양시킨다. - 입양된 고아 프로세스는 계속 실행되며, 나중에 이 프로세스가 종료되면 새로운 부모인
init프로세스가 대신wait()을 호출하여 좀비 프로세스가 되는 것을 막고 깔끔하게 정리(Reap)해 준다.
- 운영체제는 고아 프로세스가 발생하면 이를 시스템의 최상위 프로세스(일반적으로 PID 1인
- 문제점:
- 운영체제가 자동으로 처리해 주므로 고아 프로세스 자체가 시스템에 직접적인 악영향을 미치지는 않는다. 다만 의도치 않게 백그라운드에서 계속 자원을 소모하며 실행될 수 있다. (이를 활용하여 데몬(Daemon) 프로세스를 만들기도 한다)
요약 비교
| 특징 | 좀비 프로세스 (Zombie) | 고아 프로세스 (Orphan) |
|---|---|---|
| 상태 | 이미 종료됨 (프로세스 테이블에만 존재) | 현재 실행 중임 |
| 부모 상태 | 실행 중 (하지만 wait()을 호출하지 않음) | 이미 종료됨 |
| 시스템 영향 | PID 고갈 등 리소스 누수 위험 있음 | init 프로세스가 입양하여 자동 관리함 |