커널 : 컴퓨터를 운영하는데 있어서 중심이 되는 운영체제 핵심 부분
커널 오브젝트 : 커널에서 관리하는 중요한 정보를 담아둔 데이터 블록
프로세스를 생성하는 실질적인 주체는 운영체제이다. 프로그래머가 아니다. CreateProcess 함수호출을 통해 프로세스 생성을 요구한 것이고, Windows 운영체제가 우리의 요구에 맞게 프로세스를 생성해 주는 것이다. 그러므로 프로세스를 생성하는 실질적인 주체는 운영체제이다.
프로세스 생성과 소멸, 프로세스 상태변화 등 생성된 프로세스를 관리하는 것도 운영체제가 하는 일이다.
동시에 여러개의 프로세스를 관리하기 위해선 운영체제 입장에서 고정적으로 저장하고 갱신해야 할 정보들이 생기기 마련이다. 프로세스 상태정보(Running, Blocked, Ready 상태)와 우선순위 정보등의 정보는 운영체제 내부에 저장되어야 한다. 그리고 프로세스 상태정보와 프로세스 우선순위 정보도 변경될때 마다 갱신되어야 한다. 이러한 정보 저장과 갱신을 통한 정보들로 프로세스 스케줄러가 프로세스를 관리할 수 있다.
운영체제가 프로세스를 관리하기 위해 프로세스에 관련된 몇몇 정보를 저장할 수 있어야 하고, 참조 및 변경도 가능해야 한다. 이러한 프로세스 정보를 저장하기 위해 구조체를 정의하고, 이 구조체를 커널 오브젝트 라고 부른다. 커널 오브젝트는 프로세스가 생성될때 마다 하나씩 생성된다.
프로세스의 커널 오브젝트는 프로그래머가 직접 생성하거나 조작할 수 없다.
프로세스가 생성될 때에만 커널 오브젝트가 생성되는 것은 아니다. 프로세스 내에서 흐름을 구성하는 쓰레드를 생성할 때에도, IPC를 위해 사용되는 파이프나 메일 슬롯을 생성할 때에도 커널 오브젝트를 생성해서 필요한 정보들을 채워야만 한다.
프로세스, 쓰레드, 파이프, 메일 슬롯 등 커널 오브젝트를 생성할 때 커널 오브젝트의 종류에 따라서 서로 다른 구조체를 기반으로 생성된다. 대상에 따라 관리되어야할 정보들이 다르기 때문에 커널 오브젝트의 형태(커널 오브젝트를 구성하는 멤버)도 다를 수 밖에 없다.
예를 들어 파일이 생성될때 파일 커널 오브젝트에는 파일 속성(Read 모드, Write 모드 or Read/Write 모드)정보가 저장되어야 한다. Read 모드로 개방된 파일에 데이터를 저장하려는 경우, Windows에 의해 접근이 허용되지 않는다. 반면에 프로세스 커널 오브젝트에 파일 속성 정보를 저장할 필요가 없고 프로세스 우선 순위를 저장하기 위한 멤버가 필요하다.
커널 오브젝트 : 프로세스, 쓰레드 혹은 파일과 같은 리소스들을 관리하기 위해 필요한 정보를 저장하는 메모리 블록
☆Windows 커널에 의해서 관리되는 리소스 수만큼 커널 오브젝트도 생성된다.☆
Kernel Object Resource
파이프 커널 오브젝트 <--------------------------> 파이프
프로세스 커널 오브젝트 <------------------------> 프로세스
쓰레드 커널 오브젝트 <----------------------------> 쓰레드
프로그래머는 직접 커널 오브젝트를 조작할 수 없다. 그러나 시스템 함수 호출을 통해 간접적인 조작은 가능하다.
프로세스 우선순위 변경
BOOL SetPriorityClass(
HANDLE hProcess,
DWORD dwPriorityClass
);
hProcess : 우선순위를 변경할 프로세스의 핸들(Handle)
dwPriorityClass : 새로 적용할 우선순위 정보
"hProcess가 가리키는 프로세스의 우선순위를 dwPriorityClass로 변경한다."
SetPriorityClass는 특정 프로세스의 우선순위를 높이는 일이다. 그러나 프로세스의 우선순위 정보는 프로세스 커널 오브젝트에 존재한다. windows는 커널 오브젝트를 생성할 때마다 핸들이라는 정수값을 부여한다. 이 정수값만 알 수 있다면, 커널 오브젝트를 지시하는것은 쉬워진다.
Handle Kernel Object Resource
파이프 핸들 <------------------------>파이프 커널 오브젝트 <-----------------------------> 파이프
프로세스 핸들<---------------------->프로세스 커널 오브젝트 <-------------------------->프로세스
쓰레드 핸들 <---------------------->쓰레드 커널 오브젝트 <------------------------------->쓰레드
SetPriorityClass 함수의 첫번쨰 인자는 프로세스의 커널 오브젝트를 가리키는 핸들을 전달하는 것이다.
*****Sleep함수는 프로세스를 Blocked상태가 되게 한다.******
현재 실행되고 있는 프로세스의 핸들 얻기
GetCurrentProcess함수는 현재 실행중인 프로세스(GetCurrentProcess 함수를 호출한 프로세스)의 핸들을 얻을 때 사용되는 함수이다. GetCurrentProcess 함수의 반환값을 통해 핸들을 얻게된다.
HANDLE GetCurrentProcess(VOID);
현재 실행중인 프로세스의 우선순위를 높이는 방법
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
프로그램 실행중
출력 함수 호출이 완료되기도 전에, 함수가 호출되어 실행되는 중간에 CPU할당 시간을 다른 프로세스에게 넘겨 줄 수도 있다. CPU는 명령어 단위로 실행한다. 즉 출력함수의 명령어 수행중 다른 프로세스에게 CPU할당이 넘어갈 수 있다.
'Programming > Windows System Programming' 카테고리의 다른 글
CloseHandle 함수와 프로세스 종료코드 (0) | 2020.06.13 |
---|---|
커널 오브젝트에 대한 이해 2 (0) | 2020.06.13 |
프로세스 생성 (0) | 2020.06.08 |
프로세스의 스케줄링과 상태변화 (0) | 2020.06.07 |
프로세스의 이해 (0) | 2020.06.07 |