본문 바로가기
Program

[Program] (윈도우 시스템 프로그래밍) 커널 오브젝트와 핸들러

by snwo 2021. 3. 31.

커널은 운영체제의 핵심적인 부분

커널 오브젝트는 커널에 의해 관리되는 리소스의 정보를 담고 있는 데이터 블록 (구조체)

 

예시 :

파일을 열기위해 fopen 함수를 호출하면,

os 에서 파일이 있는지 확인하고, 생성하며 커널 오브젝트를 통해 리소스를 생성 및 관리한다.

커널 오브젝트파일을 어디까지 읽었는지, 접근권한 (속성에서 확인가능) 등의 정보를 담고있다.

 

만약 파일을 read 하려면 os 에서 막는다.

 

이렇게 우리는 os 에 명령하고 실제로 리소스를 생성하고 관리하는 것은 os에서.

접근정보, 커서위치 등의 정보가 담긴 커널 오브젝트를 통해 리소스를 관리한다.

 

os 에서 관리하는 대표적인 리소스들이다.

리소스마다 각각의 필요한 정보가 다르므로 각각의 커널 오브젝트를 통해 관리한다.


우선순위를 높이고 싶을때, 커널오브젝트에 접근해야하는데, 이것은 os 에 의해 관리되며

프로그래머에게 접근이 허용되지 않기때문에, 간접적으로 접근해야한다.

 

커널오브젝트에 할당되는 숫자를 HANDLE 이라고 하는데, 

우선순위를 높이는 함수에 HANDLE 정보를 전달해 커널오브젝트에 간접적으로 접근할 수 있다.

 

 

#op1.exe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <windows.h>
#include <tchar.h>
#include<stdio.h>
 
int _tmain(int argc, TCHAR *argv[]){
    STARTUPINFO si={0,};
    PROCESS_INFORMATION pi;
    si.cb=sizeof(si);
    TCHAR command[]=_T("dummy.exe");
    CreateProcess(
        NULL,command,NULL,NULL,
        TRUE,0,NULL,NULL,&si,&pi
    );
    while(1){
        for(DWORD i=0;i<10000;i++)
            for(DWORD i=0;i<10000;i++);
 
        _fputts(_T("op1.exe\n"),stdout);
    }
}
cs

 

#dummy.exe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<windows.h>
#include<tchar.h>
#include<stdio.h>
int _tmain(int argc,TCHAR * argv[]){
    BOOL d=SetPriorityClass(
        GetCurrentProcess(),HIGH_PRIORITY_CLASS
    );
    printf("%d",GetCurrentProcess());
    printf("\n%d",d);
    while(1){
        for(DWORD i=0;i<10000;i++)
        for(DWORD j=0;j<10000;j++);
 
        _fputts(_T("op222222\n"),stdout);
    }
}
cs

 

아주 조금 쉬었다가 출력해주는 코드다.

dummy.exe자식프로세스로 생성하고, 같은 콘솔에 출력하게 하는데

dummy.exe 에서는 SetPriorityClass() 함수로 우선순위를 높이는 것을 볼 수 있다.

이때 HANDLE 정보는 GetCurrentProcess() 의 리턴값이고, 내 경우에는 1이 나왔다.

 

# sleep 함수대신, for문으로 delay 시키는 이유는

# sleep 함수를 쓰면 Blocked 상태로 들어가기 때문이다.

 

# 소스의 의도는 Ready 상태와 Running 상태를 context switching 을 통해 넘나들며 출력해주는데

# dummy.exe 에서 우선순위를 높여 더 많이 실행된다는 것을 보여준다는 의도이다.

 

실행되는 프로세스가 별로 없고, 요즘 CPU는 다 빨라서 그런지, 듬성듬성 나왔다.

 

#윤성우 윈도우즈 시스템 프로그래밍 기반으로 작성하였습니다.