좀비프로세스와 고아프로세스

2024. 1. 15. 15:17CS/운영체제

좀비프로세스와 고아프로세스

좀비 프로세스(자식이 먼저 종료 + 부모가 wait()호출 X)

자식 프로세스가 부모프로세스보다 먼저 종료 + 부모프로세스가 아직 wait()를 호출하지 않은 자식프로세스의 상태

  • 자식 프로세스가 종료되어도 사용하던 리소스를 운영체제에게 반환하지 못하기때문에 완전히 제거되지 못한다.
    • 이러한 경우에 대비하여, 커널은 자식프로세스의 최소한의 정보(자식프로세스의 PID, 프로세스의 종료 상태 등)을 가지게 된다.
  • 이후, 부모프로세스가 wait() 시스템콜을 호출하여 종료상태를 회수하게 되면, 좀비프로세스가 정상적으로 제거된다.

고아 프로세스(부모가 먼저 종료)

부모 프로세스가 자식 프로세스보다 먼저 종료하게 되면, 이때, 자식프로세스의 상태를 고아프로세스라고 한다.

  • 자식프로세스의 부모프로세스가 제거되었기때문에 자식프로세스의 새로운 부모는 init프로세스가 된다.
  • 그렇기때문에 부모의 PID는 1로 변경된다. (init프로세스의 pid값이 1이기때문!)
  • init프로세스는 기존의 부모프로세스 대신 wait() 시스템콜을 호출하여 자식이 종료될때까지 기다리고,
  • 자식프로세스가 종료된다면 리소스를 회수하여 자식프로세스를 정상적으로 종료 및 제거시킨다.

자식 프로세스가 상태를 알리지 않고 죽거나, 부모 프로세스가 먼저 죽게 되면 어떻게 처리해?

  • 자식 프로세스가 상태를 알리지 않고 죽는 경우⇒ kill이 되면, 자식프로세스를 바로 죽이지 않고 자식프로세스의 PCB에 kill요청이 되었다는 것을 나타내기위해 kill flag정보를 표시한다.
    • 부모프로세는 wait()를 통해 자식이 종료될때까지 기다린다.
    • 자식프로세스는 kill당하기 전에 exit() 시스템콜 호출
    • 부모프로세스는 자식프로세스의 pcb를 확인하여 kill flag가 있음을 인지
    • 부모프로세스는 kill flag를 통해 자식프로세스의 상태가 종료되었음을 인지하여 자식프로세스를 종료 및 제거한다.
  • ⇒ 다른 프로세스에 의해서 kill당하는 경우로 추측된다.
  • 부모가 먼저 죽는 경우
    • 부모프로세스가 자식프로세스보다 먼저 죽게되면, 이때 자식프로세스의 상태는 고아프로세스가 된다.
    • 부프로세스가 종료되었기때문에, 해당 자식프로세스의 부모프로세스는 init()프로세스가 된다.
    • 따라서, 해당 부모의 프로세스의 pid값은 1이 된다. (init프로세스의 pid값이 1이기때문!)
    • 이후, 부모프로세스(=init프로세스)가 wait()를 하게 되어 자식프로세스가 종료될때까지 기다리고,
    • 자식프로세스가 종료되면 리소스를 회수하여 자식프로세스를 정상적으로 종료 및 제거한다.
  • 참조블로그