프로세스는 fork()
, exec()
System Call을 호출하여 자식을 생성하고 새로운 프로그램을 덮어 씌웁니다.
이후에는 경우에 따라 부모(Parent) 프로세스가 wait()
System Call을 호출하여 자식 프로세스가 종료될 때까지 기다립니다.
부모 프로세스는 wait()
System Call을 호출하여 자식이 종료될 때까지 Block
됩니다.
자식이 종료될 때까지 기다리지 않는 프로세스도 있습니다. (동시적 실행)
그리고 자식(Child) 프로세스가 로직을 모두 수행하고 나면 exit()
System Call을 호출하여 커널에게 종료 사실을 알립니다.
그러면 부모 프로세스의 대기(wait) 상태가 끝나게 되고, 자식 프로세스가 사용했던 자원들을 커널에게 반납한 후 다음 로직을 수행합니다.
이 때, 2가지 경우
에 따라 자식 프로세스는 좀비 프로세스
와 고아 프로세스
가 될 수도 있습니다.
좀비 프로세스(Zombie Process)
는 이름 그대로 프로세스가 종료되었음에도 불구하고, 메모리에서 죽지 않고 살아있는 프로세스를 의미합니다.
위에서 자식이 종료되면 부모의 wait 상태가 끝나고 커널에게 자원을 반납한다고 설명했습니다.
그렇다면 부모가 wait()
System Call을 호출하지 않는다면, 자식은 로직을 모두 마쳤지만 자원을 정상적으로 반납하지 못하고 메모리상에 남아 있게 됩니다.
자식 프로세스는 종료되었지만, 부모 프로세스가
wait()
System Call을 호출하지 않아 자원을 반납하지 못하고 살아 있는 상태
좀비 프로세스를 해결하기 위해서는 크게 3가지 방법이 있습니다.
wait()
System Call을 호출하여 자식의 자원을 반납한다.고아 프로세스(Orphan Process)
는 자식이 종료되기도 전에 부모 프로세스가 먼저 종료된 프로세스를 의미합니다.
부모가 사라진 자식 프로세스는 wait()
System Call을 호출해줄 부모가 사라졌기 때문에 좀비 프로세스와 동일한 문제가 생깁니다.
이러한 문제를 해결하기 위해, 커널은 모든 프로세스의 가장 최고 조상인 init 프로세스
에게 고아 프로세스를 입양시킵니다.
그러면 고아 프로세스의 새로운 부모는 init 프로세스가 됩니다.
init 프로세스는 종료됐지만 자원을 반환하지 못한 자식들을 위해 주기적으로 wait()
System Call을 호출해줍니다.
퍼가요^__^