PE Notes · CA/OS
좀비 프로세스
자식이 끝났는데 부모가 wait로 종료 코드를 안 거둬 PID만 남는 좀비를 고아와 가르고, 탐지와 회수 방법을 정리합니다.
자식이 exit를 호출해도, 부모는 “왜 끝났는지”를 나중에 물어야 합니다. 커널은 그 답을 한 줄에 남겨 둡니다. 부모가 아직 수거하지 않은 그 줄이 입니다. CPU와 힙은 이미 돌려줬습니다. 남는 것은 PID와 테이블 칸입니다.
왜 일부러 남기는가
유닉스는 종료 상태(exit status)를 부모가 읽을 때까지 지우지 않습니다. 순간 좀비는 정상입니다. ·waitpid가 바로 오면 칸은 곧 비깁니다. 부모가 루프만 돌고 자식을 무시하면 칸이 쌓입니다. PID 공간이 가득 차면 새 프로세스가 거절됩니다.
| 조건 | 결과 |
|---|---|
| 자식 exit | 커널이 종료 코드를 보관, 상태 Z |
| 부모 wait | 코드를 전달하고 칸을 회수 |
| 부모 무응답 | 좀비 누적, 테이블 압박 |
고아와 한 표에
는 부모가 먼저 끝난 살아 있는 자식입니다. 메모리를 쓰며 계속 돕니다. PID 1(·systemd)이 입양하고, 그 자식이 끝날 때 wait를 대신 합니다. 좀비는 이미 죽었고 영수증만 남습니다. 고아는 상대적으로 안전하고, 좀비 더미는 생성 거부로 이어집니다.
| 비교축 | 좀비 | 고아 |
|---|---|---|
| 누가 먼저 | 자식 종료 | 부모 종료 |
| 점유 | PID·테이블 | 정상 실행 자원 |
| 푸는 손 | 부모 wait | init 입양 |
| 위험 | 테이블 고갈 | 낮음 |
스케줄러는 좀비를 실행 큐에 올리지 않습니다. 카드만 서랍에 남아 있습니다.
찾고 접는 손
상태 글자 Z가 좀비입니다. 부모 PID를 보면 누구의 wait가 빠졌는지 보입니다. 부모에게 를 보내 수거를 깨우거나, 핸들러에서 waitpid를 돌립니다. 부모 자체를 끝내면 init이 입양해 청소합니다. 이중 fork는 중간 자식을 곧 끝내, 손자를 init에 바로 붙이는 패턴입니다. 데몬이 터미널과 혈연을 끊을 때 씁니다.
시그널은 IPC의 알림 칸입니다. 답안은 발생 조건, 좀비·고아 표, wait·SIGCHLD·입양·이중 fork를 한 장에 닫습니다.
기술사 답안 포인트
기출 이력
제140회 정보관리기술사 1교시