Search

[2장 프로세스 관리(기초)]6.프로세스 종료 - 좀비 프로세스, 고아 프로세스

Publish Date
Category
Status
Done
1 more property
프로세스 종료
Table of Content

프로세스 종료

프로세스는 마지막 명령을 실행한 후 exit() 시스템 호출을 통해 운영체제에 자신을 삭제하도록 요청하면서 종료된다. 종료 시 프로세스는 일반적으로 상태 값(보통 정수)을 반환하며, 이는 부모 프로세스가 wait() 시스템 호출을 통해 받을 수 있다. 이 시점에서 해당 프로세스의 모든 자원(물리적/가상 메모리, 열린 파일, I/O 버퍼 등)은 운영체제가 회수하여 재사용한다.

종료 과정

1.
[프로세스]프로세스 종료 시, exit() 시스템 콜 요청
자식 프로세스 종료 요청:
부모 프로세스가 자식 프로세스를 종료를 요청한다. 이를 종속적 종료 (Cascading Termination)라고 한다. 부모 프로세스가 종료되면 자식 프로세스도 자동으로 종료한다. 이 경우 자식 PID를 알고 있어야 종료 요청할 수 있다. 부모 프로세스가 자식 프로세스 종료를 요청하는 경우는 아래와 같다.
1.
자식이 할당된 자원을 초과 사용했을 때
2.
자식에게 부여된 작업이 더 이상 필요하지 않을 때
3.
부모 프로세스가 종료되면서 자식 프로세스를 더 이상 실행할 수 없도록 할 때
정상 종료:
프로세스가 맡은 작업을 완료하고 exit() 호출로 종료를 요청한다. (단, 권한 검증 필요하지 않음)
2.
[커널]요청 검증
권한 검토: 커널이 요청의 유효성을 검토하여 종료한 권한이 있는지 확인한다.
부모-자식 관계, 슈퍼 유저(root)권한 여부 확인
오류 처리: 요청이 잘못 된 경우(권한 부족, 잘못된 PID 등) 오류를 반환한다.
3.
[커널]신호 전달 또는 종료 명령 실행
커널이 프로세스 테이블에서 대상 프로세스를 찾아 종료 신호(signal)를 전달한다.
SIGTERM, SIGKILL
4.
[커널]종료 작업 수행
실행 중단: 프로세스의 실행을 멈추고, 프로세스 종료 대기 상태로 전환
자원해제: 프로세스가 사용 중이던 모든 자원 해제
페이지 테이블 및 가상 메모리 해제
PCB 제거
열려 있던 파일 디스크립터 닫기
프로세스 테이블 갱신:
프로세스를 종료 상태로 표시
부모 프로세스가 wait()를 호출 해 종료 상태를 수집하기 전까지 자식 프로세스 좀비 상태
5.
[커널]부모에게 종료 알림
신호 전달: 커널 → 부모 프로세스에 SIGCHLD 신호를 전달
종료 상태 수집: 부모 프로세스가 wait() 또는 waitpid()를 호출해 자식의 종료 상태를 수집
프로세스 테이블 항목 삭제: 종료 상태가 수집되면 프로세스 테이블에서 해당 항목을 삭제 ⇒ 자식 프로세스 좀비 상태 해제

좀비 프로세스 (Zombie Process)

종료된 자식 프로세스가 부모 프로세스의 wait() 계열 시스템 콜을 호출받지 못해 종료 상태가 회수되지 않고 시스템 내에 남아 있는 상태이다.
자원은 이미 회수되었지만 프로세스 테이블의 항목만 유지
부모 프로세스의 결함으로 발생
해결책:
부모 프로세스는 자식 프로세스 종료 후 wait() 시스템 콜을 호출해 상태를 회수해야 한다.
부모 프로세스가 종료되면 init 프로세스가 좀비 프로세스를 정리한다.

고아 프로세스 (Orphan Process)

부모 프로세스가 종료되었지만 자식 프로세스가 여전히 실행 중인 상태이다.
해결책:
커널에서 init 프로세스가 고아 프로세스를 자동으로 상속받아 관리한다.
init 프로세스는 주기적으로 wait() 계열 시스템 콜을 호출해 고아 프로세스를 정리하며 시스템 자원을 관리한다.

실습

다음 스크립트는 false 명령어의 종료 상태를 확인하는 예제이다. 종료 코드는 보통 0은 성공, 0이 아닌 값(예: 1)은 실패를 의미한다. false는 이름 그대로 실패를 나타내기 위해 항상 1을 반환한다.
wait-ret.sh
#!/bin/bash false & # false 명령어를 백그라운드에서 실행 wait $! # false 프로세스의 종료를 기다림 echo "false 명령어가 종료되었습니다: $?" # 종료 후, $? 변수에 false 명령어의 종료 코드(Exit Code)를 저장 # false는 항상 1을 반환하므로 $?의 값은 1 출력
Shell
복사

Q&A

Q. 프로세스 종료는 언제 발생하는가?
Q. 종료 상태를 알리는 방법은 무엇인가?
Q. 프로세스가 종료되면 OS는 어떤 작업을 수행하는가?
Q. 종료된 프로세스는 ps에서 보이지 않는 이유는 무엇인가?
Q. SIGTERM과 SIGKILL의 차이는 무엇일까요?
Q. 부모 프로세스는 자식 프로세스 종료 상태를 어떻게 아는가?
Search
Main PageCategoryTagskkogggokkAbout MeContact