728x90

 

커널 오브젝트

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

    -> 커널 : 운영체제가 가지고 있는 핵심 부분

    -> 리소스 : 운영체제에 의해 생성 및 소멸되는 것

- 리소스에 접근하는 것은 O/S에 의해 관리되고 있음

    -> O/S는 관리를 위해 리소스의 정보를 가지고 있어야 함

- 리소스 생성 시 그에 맞는 커널 오브젝트도 같이 생성됨

- 프로세스와 커널 오브젝트 생성 단계

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

- 핸들 : 직접적으로 접근이 불가능한 커널 오브젝트의 정보를 간접적으로 접근할 수 있게 해 줌

- 핸들 정보 예제

// operation1.cpp

#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("operation2.exe");		// operation2.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++); // Busy Waiting
            /* 
            Busy Waiting : 다음 실행을 막아줌. 
                           우선순위가 높은 프로세스가 등장하면 Ready 상태로 바뀜
            Sleep을 안쓰는 이유 : 프로세스가 Blocked 상태로 바뀜
            */
            
		_fputts(_T("operation1.exe \n"), stdout);
	}

	return 0;
}
// operation2.cpp

#include <stdio.h>
#include <tchar.h>
#include <windows.h>


int _tmain(int argc, TCHAR* argv[])
{
	SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
    /*
	SetPriorityClass(_In_ HANDLE hProcess, _In_ DWORD dwPriorityClass);
    	SetPriorityClass() : 우선순위 변경 함수
        GetCurrentProcess() : 자신의 핸들 값 반환
        HIGH_PRIORITY_CLASS : 높은 우선순위 부여
    */
	while (1)
	{
		for (DWORD i = 0; i < 10000; i++)
			for (DWORD i = 0; i < 10000; i++);
		_fputts(_T("operation2.exe \n"), stdout);
	}

	return 0;
}

- 실행을 시켜보면 우선순위가 높은 operation2.exe가 더욱 많이 출력되는 것을 확인할 수 있음

- operation1.cpp의 _fputts 함수가 호출되어 완료되기 이전에 우선순위가 넘어갈 수 있음

728x90

+ Recent posts