커널 오브젝트와 Usage Count
다시 언급하지만, "커널 오브젝트는 프로세스의 종속적인 것이 아니라, 운영체제에 종속적인 관계로 커널 오브젝트 소멸시키는 것은 운영체제에 의해서 결정된다."라는 특성을 가지고 있다.CreateProcess 함수가 호출되면 커널 오브젝트 생성의 원인이 되는 함수이긴 하지만, 이는 프로세스 생성에 대한 요청이며, 이 요처어 과정에서 운영체제가 관리의 용이성을 위해서 커널 오브젝트를 생성한 것이다. 즉 커널 오브젝트 생성 주체는 운영체제이다.
CloseHandle 함수에 대한 정확한 이해
프로세스가 생성되면, 프로세스를 위한 커널 오브젝트가 생성된다. 하지만 프로세스가 소멸되어도 커널오브젝트는 소멸된다고 말할 수 없다.
CloseHandle 함수와 프로세스 소멸
예제를 통해 알아보자.
CloseHandle함수의 형태
정의하면 "이 핸들(hObject)이 가리키는 리소스가 더 이상 필요치 않으니, 이에 해당하는 리소스를 해제하고 커널 오브젝트도 소멸시켜라!"라고 정의할 수 있다.
그럼 이제 두 번재 cpp파일을 보자.
이 KernelObjProb1.exe를 실행하면 Prob2를 호출하고, CloaseHandle을 통하여 Prob2를 종료하지만, loop문을 통하여 문자열을 출력하는 것을 볼 수 있다. 이는 곧, Prob2 프로세스는 소멸되지 않았다는 것을 알 수 있다. (실행을 하게 되면 'Press any key to continue'라는 문자열을 볼 수 있다. 이는 Prob1.exe가 종료되었기 때문에 뜨는 출력결과이다.)
CloseHandle 함수와 프로세스 종료 코드
다음 예제는 프로세스의 정상적인 실행 완료 여부에 대해서 알아보고자 한다. 우선 자식 프로세스는 문제가 발생하게 되면 -1를, 정상적으로 실행이 완료되면 +1을 부모 프로세스에게 반환하도록 코드를 코딩해보았다.
일반적으로 위의 코드와 같이 -1이나 0은 비정상적 종료를 알리고자 하는 경우 많이 사용된다.
커널 오브젝트와 Usage Count
지금까지 알아본 결과 중 중요한 점을 다시 한번 정리하면 "자식 프로세스의 종료코드는 자식 프로세스의 커널 오브젝트에 저장된다."는 것이다.
그럼 커널 오브젝트는 언제 소멸되는 것일까? 우선 커널 오브젝트를 참조하는 대상이 하나도 없을 때 소멸시키는 것이 가장 이상적인 방법이다. 이것은 Windows가 커널 오브젝트 소멸시키를 결정하는 방식이기도 하다. 이러한 겻을 관리하기 위해 사용되는 것이 Usage Count(참조 횟수)이다. Usage Count가 0이 되는 순간, 해당 커널 오브젝트는 소멸되게 되는 것이다.
아래 그림과 같이 지금까지 해온 CreateProcess를 통한 프로세스 생성을 하게 된다면 Usage Count는 2가 되는 것이다. (부모, 자식 모두 접근이 가능한 상황이기 때문이다.)
Usage Count와 Close Handle
Usage Count가 0으로 감소하여 커널 오브젝트가 완전히 소멸되는 시점에 대해서 알아보자. 예제로는 위에서 예로 들었던 OperationStateParent.cpp 파일을 대상으로 하였다.
코드에서 CreateProcess를 통하여 OperationStateChild.exe 프로세스를 생성하며, Busy Waiting 부분에서 종료되는 code부분을 가정하면 아래와 같이 표현이 가능하다.
자식 프로세스가 종료되면 커널 오브젝트에 접근하는 대상이 하나 줄게 되면서 Usage Count의 값이 하나줄어 1이 되게 된다.
그 후 주석처리 되어 있는CloseHandle 함수가 호출되면 더 이상 접근하지 않겠다는 의미가 된다.
*CloseHandle : 핸들을 반환하면서 커널 오브젝트의 Usage Count를 감소시키는 기능을 지닌 함수
댓글 없음:
댓글 쓰기