커널 오브젝트(Kernel Object)에 대한 이해


커널오브젝트(Kernel Object)

커널에 의해 관리되는 리소스 정보를 담고 잇는 데이터 블록



         Kernel Object                                                 Resource

 

파이프 커널 오브젝트


프로세스 커널 오브젝트


쓰레드 커널 오브젝트


<---------------->





<---------------->





<---------------->

 파이프 


프로세스


쓰레드




커널은 쉽게 말해서 OS의 핵심 이다.

파일의 생성,접근,삭제등을 할때 우리가집접하는 것이 아니라 우리가 OS에 명령을 내리면 OS가 이러저러한 잡업을 해준다.

이런 리소스를 컨트롤하기 위해서 필요한 정보를 담고있는 것이 커널오브젝트이다.


프로세스 기반 커널 오브젝트



CreateProcess 함수를 호출한다고 한다면 OS에 요청을 하면 OS는 프로세스만 생성하는 것이아니라 프로세스의 정보와 프로세스의관리에 필요한 정보들로 이루어진 커널 오브젝트를 생성한다.

OS에는 커널 오브젝트를 관리하기위한 구조체가 존재한다.




커널 오브젝트와 핸들의 관계


         Handle                                    Kernel Object                         Resource

 

파이프 핸들


프로세스 핸들


쓰레드 핸들




<----->





<----->




 

<----->


 

 

파이프 커널 오브젝트


프로세스 커널 오브젝트


쓰레드 커널 오브젝트





<--->





<--->




 

<--->


  

 

파이프


프로세스


쓰레드



커널 오브젝트에는 여러가지 정보가 담겨있지만 커널 오브젝트에는 직접접근이 허용되지 않는다.

그렇기에 커널 오브젝트에 정보를 바꿀 수 있게 하기위해 관련된 시스템 함수를 제공한다.

이러한 함수를 사용하기위해서 커널 오브젝트를 지정해야하는데 직접접근 할 수 있는 어떻한 정보도 얻지못한다  이러한 관계로 

OS는 커널 오브젝트를 만들때 각각 고유한 번호를 매긴다 이를 핸들(Handle)이라한다. 핸들은 우리가 반환받을 수있다.


단순하게 보면

커널 오브젝트는 구조체 변수이고 핸들은 숫자 일 뿐이다.

핸들을 얻는 방법은 리소스 별로 각각다르기 때문에 일일이 알아 두어야 한다.


※커널 오브젝트마다 고유 핸들 값이있는것은아니다.

자세한 내용은 다음장에 계속...





밑의 예제는 커널 오브젝트에 접근하여 프로세스의 우선순위를 변경하는 예제이다.


예제6-1]


#include <stdio.h>

#include <windows.h>

#include <tchar.h>


int _tmain(int argc, TCHAR* argv[])

{

STARTUPINFO si={0,};

PROCESS_INFORMATION pi;

si.cb=sizeof(si);


TCHAR command[]=_T("Operation2.exe");


CreateProcess(NULL,     // 프로세스 생성.

     command,

 NULL,

 NULL, 

 TRUE, 

 0, 

 NULL, 

 NULL, 

 &si, 

 &pi

);  //CreateProcess


while(1)

{

for(DWORD i=0; i<10000; i++)

for(DWORD i=0; i<10000; i++); //Busy Waiting!!

_fputts(_T("Operation1.exe \n"), stdout); 

}


return 0;

}


예제6-2]


#include <stdio.h>

#include <windows.h>

#include <tchar.h>


int _tmain(int argc, TCHAR* argv[])

{

SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);

            //GetCurrentProcess함수는 프로세스자신의 핸들을 얻어오는 함수이다.


while(1)

{

for(DWORD i=0; i<10000; i++)

for(DWORD i=0; i<10000; i++); //Busy Waiting!!


_fputts(_T("Operation2.exe \n"), stdout); 

}


return 0;

}


6-1과 6-2모두 단순 출력 프로그램이다.

예제6-1은 예제 6-2를 생성시키는데  6-2는 자신의 우선순위를 올리는 함수를 호출한다.

Busy Waiting은 출력결과가 너무빠르기때문에 출력을 늦추기위함인데 

sleep함수도 있긴하지만 sleep함수로 프로세스를 늦추면 Running상태에서 Blocked상태로 된다. 

하지만 Busy Waiting을 시키면 프로세스가 Blocked상태가아니라 스케줄러에 의해서 

Ready 상태로 된다.

예제가 우선순위에 의한 프로세스의 실행량을 보기 위함이기 때문에 sleep함수보다

Busy Waiting을 사용해야한다.


실행결과 

Operation2.exe

OpOperation2.exe

Operation2.exe

Operation2.exe

Operation2.exe

Operation2.exe

Opraeration2.exe

Operation2.exe

Operation2.exe

Operation2.exe

Operation2.exe

Opertion1.eation2.exe

Operation2.exe

중략.....................

결과를 보면 예제6-1보다 확실히 예제6-2가 많이 실행된것을 알 수있다.
또한 함수호출이 완료되기 이전에도 우선순위가 넘어갈 수 있다.

우선순위의 기준은 함수 단위가아닌 명령어 단위로 이루어 지기때문이다.




+ Recent posts