커널

-> 기존에 커널 = OS였지만 시대가 변하면서 점차 의미가 분리되었다.


커널 오브젝트

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

-> 윈도우에 의해 생성되고 소멸되는 리소스를 관리하기 위한 데이터 블록을 커널 오브젝트라고 한다.


-> 커널과 커널 오브젝트는 다르다. 커널 오브젝트는 프로세스와 밀접한 관련이 있다.


또한 파이프 커널 오브젝트, 프로세스 커널 오브젝트, 쓰레드 커널 오브젝트는 각각 다르게 디자인되어있다.



사용자가 프로세스를 실행하면 프로세스만 실행되는 것이 아니라 os로 인해 프로세스에 대한 커널 오브젝트가 생성되고 커널 오브젝트는 프로세스 정보를 담고있고 관리하기 위한 커널 오브젝트가 생성된다.


또한 커널 오브젝트를 관리하기 위한 커널 오브젝트 관리 구조체도 생성된다. 커널 오브젝트 관리 구조체로 인해 커널 오브젝트가 생성된다.



예)

프로세스를 생성하면 프로세스 커널 오브젝트가 생성된다.


만약 사용자가 이 프로세스의 연산 우선순위를 높이고 싶다고 생각하고 실제로 우선순위를 높이기 위해서는 커널 오브젝트에 접근하여야 하는데, 커널 오브젝트는 임의의 접근이 불가능하다.


이 때 커널 오브젝트를 다루기 위해 필요한 것이 핸들로, 사용자가 os에 프로세스를 실행하도록 요청하면 os는 프로세스와, 프로세스 커널 오브젝트와, 프로세스 커널 오브젝트 핸들(프로세스 핸들)을 생성한다.


핸들은 os에 의해 특정 숫자로 넘버링된 이름을 가지고 있는데(실제로 int형 정수로 구성되어 있다.) 이를 이용하여 커널 오브젝트에 접근할 수 있게 된다.



Operation2.exe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
 
int _tmain(int argc, TCHAR* argv[])
{
    //우선순위를 변경하는 함수
    //GetCurrentProcess() 현재 프로세스의 핸들 정보를 가져오는 함수
    //HIGH_PRIORITY_CLASS 우선순위를 높이는 매크로
    SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
    while (1)
    {
        //Sleep()함수는 Blocked 상태로 변환된다. 우선순위를 포기하는 것
        //우선순위를 관찰하기 위해선 Ready 상태로 두어야 한다.
        for (DWORD i = 0; i < 10000; i++)
            for (DWORD i = 0; i < 10000; i++);    //Busy Waiting!!
        _fputts(_T("Operation2.exe \n"), stdout);
    }
    return 0;
}
cs


Operation1.exe

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


싱글코어 기반의 출력결과

않이


듀얼이상에선 순서대로 나온다.

+ Recent posts