개발하는 두더지

[운영체제/커널] 커널 오브젝트 본문

이것저것

[운영체제/커널] 커널 오브젝트

덜지 2016. 7. 22. 03:24

# 커널 오브젝트란?

커널에서 관리하는 중요한 정보를 담아둔 데이터 블록


# 오브젝트 핸들이란?

OS가 제공하는 API를 통해 커널 오브젝트를 간접 조작할 수 있도록

커널 오브젝트를 가리키는 핸들


# Usage Count란?

커널 오브젝트는 리소스와는 별도로 커널에 의해 관리되기 때문에 독립된 종료 시점을 지닌다. 

이때 종료 시점을 판단하는 것이 Usage Count이다.

커널 오브젝트 생성시 값은 1이고, 참조하는 프로세스가 증가할수록 함께 증가한다. 

CloseHandle() 함수로 핸들을 종료시키며 Usage Count 값을 1 감소한다.


# 커널 오브젝트 핸들 테이블이란?

핸들 정보를 저장하고 있는 테이블

프로세스가 초기화되면 운영체제는 프로세스를 위해 커널 오브젝트 핸들을 할당.

커널 오브젝트 핸들 테이블은 프로세스별로 따로 관리되고, 프로세스의 경우 상속 되기도 함.

상속이 허용된 항목들에 대해 테이블 복사가 발생.

복사된 오브젝트 핸들들에 대한 커널 오브젝트의 Usage Count는 모두 증가.


# 주의 사항

커널 오브젝트를 생성하는 함수들 Create*함수들은 반드시 SECURITY_ATTRIBUTES의 포인터를 인자로 가진다.

실패시 NULL 또는 INVALID_HANDLE_VALUE(-1) 이 리턴되므로 예외처리 유의


# 커널 오브젝트 상태

상태를 감시할 수 있는 함수가 WaitForSingleObject / WaitForMultipleObject 이다.

위 함수들은 커널 오브젝트가 NON-Signaled 상태에서 Blocking 되어있다가, Signaled 상태가 되면 함수를 빠져나옴.

Comments