시작 전 소개

뇌를 자극하는 윈도우즈 프로그래밍
1챕터 정리본 바로가기
2챕터 정리본 바로가기
3챕터 정리본 바로가기
4챕터 세션1 정리본
4챕터 세션 2 정리본
5챕터 세션 1-2-3 정리본
5챕터 세션 4-5 정리본

커널 오브젝트에 대한 이해

커널에서 관리하는 중요한 정보를 담아둔 데이터 블록을 커널 오브젝트라고 한다.
우리가 createProcess라는 함수를 호출하면 프로세스의 생성 주체는 누가 될까?
얼핏 생각하면 생성을 요구한 프로그래머가 생성 주체라고 생각할 수도 있지만, 우리는 프로세스 생성을 요구하고 windows 운영체제는 우리의 요구에 맞게 프로세스를 생성하여준다.
또한 생성된 프로세스의 소멸과 상태 변화 등을 관리하는 것 역시 운영체제가 하게 된다.
이 과정에서 프로세스 상태 정보/우선순위 정보는 저장과 갱신도 가능하여야 한다.
이러한 관리과정을 쉽게 하기 위해 개발자들은 프로세스가 생성될 때마다 변수가 하나씩 생성되고 새롭게 생성된 관리에 필요한 정보들로 초기화되는 구조체를 만들었는데
이것이 바로 커널 오브젝트이다.
커널 오브젝트의 경우 프로그래머가 직접 생성하거나 조작할 수 없다.

그림으로 살펴보는 커널 오브젝트

alt

[1단계]createProcess함수 호출
프로그래머는 자신이 원하는 프로세스의 생성을 windowsOS에게 요청한다.
[2단계]windowsOS는 Process를 생성한다
[3단계]커널 오브젝트 참조 및 프로세스 생성
운영체제는 프로세스 생성과 관리를 위해 커널 오브젝트를 참조한다.
3-1단계:운영체제는 프로세스를 생성하고 초기화한다.
이때 필요한 자원과 메모리를 할당하고 초기 프로세스 상태를 설정한다.
[4단계]프로세스 상태 정보전송
프로세스가 성공적으로 생성되면 해당 프로세스의 정보를 프로그래머에게 반환하거나, 운영체제 내부에서 유지한다.

기타 커널 오브젝트

프로세스가 생성될 때 이외에도 쓰레드 생성 혹은 파일생성(windows 기준)시에도 커널 오브젝트가 생성된다.
커널에 의한 관리 대상이 생성될 때에는 커널 오브젝트도 생성된다.
파일 커널 오브젝트에서는 파일의 속성을 저장하는 멤버가 있어야하고, 프로세스 커널에서는 파일 커널 오브젝트에서는 없는 프로세스의 우선 순위 저장을 위한 멤버가 필요하다.
이때 관리 대상의 종류에 따라서 관리 구조체 내의 내용은 다를 수 밖에 없다.

커널 오브젝트 특징 요약

리소스의 수만큼 커널 오브젝트는 생성되며, 커널오브젝트는 자신이 참조하는 리소스가 하나도 없을 때 소멸된다.
어떤 관리대상이 커널 오브젝트를 생성되었느냐에 따라 관리 구조체 내의 멤버는 바뀌게 된다.

핸들로 커널 조작하기

커널 오브젝트를 직접 조작하는 것은 불가능하지만, 함수 호출에 의한 간접적인 조작은 가능하다.
마이크로 소프트에서 제공해주는 함수를 이용한 간접적 조작만이 가능한 이유는 안정성 때문이다.

프로세스의 우선순위 변경

리소스의 특성 변경 중 하나는 프로세스의 우선순위 변경이다.
우선순위를 변경할 프로세스 핸들을 전달하고, 새롭게 설정한 우선순위를 전달하는 방식으로 순위를 변경한다.

핸들이란

간단하게 설명하면 커널 오브젝트에 할당되는 숫자이다.
커널 오브젝트는 리소스 개수만큼 생성되기 때문에 굉장히 많은 수가 생성될 수도 있다.
때문에 윈도우에서는 커널 오브젝트를 생성할 때마다 핸들이라는 정수값을 부여하여 어떤 오브젝트를 가르키는 것인지 알 수 있도록 해준다.

그림으로 보는 핸들

핸들 그림

핸들 정보 불러오기

핸들의 정보를 얻어오는 방법은 오브젝트의 종류에 따라 다르다.
우선 프로세스 핸들의 경우 GetCurrentProcess()를 통해 데이터를 얻을 수 있다.
원래 책 내용의 예제는 싱글 프로세서 코어 cpu기반에서 이루어지기 때문에 cpu가 멀티 코어 기능을 지원한다면 저자가 책에서 말하는 내용과 다른 상황들이 벌어질 수 있다.
내 경우 10초 정도 이상 지나니까 출력된다던 Operation1이 예상보다 빠르게 출력되었다. 또한 책에서는 여러 개의 출력을 지원하지 않는 싱글코어를 기준으로 하였기 때문에 opeOperation이런 식으로 다른 프로세스에게 cpu할당시간을 넘겨주어 발생하는 오류가 생겼다.
그러나 내 cpu의 경우 코어가 4개여서 병렬로 프로세스를 실행하였는지 서로 간섭없이 각각 출력이 예상대로 진행되었다.

원칙적으로는 멀티코어에서도 우선순위가 높은 작업이 우선 실행되는 것은 마찬가지이기 때문에,다른 코어에서 실행중인 작업에 영향을 줄 수 있는 행동은 지양하는 것이 좋다.

참조 링크

우선순위 세팅 코드

댓글남기기