hahahia

커널 오브젝트와 오브젝트 핸들 01 본문

Windows Programming/Windows::System

커널 오브젝트와 오브젝트 핸들 01

hahahia 2012. 3. 14. 21:07

커널(Kernel) - 컴퓨터를 운영하는 데 있어서 중심이 되는 운영체제 핵심부분

커널 오브젝트(Kernel Object) - 커널에서 관리하는 중요한 정보를 담아둔 데이터 블록

프로세스를 예를 들자면 프로세스를 생성하는 실질적인 주체는 프로그래머가 아니라 운영체제라고 해야 정확한 것이다. 
이렇게 운영체제가 프로세스를 관리하기 위해서는 프로세스에 관련된 정보들을 저장해야 한다.
그 과정에서 구조체를 하나 정의를 하는데 이 구조체가 바로 커널 오브젝트입니다. 

 - 커널 오브젝트에 대한 도식화(프로세스)

- Windows 운영체제는 프로세스, 쓰레드 혹은 파일과 같은 리소스(Resource)들을 원활히 관리하기 위해 필요한 정보를 저장해야 한다. 이 때 데이터를 저장한는 메모리 블록을 가리켜 커널 오브젝트라 한다. 
- Windows 커널에 의해서 관리되는 리소스 수만큼 커널 오브젝트도 생성됩니다.

프로그래머가 프로세스 생성을 요청합니다.
프로세스 커널 오브젝트에 실제 데이타 정보가 담기고,
그 프로세스를 관리하는것은 커널(OS)의 몫이 되겠다.
프로세스에는 상태정보 (running, block, ready, zombie 등등..)
그리고 우선순위 (프로세스가 CPU를 점거할때 순위라고 할까요~) 등
이런 정보가 "프로세스 커널 오브젝트" 로 저장되어 커널에 의해 관리가 된다.
(물론 프로세스 이외에 파일, 스레드, 파이프 등등 커널 오브젝트라는 범위는 아주 넓습니다)

그렇다면 커널 오브젝트란에 OS에 의해 간섭되는것인데..
프로세스 커널 오브젝트 안에 있는 정보들중 하나 우선순위를
프로그래머가 높이고 싶다하면 어떻게?? (프로세스에 대해서 계속 예를 들자는.. 그런 의미입니다.)
커널 오브젝트는 사용자가 직접 접근하지 못합니다. (안정성을 위해.. 그렇게 만들어짐)
직접접근하지 못한다면, 분명히 간접적으로 접근하는 방법이 있겠지요!!
그 간접적으로 접근하는 것 그것이 바로 핸들!!!!!!!!!!!
그전에 잠시 프로세스의 우선순위를 바꾸는 함수를 보자.


- 프로세스의 우선순위(Priority) 변경
BOOL SetPriorityClass(
    HANDLE hProcess, // 우선순위를 변경할 프로세스의 핸들을 전달한다
    DWORD dwPriorityClass // 새롭게 적용할 우선순위 정보를 전달한다
); 
여기서 핸들은 커널 오브젝트에 할당되는 숫자에 지나지 않는다고 생각하면 된다.(실제로 숫자에 지나지 않습니다 ㅎㅎ)
이 함수를 풀이해보자면
hProcess가 가리키는 프로세스의 우선순위를 dwPriorityClass로 변경!!

핸들(HANDLE)

운영체제가 커널 오브젝트를 관리하기 위해서는 각각의 커널 오브젝트에 번호를 줍니다. 이 번호를 Handle 정보라고 한다. 
커널 오브젝트에 직접적인 접근은 불가능 하지만, 이러한 핸들번호를 받아 간접적으로 커널 오브젝트에 접근할 수 있게 됩니다. 그러면 위에서 말하던 우선순위를 고쳐주기 위해서는 프로세스 커널 오브젝트의 핸들값을 반환하여 간접적으로 접근해주면
우선순위, 상태정보 등등 가져올 수 있고, 수정도 가능하게 됩니다. 
그 예시로 방금 위에서 설명한 SetPriorityClass를 보시면 되겠습니다. 

 - 방금 위의 설명을 도식화 시킨겁니다

 

참고 윈도우즈 시스템 프로그래밍 | 윤성우 저 | 한빛미디어 
Comments