윈도우 시스템 프로그래밍 <커널오브젝트>
커널? 커널 오브젝트? -----------------------------------------------------------------------------------------
커널은 운영체제를 이루는 핵심적인 부분을 의미하며 커널에서 관리하는 중요한 정보들을 담아둔 데이터 블록을 커널 오브젝트라고 한다.
새 프로세스가 생성될때마다 그 프로세스에 대한 정보를 담아둘 구조체가 생성되고 이 구조체들은 당연히 그 프로세스의 정보들로 초기화 되게 되는데 이것이 커널 오브젝트(Kernel Object)의 정체이다.
커널 오브젝트는즉 윈도우 커널에서 관리해야한다고 판단한 프로세스나 기능, 파일등에 커널오브젝트가 생성되며 당연히 그 종류에 따라서 적합한 커널오브젝트 구조체를 생성한다.
오브젝트 핸들? -----------------------------------------------------------------------------------------------
그렇다면 플레이어는 이런 커널오브젝트에 관여할 수 있을까? 마이크로소프트에서는 프로그래머가 제한적이지만 커널오브젝트에 접근할수 있게 하기위한 함수를 제공하고 있으며 이 커널오브젝트에 접근 할수 있는 인자값인 핸들을 통해서 간접적인 접근이 가능하다.
즉 핸들이라는 키를 통해서 커널오브젝트라는 여러개의 방이 있는 건물에 들어가 들어갈 수 있는 곳의 내용은 변경이 가능하다는 이야기 이다.
"저기 저 커널오브젝트 핸들을 이러이러 저러저러 해주세요"
핸들이 있어야만 어떤 커널오브젝를 지칭하는 것인지 윈도우에게 알릴 수 있는 것이다.
커널 오브젝트의 종속관계? -------------------------------------------------------------------------------------
커널 오브젝트는 윈도우 운영체제에 종속적이다..
프로세스의 기준으로 커널 오브젝트는 프로세스의 정보를 담고 있지만 커널오브젝트를 관리하는 것은 프로세스가 아닌 윈도우 운영체제라고 생각하면 된다. 그러므로 각 프로세스는 하나의 커널오브젝트를 공유할수도 있다.
Usage Count? ----------------------------------------------------------------------------------------------
Usage Count란 하나의 커널오브젝트가 생성되면 그 커널오브젝트를 참조하는 프로세스의 수를 의미한다. 모든 커널 오브젝트는 생성시 1의 Usage Count를 가지게 되고 다른 프로세스가 커널오브젝트 자신을 참조하게 되면 Usage Count를 1씩 증가시킨다.
Usage Count가 중요한 이유는 다음과 같다.
모든 커널 오브젝트는 Usage Count가 0이 되어 자신을 참조하는 녀석이 아무도 없을때 소멸되기 때문이다. 그리고 커널 오브젝트의 참조는 위에서 핸들을 통해서 한다고 했으므로 참조를 그만둔다는 명령어는 곧 그 커널오브젝트의 핸들을 닫는다는 CloseHandle를 통해서 작동하게 된다.
즉 어떤 프로세스든 일단 띄우면 Usage Count가 2가 된다.
이유는 윈도우나 바탕화면에 있는 아이콘은 이미 Usage Count가 1인 상태다. 바탕 화면 그 자체가 이미 그 프로그램에 대한 핸들을 가지고 있다고 봐야 하니까.
그리고 윈도우가 완전히 종료되어야 Usage Count가 0이 되어 모든 프로세스가 정상적으로 종료하게 된다.
커널 오브젝트의 2가지 상태 ------------------------------------------------------------------------------------
커널 오브젝트의 종료코드 -----------------------------------------------------------------------------
프로세스는 종료시 자신의 종료코드를 커널오브젝트에 넘긴다. 이 종료코드는 커널오브젝트의 핸들을 참조할수 있는 부모 프로세스에 메세지를 전달하는 방식으로 이용될 수 있다.
이때 사용되는 함수는 GetExitCodeProcess함수를 이용할수 있다.
또한 각기의 프로세스는 동기화가 되어있지 않으므로 프로그래머가 원하는 경우가 나오지 않을수가 있는데. 이때를 위해서 자식 프로세스가 완전히 연산을 마칠때가지 기다려주는 함수로 WaitForSingleObject함수가 존재한다.