반응형
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의 보호를 받게 된 상태
운영체제는 이들 상태를 적절히 관리함으로써 프로세스 생명주기의 일관성과 자원 회수를 보장하며,
개발자는 이러한 상황을 예방하기 위해 종료 코드 수거 및 시그널 처리를 반드시 구현해야 한다.
반응형
'IT > 운영체제' 카테고리의 다른 글
⚙️ [운영체제] 프로세스 정보 저장 (0) | 2025.06.28 |
---|---|
⚙️ [운영체제] PCB 구조와 역할 (0) | 2025.06.27 |
⚙️ [운영체제] 부모-자식 관계 구조 (0) | 2025.06.25 |
⚙️ [운영체제] 프로세스 종료 및 자원 반환 (0) | 2025.06.24 |
⚙️ [운영체제] 프로세스 생성 과정 (fork(), exec() 등) (0) | 2025.05.29 |