IT/운영체제

⚙️ [운영체제] 고아 프로세스(Orphan Process)와 좀비 프로세스(Zombie Process)

BlogFlow 2025. 6. 26. 18:00
반응형

[운영체제 목차 바로가기]

3️⃣ 프로세스 관리 - 부모 프로세스와 자식 프로세스 관계

📌 고아 프로세스와 좀비 프로세스 (Orphan Process & Zombie Process)


운영체제에서 프로세스는 실행 중인 프로그램으로, 부모-자식 관계를 기반으로 트리 구조를 형성한다.

이 구조 속에서 정상적인 생성과 종료 외에도, 부모나 자식이 비정상적으로 종료되는 경우

시스템 내에는 고아 프로세스좀비 프로세스가 발생할 수 있다.

이 두 개념은 프로세스 생명주기 관리, 자원 회수, 시스템 안정성 유지와 밀접하게 관련되어 있다.


1️⃣ 고아 프로세스 (Orphan Process)

✅ 정의

고아 프로세스란, 부모 프로세스가 먼저 종료되었지만 자식 프로세스는 아직 실행 중인 상태를 말한다.

이때 운영체제는 고아 상태가 된 자식 프로세스를 init/systemd에게 위임하여 안정적으로 관리되도록 한다.

✅ 발생 상황

  • 부모가 정상 종료되거나, 강제 종료되었는데
  • 자식 프로세스는 작업을 마치지 않고 계속 실행 중일 때 발생

✅ 처리 방식 (Linux 기준)

  • 커널은 고아가 된 자식의 부모 PID (PPID)를 1번 프로세스(systemd 또는 init)로 변경
  • 시스템 초기화 프로세스는 이 고아 프로세스의 종료 상태 수거(wait)까지 책임지게 된다

✅ 예시 시나리오

int main() {
    if (fork() > 0) {
        // 부모는 바로 종료
        exit(0);
    } else {
        sleep(10); // 자식은 10초간 실행 유지
        printf("나는 고아 프로세스입니다.\\n");
    }
}

  • 위 예제에서 자식은 부모 종료 후에도 계속 실행됨 → 고아 프로세스가 됨

✅ 특징 요약

항목 내용
상태 실행 중 (Running 또는 Waiting)
부모 PID 1 (init 또는 systemd)로 자동 변경
운영체제 관리 커널이 자동으로 부모 위임
시스템 영향 없음 (정상적인 처리 메커니즘)

2️⃣ 좀비 프로세스 (Zombie Process)

✅ 정의

좀비 프로세스란, 자식 프로세스는 종료되었지만, 부모 프로세스가 종료 상태(exit status)를 수거하지 않아 PCB(Process Control Block)가 남아있는 상태이다.

프로세스는 실행이 종료되었더라도, 운영체제가 종료 코드를 부모에게 전달할 때까지 PCB를 유지한다.

✅ 발생 원인

  • 부모가 wait() 또는 waitpid()를 호출하지 않고 자식의 종료 상태를 수거하지 않음
  • 자식 프로세스가 먼저 종료되었고, 커널은 해당 상태를 일시적으로 유지

✅ 특징 요약

항목 내용
상태 종료됨 (Terminated)
PCB 존재 여부 있음 (자원 회수되지 않음)
실행 여부 실행되지 않음 (CPU 사용 X)
부모 프로세스 존재 (아직 수거하지 않음)
시스템 위험성 많아질 경우 PID 고갈, 프로세스 테이블 낭비 발생

✅ 해결 방법

  • 부모가 wait() 또는 waitpid()를 호출하여 자식의 종료 상태를 수거
  • 부모가 수거하지 않고 종료되면 → 자식은 init/systemd의 관리로 넘어가고 그들이 수거

✅ 실습 예시 (Zombie 발생)

int main() {
    if (fork() == 0) {
        printf("자식 프로세스 종료\\n");
        exit(0);
    } else {
        sleep(30);  // 자식 종료 후에도 부모가 wait() 호출 안 함
        printf("부모는 아직 자식 상태 수거 안 함\\n");
    }
}

  • 위 코드는 자식이 종료되었지만, 30초 동안 부모가 수거하지 않음 → 자식은 좀비 상태

🔍 확인 명령어 (Linux)

ps -el | grep Z

STAT 컬럼 의미
Z Zombie 상태를 의미함

 


3️⃣ 고아 vs 좀비 프로세스 비교

항목 고아 프로세스 (Orphan) 좀비 프로세스 (Zombie)
실행 여부 실행 중 (Running/Waiting 등) 실행 종료됨
PID 사용 여부 계속 사용 중 PCB는 존재, 실행은 안 됨
부모 상태 부모가 먼저 종료됨 부모는 살아 있음
운영체제의 조치 init/systemd가 자동 수거 부모가 wait() 해야 수거됨
시스템 자원 점유 점유함 (메모리, CPU 등) 거의 없음 (PCB만 유지)
시스템에 미치는 영향 거의 없음 대량 발생 시 시스템 자원 고갈

4️⃣ 시스템 수준 처리

✅ 고아 프로세스 처리 방식

  • 커널이 자동 감지 → PPID를 1로 변경
  • systemd가 종료 상태를 자동 수거하여 자원 낭비 방지

✅ 좀비 프로세스 방지 기법

  • 부모 프로세스는 반드시 wait() 또는 waitpid() 호출
  • 시그널 처리기를 등록하여 자식 종료 감지 (SIGCHLD 핸들링)
  • 자식 프로세스를 생성하지 않거나, 대신 스레드 사용

📌 요약

  • 🧟 좀비 프로세스: 자식은 종료되었지만 종료 상태를 부모가 수거하지 않아 PCB만 남은 상태
  • 👻 고아 프로세스: 부모가 먼저 종료되어 자식이 init/systemd의 보호를 받게 된 상태

운영체제는 이들 상태를 적절히 관리함으로써 프로세스 생명주기의 일관성과 자원 회수를 보장하며,

개발자는 이러한 상황을 예방하기 위해 종료 코드 수거 및 시그널 처리를 반드시 구현해야 한다.

반응형