• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    미해결

child process

23.03.12 14:39 작성 조회수 494

0

child의 종료처리를 한다는 것이 단지 부모가 (wait를 사용해)자식보다 늦게 죽으면 되는건가요?

아니면 wait()에서 시그널을 받을때까지 blocking하는 것 말고 하는 다른 종료처리가 있나요?

부모가 죽으면 child 프로세스의 자원을 회수하지 못하는 이유가 무엇인가요?

 

 

 

답변 1

답변을 작성해보세요.

0

안녕하세요. lalala님

어떤 프로세스가 자식 프로세스를 만드는 작업을 그냥하지는 않습니다. 어떤 목적을 갖고 하게 되는데요, 보통 자식 프로세스에게 어떤 작업을 시키고 자식 프로세스가 종료됐을 때 자식 프로세스의 작업이 잘 됐는지 확인하게 됩니다. 자식 프로세스의 작업이 잘 됐는지 확인하는 여러 가지 방법이 있겠습니다만 가장 쉬운 방법은 프로세스의 exit status입니다. 프로세스가 종료됐는지, 종료됐다면 어떤값을 리턴하며 종료됐는지 등을 저장한 데이터라고 볼 수 있습니다. 부모 프로세스는 wait() 계열의 함수를 통해 자식 프로세스가 종료되길 기다렸다가 exit status를 받아올 수 있습니다. 이것이 일반적인 멀티 프로세스 프로그래밍 모델이라고 볼 수 있습니다.

만약 부모 프로세스가 wait()하지 않는 상태에서 자식 프로세스가 종료되면, 그 상태는 부모 프로세스가 자식 프로세스가 죽었는지 살았는지 모르고 있는 상태입니다. 운영 체제 입장에서는 종료된 자식 프로세스의 exit status를 부모에게 넘겨주기 위해서라도 자식 프로세스를 완전히 제거하지 않습니다. 부모 프로세스가 wait()을 호출해 이 값을 가져가길 기다려준다고 볼 수 있겠습니다. 부모 프로세스는 자식 프로세스가 종료된 후에 wait()을 호출하면 그 즉시 exit status를 가져가게 되고, 자식 프로세스는 완전히 종료되게 되고, 운영 체제가 자식 프로세스가 점유하던 자원을 모두 해제하게 됩니다. 단순히 부모 프로세스가 늦게 죽는다고 처리되는 것은 아니고, wait()으로 기다려줘야 합니다. 이와 같은 부모/자식 간의 처리 관계를 없애기 위해 부모가 죽지 않은 상황이지만 자식의 ppid를 1로 만들어서 부모/자식 간의 관계를 끊을 수도 있습니다(부모의 역할이 사라진다고 봐야겠죠)

자원 해제 부분을 엄밀히 말하면 프로세스 종료 후 자원의 해제는 운영 체제가 수행합니다. 부모 프로세스가 wait()으로 자식 프로세스를 기다려주는 것은 프로세스 종료 과정 중에 일부 과정이라 볼 수 있겠습니다.

만약 부모 프로세스가 자식 프로세스보다 먼저 죽게 되면, 자식 프로세스가 죽은 후 exit status를 가져갈 프로세스가 없게 되는 상황인거죠. 이렇게 되면 자식 프로세스가 완벽히 종료처리되지 않게 됩니다. 자식 프로세스의 종료 처리를 위해 이 자식 프로세스의 부모 프로세스를 init process(pid 1)로 변경해놓게 됩니다. 이렇게 되면 자식 프로세스는 자연스럽게 정상 종료처리될 수 있는 것입니다.

주절주절 답변이 길었는데요, 다시 한번 답변을 요약하자면 다음과 같습니다.
1. 자식보다 늦게 죽으면 되는건가요? => 아닙니다. wait()으로 기다려주거나, 자식 프로세스가 죽은 후라도 wait()을 호출해줘야 합니다.
2. 다른 종료처리가 있나요? => wait(), waitpid()만 있습니다.
3. 부모가 죽으면 child 프로세스의 자원을 회수하지 못하는 이유가 무엇인가요? => 부모 프로세스가 wait()으로 자식 프로세스의 상태를 가져가야 자식 프로세스가 완전히 종료되는 것으로 규칙을 정했기 때문입니다.

잘 이해하셨길 바랍니다~ 감사합니다~