
정답
고아 프로세스 발생: (부모) 10번 라인, 종료 → (자식) 4번 라인, 준비. 좀비 프로세스 발생(8번 라인에 wait(&status); 추가): (부모) 7번 라인, 준비 → (자식) 10번 라인, 종료.
출제 의도
fork() 호출 이후 부모·자식 프로세스의 실행 순서가 스케줄링에 의해 달라질 수 있음을 이해하고, 부모가 먼저 종료하면 고아 프로세스가 생기며, 자식이 먼저 종료했는데 부모가 종료 상태를 확인(wait)하기 전이면 좀비 프로세스가 됨을 프로세스 상태(준비/실행/종료)로 정확히 표현하는지를 평가한다.
풀이 과정
(나)에서 fork() 이후 자식은 조건식이 참이 되어 5번 라인을 수행하고, 부모는 else 블록으로 들어가 7번 라인을 수행한 뒤 10번 라인에서 종료한다. 어떤 프로세스가 먼저 CPU를 얻는지는 스케줄링에 따라 달라진다.
고아(orphan) 프로세스는 “부모가 먼저 종료하고 자식이 아직 종료하지 않은 상태”이다. 고아가 발생하려면 부모가 먼저 끝나야 하므로, 스케줄링이 부모를 먼저 끝까지 실행시키는 경우를 잡는다.
부모가 7번 라인을 실행한 뒤 10번 라인(return 0;)까지 실행하여 종료하면, 그 순간 자식은 아직 실행되지 않아 4번 라인(fork()에서의 복귀)까지만 끝낸 상태로 CPU를 기다리는 준비 상태가 될 수 있다. 이때 부모는 종료, 자식은 준비이므로 자식이 고아가 된다.
따라서 고아 프로세스 발생 시점의 “실행 완료한 라인 번호/상태”는 다음과 같다.
$$ (\text{부모})\; 10\text{번},\;\text{종료} \quad\rightarrow\quad (\text{자식})\; 4\text{번},\;\text{준비} $$
좀비(zombie) 프로세스는 “자식이 종료되었지만 부모가 그 종료를 확인하지 않은 상태”이다. 문제 조건에 따라 (나)의 8번 라인에 \( \texttt{wait(&status);} \)를 추가한 상황을 고려한다. wait가 있더라도, 부모가 wait를 호출하기 전에 자식이 먼저 종료하면 그 짧은 구간 동안 자식은 좀비가 된다.
스케줄링이 부모로 하여금 7번 라인(부모 출력)을 수행하게 한 뒤, 8번 라인(wait)을 실행하기 전에 인터럽트로 CPU를 빼앗겨 준비 상태가 되게 하고, 그 사이 자식이 5번 라인을 수행한 뒤 10번 라인에서 종료하도록 하면 좀비가 발생한다.
즉, 좀비 발생 순간에는 부모는 7번 라인까지 끝낸 뒤 준비 상태(아직 wait 미수행)이고, 자식은 10번 라인까지 실행하여 종료 상태이다.
$$ (\text{부모})\; 7\text{번},\;\text{준비} \quad\rightarrow\quad (\text{자식})\; 10\text{번},\;\text{종료} $$
<풀이가 부정확할 수 있으니 반드시 교차검증 확인 바랍니다.>