5. 프로세스 종료

프로세스 종료

프로세스가 생성된 후, 어떻게 종료될까요? 프로세스 종료는 시스템 리소스를 효과적으로 관리하기 위한 프로세스 수명 주기의 중요한 부분입니다.

프로세스는 일반적으로 _exit 시스템 호출을 통해 종료됩니다. 이 동작은 커널에 프로세스가 완료되었으며 메모리 및 파일 디스크립터와 같은 리소스를 회수할 수 있음을 알립니다. 종료 시, 프로세스는 커널에 종료 상태 (정수 값) 를 제공합니다. 관례적으로 상태 값 0 은 성공적인 실행을 나타내고, 0 이 아닌 값은 오류를 나타냅니다.

그러나 _exit를 호출한다고 해서 프로세스가 즉시 사라지는 것은 아닙니다. 부모 프로세스는 wait 시스템 호출을 사용하여 자식의 종료를 확인해야 합니다. 이 호출을 통해 부모는 자식의 종료 상태를 검색할 수 있습니다. 이 두 단계 메커니즘은 적절한 프로세스 정리에 필수적입니다. linux kill child process를 수행하는 또 다른 방법은 신호를 사용하는 것인데, 이는 다음 강의에서 다룰 주제입니다.

고아 프로세스 (Orphan Processes)

자식 프로세스가 종료되기 전에 부모 프로세스가 종료되면 어떻게 될까요? 자식 프로세스는 "고아 (orphan)"가 됩니다. 원래 부모가 더 이상 wait를 호출할 수 없으므로 커널이 개입합니다. 고아 프로세스는 즉시 init (프로세스 ID 1) 이라는 특수 시스템 프로세스에 입양되며, 이는 모든 프로세스의 조상으로 간주됩니다. 그런 다음 init 프로세스는 부모 역할을 맡아 주기적으로 wait를 호출하여 입양된 자식들의 종료 상태를 수집하고, 이들이 깨끗하게 종료되도록 합니다.

좀비 프로세스 (Zombie Processes)

자식 프로세스가 종료되었지만 부모가 아직 wait를 호출하지 않은 경우 다른 시나리오가 발생합니다. 이 상태에서 자식은 "좀비 (zombie)" 프로세스가 됩니다. 커널은 좀비의 대부분의 리소스를 해제하지만, 프로세스 테이블에 항목을 유지합니다. 이 항목에는 프로세스 ID 와 종료 상태가 포함되어 부모가 이를 수집하기를 기다립니다.

좀비 프로세스는 이미 죽었으므로 CPU 시간을 소비하지 않습니다. 실행 중이 아니므로 신호로 종료할 수 없습니다. 부모 프로세스가 wait를 호출하여 좀비를 정리하는 과정을 "수확 (reaping)"이라고 합니다. 부모 프로세스가 wait를 호출하지 않으면 이러한 좀비들이 축적될 수 있습니다. 소수의 좀비는 무해하지만, 수가 많아지면 프로세스 테이블이 가득 차서 새 프로세스가 생성되는 것을 막을 수 있습니다. 부모 프로세스도 종료되는 경우, init이 좀비를 입양하고 수확합니다.

좀비 대 고아 프로세스 (Zombie vs Orphan Process)

zombie vs orphan process의 차이점을 이해하는 것은 프로세스 관련 문제를 진단하는 데 중요합니다.

  • 고아 프로세스는 부모가 죽은 활성 실행 중인 프로세스입니다. init에 입양되어 종료될 때까지 계속 실행됩니다.
  • 좀비 프로세스는 실행을 완료했지만 프로세스 테이블에 항목이 남아 있는 죽은 프로세스입니다. 부모 프로세스가 종료 상태를 읽어 가기를 기다리고 있습니다.

요약하자면, 고아는 살아 있지만 부모가 없고, 좀비는 죽었지만 부모에 의해 완전히 수확되지 않은 상태입니다.

로그인하여 학습 진행 상황을 저장하세요

로그인

연습 문제

이러한 개념을 적용하기 위해 다음 실습 랩을 시도해 보세요:

  1. Linux 프로세스 관리 및 모니터링 - 전경 및 백그라운드 프로세스와 상호 작용하고, ps로 검사하고, top으로 리소스를 모니터링하고, renice로 우선순위를 조정하고, kill로 종료하는 방법을 연습합니다. 이 랩은 프로세스 종료 방법 및 상태 관찰을 포함하여 프로세스 수명 주기에 대한 실질적인 경험을 제공합니다.

퀴즈

프로세스가 성공적으로 종료되었을 때 가장 일반적인 종료 상태는 무엇입니까?