윈도우즈 시스템 프로그래밍

윈도우즈 시스템 프로그래밍 6장 - 커널 오브젝트에 대한 이해

111-000-111 2021. 7. 24. 13:59

 

 

윈도우즈 시스템 프로그래밍이라는 책과 해당 책의 저자이신 윤성우님의 강의를 통해 공부한 내용을 정리하는 글입니다.

 

 


 

 

커널 오브젝트에 대한 이해

 

  커널 오브젝트

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

      커널 : 컴퓨터를 운영하는 데 있어서 중심이 되는 운영체제 핵심 부분

    ⦁  리소스 : 운영체제에 의해 생성 및 소멸되는 것들, 커널에 의해 관리됨

    ⦁  리소스가 생성이 될때 커널 오브젝트의 생성도 동반된다.

 

 

 

 

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

 

 

⦁ Windows에서 관리하는 리소스의 특성을 변경시키기 위해서는 리소스의 커널 오브젝트를 조작해야 하는데, 직접적인 조작이 불가능하므로 시스템 함수를 통해 간접적으로 조작해야 한다.

⦁ 핸들 : 커널 오브젝트에 할당되는 숫자

 

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

 

 

 

 

 프로세스에 관련된 커널 오브젝트 조작 함수

 

 

⦁ 프로세스의 우선순위 변경 함수

 

BOOL SetPriorityClass (
    Handle hProcess,
    DWORD dwPriorityClass
);
//If the function fails, the return value is zero.

 

hProcess : 우선순위를 변경할 프로세스의 핸들을 전달한다.
dwPriorityClass : 새롭게 적용할 우선순위 정보를 전달한다.

 

⦁ 프로세스의 우선순위 정보는 프로세스 커널 오브젝트에 존재한다. 여기에 저장된 우순순위 정보를 변경해야만 실제 프로세스에 반영될 것이므로 위에 소개한 함수를 사용해서 우선순위를 변경해야 할 것이다.

여기서 문제는 특정 커널 오브젝트를 지정하는 일인데, 이는 핸들을 전달하면 해결된다.

 

 

 

예제

 

 

⦁ 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");

	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!!

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

 

Busy Waiting

소스코드를 보면, 중첩 for문으로 루프를 돌리고 있는데 뒤에 이어질 문자열 출력속도를 늦추기 위한 것이다.

루프를 완전히 돌 때까지는 멈춰있는 것처럼 보인다. 만일 Sleep 함수를 사용해서 프로세스의 실행을 늦춘다면, 프로세스는 Blocked 상태가 되므로 다른 프로세스가 실행될 것이다. 이는 예제에서 의도한 바가 아니므로 사용하지 않았다.

 

⦁ CreateProcess 함수를 통해 Operation1.exe 프로세스에서 Operation2.exe 프로세스를 실행시켜준다.

 

 

 

⦁ Operation2.cpp

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

int _tmain(int argc, TCHAR* argv[])
{
	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;
}

 

 

⦁ SetPriorityClass 함수는 현재 실행되고 있는 프로세스의 핸들을 얻을 때 사용하는 함수이다. 반환값이 핸들이다.

HIGH_PRIORITY_CLASS라는 상수 값을 전달하여 프로세스의 우선순위를 높여주고 있다.

 

⦁ Operation1.exe와 같이 Busy Waiting을 하고 있다. Operation1.exe와 실행을 구분짓기 위하여 Operation2.exe라는 문자열을 출력시켜줬다.

 

 

⦁ 실행결과

싱글코어 환경을 구축한 책에서는 우선순위를 높여준 Operation2.exe 위주로 실행이 되었지만, 듀얼코어 이상의 환경에서는 아래와 같이 실행된다.

Operation1.exe 실행결과