자식 프로세스는 현재 수행중이던 프로세스에서 새로운 프로세스를 실행시키는 것을 말합니다.


예를들어 아래 그림을 보면......

explorer.exe 아래 KakaoTalk.exe, PotPlayerMini.exe, Procexp.exe 등등이 수행되고 있음을 알 수 있는데요

바로 explorer.exe가 부모 프로세스

그 explorer.exe가 실행시킨 KakaoTalk.exe, PotPlayerMini.exe, Procexp.exe들이 자식 프로세스라고 볼 수 있습니다.

여기서 부모/자식간의 연관관계와 독립관계가 있는데요.

- 연관관계 : procexp.exe => procexp64.exe

- 독립관계 : explorer.exe => 하위 자식 프로세스들


연관관계와 독립관계는 프로세스간 공유하는 자료가 있고 서로 자료를 주고받는지 생성/종료에 따라 연관을 갖고 동작하는지에 따라 분류되게 됩니다.


이렇게 자식 프로세스를 만들어서 수행시키는 이유는

멀티 태스킹 작업을 수행할 때 이점을 얻을 수 있기 때문입니다.

한 프로세스 내에서 새로운 스레드를 수행시켜서도 구현 가능하지만 필요에 따라 새로운 프로세스를 생성하는게 동기화 이슈들을 비롯한 이 있을 수 있습니다.

 - 모든 경우에 자식 프로세스를 생성하는게 옳다는 이야기는 아닙니다! 상황에 따라서 알맞게!


위 그림 같은 경우에는 부모 프로세스인 explorer.exe와 하위에 있는 자식 프로세스들이 독립적인 관계이지만 procexp.exe의 자식 프로세스인 procexp64.exe는 서로 자료를 주고 받으며 수행되는 부모/자식 관계입니다.


부모/자식 프로세스간에는 하나의 프로세스에서 수행되는 것이 아니기 때문에 서로 메모리 주소 공간이 각각 별도로 존재하게 됩니다.

이런 경우에는 부모 프로세스의 자료를 자식 프로세스가 참조할 수 있도록 해주어야 하는데요.

이럴 때 사용되는 것들이 DDE, OLE, 파이프, 메일슬롯, 메모리 맵 파일 등등의 방법으로 자료를 전송할 수 있도록 해줍니다. (이것들은 나중에.. 포스팅하겠습니다.)


어떤 프로세스에서 새로운 프로세스를 생성하고 결과를 기다리는 코드를 작성한다고하면 아래와 같이 작성할 수도 있습니다.



https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx


위 코드에 대해서 설명을 드리자면..

CreateProcess 함수는 이전 포스팅을 참고! 새로운 프로세스를 생성하는 함수입니다.,

 - 프로세스의 생성 1 : http://wonjayk.tistory.com/277

 - 프로세스의 생성 2 : http://wonjayk.tistory.com/278



그리고 프로세스 생성 이후에 WaitForSingleObject 함수를 호출하게 되어있습니다.

WaitForSingleObject는 아래와 같은 형태의 함수로 첫 번째 인자로 설정된 핸들이 시그널 상태가 될 때까지 대기하는 함수입니다.

WaitForSingleObject( pi.hProcess, INFINITE );

함수로 인해 PROCESS_INFORMATION pi 로 생성된 프로세스, 즉, 윗 라인에서 생성한 자식 프로세스가 종료될 때까지 부모(현재) 프로세스가 대기상태로 있게 됩니다.

그리고, 마지막에 CloseHandle 함수를 통해서 프로세스/스레드 커널 오브젝트의 사용 카운트를 0으로 만들어 오브젝트가 사용하던 공간을 삭제하게 됩니다.

- 부모가 자식 프로세스의 종료를 대기하기 때문에 이 둘은 연관관계가 있습니다.

- 가장 첫 그림의 procexp.exe, procexp64.exe와 같은 관계로 보시면 됩니다. (연관관계)


만약, 아래와 같이 WaitForSingleObject로 대기하지 않는다면 어떨까요?

자식 프로세스가 생성되자마자 새로 생성된 프로세스/스레드의 커널 오브젝트 핸들을 바로 삭제하게 되는데 이렇게 되면

- 부모(현재) 프로세스는 자식 프로세스의 종료 여부에 상관 없이 자신의 작업을 수행하게 되고

- 자식 프로세스의 프로세스/커널 오브젝트 핸들을 삭제하기 때문에 자식 프로세스와의 관련성이 없어지게 됩니다. (대신 부모/자식간의 관계는 유지)

- 가장 처음 그림에서 예시를 보여드렸던 explorer.exe와 그의 자식 프로세스들이 바로 이러한 관계입니다. (독립관계)

Posted by 긍정왕오킹