본문 바로가기

진리는어디에

커널 오브젝트 - 핸들

/**
 갈 수록 윈도우와 리눅스 사이에서 왔다 갔다 해야 할 일이 많아 지고 있다.
 오늘은 윈도우의 커널 오브젝트(Kernel Object)라는 것에 대해서 알아 보도록 하자.
*/


유저 모드와 커널 모드
 '커널 오브젝트'에 대해 알아보기 전에 '유저 모드'와 '커널 모드'의 실행이라는 것에 대해서 알아 보도록 하자. 프로그램을 실행하게 되면 사용자가 직접 접근할 수 있는 유저 영역과 시스템 콜등을 통해서만 접근할 수 있는 커널 영역이 있다. 주로 커널 영역에는 운영체제, 프로세스간에 공유되는 데이터들이 보존되어 함부로 메모리 억세스를 할 수 없도록 제한하고 굳이 그 자원을 사용하기 위해서는 필수적으로 커널에게 자원을 요청하여 그에 대해 구분 할 수 있는 무엇인가를 얻어와 커널의 허가 아래서 사용해야 한다. 그렇지 않다면 사용자가 운영체제가 상주하는 메모리 영역을 침범하여 마음대로 바꾸어 놓는다거나 하여 전체 시스템에 장애를 가져 올 수 있다.

커널 오브젝트와 오브젝트 핸들
 위에서 언급했듯이 커널 모드에서 사용되는 자원들을 구분 해 놓은 것을 커널 오브젝트라고 하고, 사용자가 커널에게 자원을 요청하고 오브젝트를 참조 할 수 있는 무엇인가를 할당 받은 것이 오브젝트 핸들이라고 한다. 커널 오브젝트에는 파일, 쓰레드, 프로세스, 뮤텍스, 세마포어, 이벤트 핸들..등의 다양한 종류가 있고, 사용자가 오브젝트의 핸들을 할 당 받는 방법은 다양하다.

 일반적으로 커널 오브젝트는 프로세스에서 생성하므로 프로세스가 끝나면 소멸 될 것으로 생각하는데, 커널 오브젝트의 소유자는 사용자 프로세스가 아니라 커널이다. 그러므로 사용자 프로세스가 죽더라도 커널 오브젝트는 남아 다른 프로세스에 의해 재사용 될 수 있다(이 말은 곧 프로세스가 끝나도 자원이 해제가 안되는 '자원 누수'라는 뜻이기도 하다).

커널 오브젝트의 상태
 윈도우의 커널 오브젝트는 signaled, non-signaled의 두 가지 상태를 가진다. 글자 그대로 신호를 받은 상태와 그렇지 못 한 상태를 나타낸다. 커널 오브젝트는 이 상태를 표시하기 위해 boolean 변수를 하나 가지고 있고, TRUE면 signaled 상태, FALSE이면 non-signaled 상태를 가리킨다. 일반적으로 커널 오브젝트가 생성 되면 non-signaled 상태가 되며(하지만 사용자가 직접 지정 해서 생성 할 수도 있다), 어떠한 상황이 발생하면 signaled가 된다. 어떠한 상황이라는 것은 각 커널 오브젝트마다 다르다. 예로 Thead와 Process의 커널 오브젝트(Handle)는 non-signaled 상태에 있다가 종료하는 경우에 signaled로 변경된다.

참고 : http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=17&page
유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!