1. 커널 오브젝트에 대한 이해

: 커널이란, 컴퓨터를 운영하는데 있어서 중심이 되는 운영체제 핵심 부분을 뜻하는 것이다.

: 일반적으로 커널과 운영체제는 같은 의미로 사용되어지기 때문에 명확히 구분하지 않아도 된다.


* 커널오브젝트의 이해

: 커널에서 관리하는 중요한 정보를 담아둔 데이터 블록을 가리켜 커널 오브젝트라 한다.

: 프로세스의 생성, 소멸, 상태변화 등 모든 일들을 운영체제가 관리하게 된다. 이때, 스케쥴러에 의해 관리되어질려면 갱신되는 혹은 고정적인 정보가 있어야 한다.

: 이러한 정보를 모아 두기 위해 Windows 운영체제 개발자들은 구조체 하나를 정의하게 되었고 프로세스가 생성될때마다 이 프로세스 관리 구조체 변수가 하나씩 생성된다. 이것이 바로 커널 오브젝트의 정체이다.

: 커널 오브젝트는 프로그래머가 직접 생성하거나 조작할 수 없기 때문에 이정도 이해면 충분하다.

* 그 이외의 커널 오브젝트들

: 프로세스 내에서 프로그램 흐름을 구성하는 쓰레드를 생성할때에도, IPC(Inter Process Communication)때 사용되어지는 파이프나 메일 슬롯을 생성할 때에도 만들어진다.

: 파일을 생성할 때에도 생성된다. 이 또한 Windows 커널에 의한 관리 대상이기 때문이다.

: 커널 오브젝트의 종류에 따라서 다른 구조체를 기반으로 생성된다.

Windows 운영체제는 프로세스, 쓰레드 혹은 파일과 같은 리소스들을 원활히 관리하기 위해 필용한 정보를 저장해야 한다. 이때 데이터를 저장하는 메모리 블록을 가리켜 커널 오브젝트라 한다.

* 오브젝트 핸들을 이용한 커널 오브젝트의 조작

: 커널 오브젝트를 함수 호출에 의한 간접적인 조작은 가능하다.

- 프로세스의 우선순위 변경

- 커널 오브젝트에 할당되는 숫자 핸들(Handle)

- 핸들 정보는 어디서?

: 프로그램 내부 함수에서 호출할 수 있다.

: 함수가 호출되어 실행되는 중간에는 절대로 CPU의 할당 시간을 다른 프로세스에게 넘겨주지 않을것이다 라는 오해를 범하지 말자!

: 중간중간에 넘겨질수있음.


2. 커널 오브젝트와 핸들의 종속 관계

* 커널 오브젝트의 종속관계

: 커널 오브젝트는 Winodws 운영체제에 종속적이다.

: 커널 오브젝트는 프로세스에 종속적인 것이 아니라, 운영체제에 종속적인 관계로 커널 오브젝트의 소멸시점은 운영체제에 의해서 결정된다.

: 커널 오브젝트는 프로세스에 종속적인 것이 아니라 운영체제에 종속적인 관계로 여러 프로세스에 의해서 접근 가능하다

* 핸들의 종속관계

: 핸들(핸들 테이블)은 운영체제에 종속적이지 않고 프로세스에 종속적이다.

: 두개의 프로세스가 하나의 커널오브젝트에 순서대로 접근하여 우선순위를 변경하는 것이 가능하다.

: 핸들을 얻는 방법은 커널 오브젝트의 종류와 상황에 따라서 다양하다.

* 프로세스핸들, 쓰레드 핸들, 프로세스 ID, 쓰레드 ID

: 프로세스 핸들은 프로세스 커널 오브젝트를 가리키기 위한 것이고, 프로세스 ID는 커널 오브젝트가 아니라 프로세스 자체를 구분짓기 위한 것이다.

3. 커널 오브젝트와 Usage Count

: 커널 오브젝트는 프로세스에 종속적인 것이 아니라, 운영체제에 종속적인 관계로 커널 오브젝트 소멸시기는 운영체제에 의해서 결정된다.

* CloseHandle 함수에 대한 정확한 이해

: 프로세스가 생성되면 이를 위한 커널 오브젝트가 생성되고, 이때 커널 오브젝트는 완전히 프로세스를 대표하게 된다.

: 프로세스가 소멸된다고 해서 커널 오브젝트가 소멸된다고 말할 수 없다.

: 해당 프로세스에 대해서 더이상 관여할 바가 아니니, 해당 프로세스 핸들을 반환하라는 뜻.

: 프로세스가 소멸된다는 뜻이 아님.

* CloseHandle 함수와 프로세스 종료코드

: 운영체제는 커널 오브젝트 소멸시점을 어떻게 결정 짓는가?

: 프로세스가 종료되어야 한다.

* 커널 오브젝트와 Usage Count

: 자식 프로세스의 종료코드는 자식의 커널 오브젝트에 저장된다.

: 자식 프로세스가 종료될때 커널 오브젝트도 동시에 소멸된다면 부모 프로세스는 종료코드를 얻을 수 없게 된다.

: 그러므로 프로세스가 종료되었다고 해서 커널 오브젝트까지 동시에 소멸시키지는 안흔다.

: 해당 커널 오브젝트를 참조하는 대상이 하나도 없을 때 소멸시키는 것이 가장 이상적이고, 이것이 Windows가 커널 오브젝트 소멸시기를 결정하는 방법이다.

: Windows 는 Usage Count(참조횟수)를 통해 0이되는 순간 해당 커널 오브젝트를 소멸시킨다.

: 커널 오브젝트에 접근 가능한 대상이 늘어날 때마다 Usage Count가 하나씩 증가한다.

* Usage Count와 CloseHandle

: 자식의 커널 오브젝트는 부모와, 자식 둘다 접근하고 있으므로 자식의 프로세스가 종료된다고 하더라도 부모의 프로세스가 접근하고 있기 때문에 Usage Count가 1이 된다.

: 이 때 CloseHandle 함수를 호출하면 자식의 커널 오브젝트에 더이상 접근하지 않게 되면서 Usage Count가 하나 감소하여 0이된다.

: CloseHandle함수는 핸들을 반환하면서 커널 오브젝트의 Usage Count를 하나 감소시키는 기능을 한다.

: 바탕화면에서 파일을 실행시키게 되면 바로 CloseHandle함수를 호출하여 핸들을 반환해버리기 때문에 Cusage Count가 1이게 된다.


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기



+ Recent posts