상세 컨텐츠

본문 제목

06.3 커널 오브젝트와 Usage Count

Programming/Windows System

by RACC8N 2020. 4. 5. 19:26

본문

커널 오브젝트를 생성한 주체가 커널 오브젝트를 소멸시킬 권한을 가지고 있다. 

> CreateProcess함수는 어디까지나 프로세스 생성에 대한 요청일 뿐이다.

> 따라서 커널 오브젝트의 생성 주체는 운영체제이다.

 

A라는 프로세스가 생성되면, A 프로세스를 위한 커널 오브젝트가 생성된다.

> 이때 커널 오브젝트는 완전히 프로세스를 대표한다.

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

> 운영체제가 커널 오브젝트 소멸시기를 결정하는 기준이 뭘까?

 

Closehandle 함수는 핸들을 닫는 기능을 한다. 즉 "핸들의 반환"이다.

※ Closehandle 함수로 핸들을 반환했다고해서 무조건 커널 오브젝트가 소멸되는 것은 아니다.

 

프로세스는 종료시 종료 코드를 반환하고, 이 종료 코드는 커널 오브젝트에 저장된다.

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

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

> 따라서 프로세스가 종료될 때 커널 오브젝트까지 소멸시키면 안된다.

 

그렇다면 언제 커널 오브젝트를 소멸시키는 것이 좋을까?

> 커널 오브젝트를 참조하는 대상이 하나도 없을 때 소멸시키는 것이 가장 이상적이다.

> Windows는 이러한 정책을 사용하기위해 Usage Count를 관리한다.

> Usage Count(UC)가 0이 되는 순간 해당 커널 오브젝트는 소멸된다.

 

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

> 프로세스(쓰레드도 마찬가지)의 경우에는 프로세스가 종료되는 시점에도 Usage Count가 하나 감소한다.

 

이것만은 알고 갑시다

 

1. 커널 오브젝트와 핸들

  커널 오브젝트는 운영체제가 리소스를 관리하기 위해 필요한 구조체이고, 핸들은 커널 오브젝트에 간접으로 접근할 수 있도록 커널 오브젝트를 가리키는 정수이다. 

 

2. 운영체제에 종속적인 커널 오브젝트

  커널 오브젝트의 생성/관리/소멸의 주체는 운영체제이다.

 

3. Usage Count

  커널 오브젝트를 참조하는 숫자로 프로세스 생성, 커널 오브젝트에 대한 참조가 증가할때마다 증가하며, CloseHandle,프로세스 종료 시 감소한다.

 

4. CloseHandle 함수

  핸들을 반환하여 Usage Count를 감소 시켜준다.

 

5. 프로세스의 Usage Count

  프로세스는 생성과 동시에 Usage Count가 2가 되는데, 이는 생성된 프로세스 자기 자신(1)과,  모든 프로세스는 부모 프로세스가 자식 프로세스를 생성하는 개념으로 부모 프로세스의 (1) 총 2가 된다. 

 

6. 종료코드

  종료될 때 반환되는 값.

 

7. 부모 프로세스가 자식 프로세스 핸들을 곧바로 반환하는 이유 

  부모 프로세스가 자식 프로세스를 생성하고 바로 반환하면, 자식 프로세스가 종료될 때 바로 커널 오브젝트가 소멸되기 때문에 메모리를 효율적으로 관리할 수 있다.

 

관련글 더보기

댓글 영역