해결된 질문
작성
·
187
·
수정됨
0
ExitProcess 관련 메뉴얼에
프로세스에서 종료된 스레드 중 하나에 잠금이 있고 로드된 DLL 중 하나의 DLL 분리 코드가 동일한 잠금을 획득하려고 하면 ExitProcess 를 호출하면 교착 상태가 발생한다. 라고 되어 있는데 중요한 애기 인거 같은데 무슨 애기인지 알 수 있는지 해서요?
DLL에서 ExitProcess 를 호출하면 예기치 않은 애플리케이션 또는 시스템 오류가 발생할 수 있다. DLL을 로드할 애플리케이션 또는 시스템 구성 요소와 이 컨텍스트에서 ExitProcess 를 호출하는 것이 안전한 경우에만 DLL에서 ExitProcess 를 호출해야 한다. 라고 되어 있는데 설명 부탁드릴 수 있느지요?
아울러 ExitProcess 와 TerminateProcess 의 경우 프로그램이 할당한 메모리 등 자원 및 오픈한 handle 에 대한 처리는 어떻게 되는지요?
부탁드려 봅니다.
답변 2
1
프로세스(.exe)가 ExitProcess() 함수를 호출하면 실행파일(.exe)이 로드한 모든 DLL에 대해 DllMain() 함수를 호출하게 됩니다. 매개변수는 DLL_PROCESS_DETACH가 될 것이고 이 과정에서 DLL 언로드와 관련된 코드가 수행될 것입니다. 보통 할당받은 자원을 해제하거나 개방했던 각종 핸들을 닫는 등 정리 절차에 관한 코드가 수행되는 것일 일반적인데 이 과정에서 해제 코드가 멈추는 등 흐름이 멈춰버리면 DllMain() 함수는 반환하지 못합니다. 이 경우 ExitProcess()는 DLL이 언로드 되지 않은 것으로 간주하여 계속 반환되기를 기다리게 됩니다. 로드한 전체 DLL 중 단 하나라도 이런 일이 발생한다면 ExitProcess() 함수는 끝내 반환하지 못하게 되고 결과적으로 프로세스가 종료되지도 못합니다.
더 중요한 것은 DLL 언로드가 진행된다고 판단한 후 내부 스레드들을 종료시키는데 그 절차를 진행하지 못하므로 ExitProcess()를 호출한 스레드는 그 지점에서 흐름이 멈추지만 나머지 스레드들은 여전히 작동하게 됩니다. 물론 일부 해제된 DLL이나 자원 때문에 오류가 발생할 가능성이 높고 그로 말미암아 비정상 종료될 가능성이 있습니다만 장담 할 수는 없습니다.
그리고 TerminateProcess()든 ExitProcess()든 어떤 경우라도 프로세스가 종료되면 프로세스가 사용했던 모든 자원은 OS가 회수합니다. 메모리는 가상 메모리 시스템을 사용하기 때문에 완벽히 회수되며 각종 파일 및 커널 오브젝트 같은 자원들도 회수 됩니다. 참고하시기 바랍니다. 😄
0