Windows/Windows Programming

프로세스의 종료

MOLOKINI 2016. 4. 2. 16:52

프로세스는 4가지 형태로 종료될 수 있습니다.

 

- 주 스레드의 진입점 함수가 반환될 때 (가장 아름다운 방법)

- 프로세스 내 스레드 중 하나가 ExitProcess 함수를 호출 (좋지 못한 방법)

- 다른 프로세스의 스레드가 TerminateProcess 함수를 호출 (역시 좋지 못한 방법)

- 프로세스 내 모든 스레드가 전부 종료될 때

 

 

1. 주 스레드 진입점 함수(Entry-point Function)의 반환

"주 스레드 진입점 함수의 반환"은 프로세스가 종료되는 조건 중 하나입니다.

진입점 함수가 리턴된다는 뜻은 종료 함수를 거친다라는 의미로 보셔도 좋은데요, 이렇게 종료되어야 스레드들이 가지고 있던 리소스들이 제대로 해제가 됩니다.

- 스레드가 가지고 있던 C++ 오브젝트들이 Destroyer를 통해 해제

- 운영체제가 스레드 스택으로 할당한 메모리를 해제

- 프로세스의 종료 코드 수행

- 커널 오브젝트 사용 카운트 감소

 

 

2. ExitProcess 함수 호출

프로세스 내의 스레드가 ExitProcess를 호출하면 프로세스는 종료됩니다.

 

ExitProcess 함수는 프로세스를 종료하고 uExitCode로 프로세스의 종료 코드를 설정합니다.

- 주의할 점은 ExitProcess 함수가 호출되는 순간 프로세스가 종료되기 때문에 ExitProcess 함수의 뒤쪽에 있는 모든 코드들은 수행되지 못합니다.

- C/C++가 관리하는 리소스 정리 작업을 하지 않기 때문에 될 수 있으면 호출하지 말아야 합니다.

- 프로세스 종료 함수를 따로 구현해서 프로세스가 할당하고 있는 리소스에 대한 정리 작업을 모두 마친 후에 종료되는 것이 가장 좋습니다.

 

 

3. TerminateProcess 함수 호출

TerminateProcess 함수를 호출하면 다른 프로세스들도 종료시킬 수 있습니다.

 

 

hProcess를 인자로 요기에 다른 프로세스의 핸들을 넣어주면 현재 프로세스가 아닌 해당되는 핸들과 연결된 프로세스가 종료되게 됩니다. 

프로세스가 종료되면 uExitCode로 전달된 값이 종료 코드로 설정됩니다.

 

TerminateProcess를 호출하는 것은 추천하지 않지만, 프로세스를 종료시킬 수 없는 상황에 따라서는 TerminateProcess로 프로세스를 종료해야 할 수도 있습니다.

 

TerminateProcess로 프로세스를 종료시키면......

- 프로세스 종료와 관련된 통보를 받을 수 없음

- 수행중이던 프로세스의 정보(메모리상의 작업 내용)들을 저장할 수 없음

- 종료 회피 불가

- 리소스는 OS가 완벽하게 정리해 줌

 

 

4. 프로세스 내의 모든 스레드 종료

모든 스레드가 ExitThread나 TerminateThread 함수를 이용해 프로세스 내의 스레드들이 남김없이 종료되면 OS에서는 더 이상 이 프로세스의 주소 공간을 유지시킬 이유가 없기 때문에 프로세스를 종료합니다.

 

프로세스 내 수행 중인 스레드가 없어서 프로세스 종료 명령이 들어가면 종료 코드가 동작되어 리소스 정리를 시작합니다.

 

 

5. 프로세스가 종료될 때 이루어지는 작업

- 프로세스 내 남아있는 스레드들이 모두 종료

- 프로세스에 의해 할당된 GDI, 사용자 오브젝트들이 삭제, 관련된 모든 커널 오브젝트 삭제 (만약 다른 프로세스가 관련된 커널 오브젝트를 갖고 있다면 삭제되지 않음)

- 프로세스의 종료 코드는 STILL_ACTIVE에서 ExitProcess나 TerminateProcess를 호출할 때 설정한 종료 코드로 변경

- 프로세스 커널 오브젝트의 상태가 시그널 상태로 변경 => 시스템에서 수행되는 다른 스레드가 프로세스 종료시까지 대기할 수 있도록 하기 위해

- 프로세스 커널 오브젝트의 사용 카운트가 1 감소