윈도우즈 시스템 프로그래밍 6장 - 커널 오브젝트에 대한 이해
윈도우즈 시스템 프로그래밍이라는 책과 해당 책의 저자이신 윤성우님의 강의를 통해 공부한 내용을 정리하는 글입니다.
커널 오브젝트에 대한 이해
⦁ 커널 오브젝트
⦁ 커널에 의해 관리되는 리소스 정보를 담고 있는 데이터 블록
⦁ 커널 : 컴퓨터를 운영하는 데 있어서 중심이 되는 운영체제 핵심 부분
⦁ 리소스 : 운영체제에 의해 생성 및 소멸되는 것들, 커널에 의해 관리됨
⦁ 리소스가 생성이 될때 커널 오브젝트의 생성도 동반된다.
커널 오브젝트와 핸들의 관계
⦁ 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 위주로 실행이 되었지만, 듀얼코어 이상의 환경에서는 아래와 같이 실행된다.