✏️ 좀비(Zombie) 프로세스와 고아(Orphan) 프로세스
좀비(Zombie) 프로세스는 자식 프로세스가 부모 프로세스보다 먼저 종료된 프로세스를 의미합니다.
고아(Orphan) 프로세스는 부모 프로세스가 자식 프로세스보다 먼저 종료된 프로세스를 의미합니다.
💡 프로세스의 Creation & Termination
부모 프로세스는 fork() 시스템콜을 통해 새로운 자식 프로세스를 생성합니다.
fork() 시스템콜을 통해 생성된 자식 프로세스는 부모 프로세스를 복제하기 때문에 부모와 동일한 형태를 가집니다.
그리고 이후에 exec() 시스템콜을 호출하면, 생성한 프로세스의 메모리 공간을 새로운 프로그램으로 대체할 수 있습니다.
이러한 프로세스들은 크게 2가지 방식으로 실행됩니다.
- Parent와 Child가 Concurrently하게 실행됩니다.
- Parent는 wait() 시스템콜을 호출하여 Child가 terminate(종료) 될때까지 기다립니다.
위 설명과 같이, fork() 시스템콜을 통해 child가 생성되고, exec() 시스템콜을 호출하여 자식 프로세스의 메모리 공간을 새로운 프로그램으로 대체합니다.
그리고 parent는 wait() 시스템콜을 호출하여 자식이 exit() 될때까지 기다립니다.
exit() 시스템콜을 호출(또는 return) 할 때 반환된 자식 프로세스의 status는 wait() 시스템콜의 파라미터로 전달됩니다.
#include <sys/wait.h> // <sys/wait.h> 헤더 선언
pid_t wait (int *status) // 리턴값은 종료된 자식 프로세스의 pid
이렇게 자식 프로세스가 exit되면, 자식 프로세스가 사용하던 리소스(메모리 공간, I/O Buffer 등)를 반환하고 완전히 제거됩니다.
그러나, 이러한 흐름과는 다른 2가지 상황이 존재합니다.
💡 좀비(Zombie) 프로세스
좀비(Zombie) 프로세스는 자식(Child) 프로세스가 부모(Parent) 프로세스보다 먼저 종료된 프로세스를 지칭합니다.
이 내용은 위와 동일하지만, 다른 점이 하나 있습니다.
바로 부모 프로세스가 아직 wait 시스템콜을 호출하지 않은 상태입니다.
그렇기 때문에 자식 프로세스가 종료되어도, 사용하던 리소스를 반환하지 못하기 때문에 완전히 제거되지 못합니다.
(죽어도 사라지지 않는 좀비와 같아 이러한 이름이 붙은 것으로 보입니다.)
그렇기 때문에 이러한 상황을 대비하여 자식 프로세스가 먼저 종료되어도 커널은 최소한의 정보(pid, exit status 등)를 가지고 있습니다.
이후에 부모 프로세스가 wait() 시스템콜을 호출하여 종료 상태를 회수하면, 좀비 프로세스가 정상적으로 제거됩니다.
💡 고아(Orphan) 프로세스
고아(Orphan) 프로세스는 부모(Parent) 프로세스가 자식(Child) 프로세스보다 먼저 종료된 프로세스를 지칭합니다.
위와 반대의 상황입니다.
일반적인 경우, 부모 프로세스는 wait() 시스템콜을 통해 자식 프로세스가 종료될 때까지 기다립니다.
그러나 wait() 시스템콜을 호출하지 않고 부모가 먼저 종료되면 자식은 orphan 상태가 됩니다.
이 때, 자식 프로세스의 부모 프로세스가 제거되었기 때문에, 자식 프로세스의 새로운 부모는 init 프로세스가 됩니다.
(init은 최초에 커널이 자체적으로 생성하는 root 프로세스입니다.)
그렇기 때문에 새로운 부모 pid는 1로 변경됩니다.
init 프로세스는 기존의 부모 프로세스 대신 wait() 시스템콜을 호출하여 자식이 종료될 때까지 기다리고, 종료된다면 리소스를 회수하여 자식 프로세스 또한 정상적으로 종료 및 제거시킵니다.
⭐ 결론
- 좀비 프로세스는 자식 프로세스가 부모 프로세스보다 먼저 종료된 상태의 프로세스
- 커널이 자식 프로세스에 대한 최소한의 정보를 가지고 있음.
- 부모가 이후에 wait() 시스템콜을 호출하면 자원을 회수하고 정상적으로 제거 됨.
- 고아 프로세스는 부모 프로세스가 자식 프로세스보다 먼저 종료된 상태의 프로세스
- init 프로세스가 새로운 부모 프로세스가 됨.
- init 프로세스가 wait() 시스템콜을 호출 함.
- 자식 프로세스가 종료되면 정상적으로 자원을 반환 함.
github : https://github.com/tmdgh1592