커널 오브젝트(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가 많이 실행된것을 알 수있다.
또한 함수호출이 완료되기 이전에도 우선순위가 넘어갈 수 있다.
우선순위의 기준은 함수 단위가아닌 명령어 단위로 이루어 지기때문이다.
'강좌 정리 > 뇌를자극하는윈도우즈시스템프로그래밍' 카테고리의 다른 글
07장. 프로세스간 통신(IPC) 1 ①프로세스간 통신(IPC)의 의미, 메일슬롯 방식의 IPC (0) | 2012.07.13 |
---|---|
06장. 커널 오브젝트와 오브젝트 핸들 ②커널 오브젝트와 핸들의 종속관계 (0) | 2012.07.09 |
05장. 프로세스의 생성과 소멸 ②프로그래밍을 통한 프로세스의 생성 (0) | 2012.07.04 |
05장. 프로세스의 생성과 소멸 ① 프로세스와 스케줄러의 이해 (0) | 2012.07.03 |
04.장 컴퓨터 구조에 대한 두번째 이야기 ③ Direct 모드와 Indirect 모드 (0) | 2012.07.02 |