Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

리눅스 좀비 프로세스와 고아 프로세스 완벽 가이드

리눅스 시스템에서는 프로세스의 종료 방식과 부모-자식 관계에 따라 여러 특수한 상태의 프로세스가 존재합니다. 그중 대표적인 것이 좀비 프로세스(Zombie Process), 고아 프로세스(Orphan Process), 그리고 데몬 프로세스(Daemon Process)입니다. 이 글에서는 각 개념과 동작 원리를 자세히 살펴보겠습니다.

좀비 프로세스(Zombie Process)

좀비 프로세스는 실행이 이미 완료되었음에도 불구하고 프로세스 테이블에는 여전히 항목으로 남아 있는 프로세스를 말합니다. 주로 자식 프로세스에서 발생하는데, 그 이유는 부모 프로세스가 자식의 종료 상태(exit status)를 아직 읽지 않았기 때문입니다.

부모 프로세스가 wait() 시스템 콜을 호출하여 자식의 종료 상태를 확인하면, 좀비 프로세스는 프로세스 테이블에서 제거됩니다. 이 과정을 좀비 프로세스 수거(Reaping)라고 부릅니다.

리눅스 좀비 프로세스와 고아 프로세스 완벽 가이드

좀비 프로세스는 CPU나 메모리 같은 시스템 자원을 거의 사용하지 않지만, 프로세스 ID(PID)는 계속 점유하고 있다는 점이 문제입니다. 좀비 프로세스가 대량으로 발생하면 사용 가능한 PID가 모두 고갈되어, 새로운 프로세스를 생성할 수 없는 심각한 상황이 초래될 수 있습니다.

터미널에서 ps 또는 top 명령어를 사용하면 좀비 프로세스를 확인할 수 있으며, 일반적으로 상태 필드에 Z(defunct)로 표시됩니다.

고아 프로세스(Orphan Process)

고아 프로세스란 부모 프로세스가 먼저 종료되었거나 작업을 마쳤는데도 여전히 실행 중인 프로세스를 의미합니다. 고아 프로세스는 의도적으로 만들어질 수도 있고, 예기치 않게 발생할 수도 있습니다.

의도적 고아 프로세스

의도적으로 고아가 된 프로세스는 사용자의 개입 없이 백그라운드에서 독립적으로 실행됩니다. 이는 무기한 실행되는 서비스를 시작하거나, 사용자가 자리를 비운 사이에 오랜 시간이 걸리는 작업을 완료해야 할 때 흔히 활용되는 방법입니다.

비의도적 고아 프로세스

반면 부모 프로세스가 비정상적으로 크래시(crash)되거나 강제로 종료되면, 자식 프로세스는 의도치 않게 고아가 됩니다. 이런 비의도적 고아 프로세스는 프로세스 그룹(Process Group) 메커니즘을 활용하면 상당 부분 예방할 수 있습니다.

참고로 리눅스에서는 부모를 잃은 고아 프로세스가 init 프로세스(PID 1)의 자식으로 자동 편입되며, init은 주기적으로 wait()를 호출하여 고아 프로세스의 종료 상태를 정리해 줍니다. 덕분에 고아 프로세스가 좀비처럼 시스템에 누적되는 것을 막을 수 있습니다.