1-6. 커널오브젝트와 프로세스

2015. 12. 28. 20:15프로그래밍/시스템

 

프로세스가 프로세스를 생성할 수 있다.

대표적인 예로, CreateProcess 메소드를 통해 자식프로세스를 들 수 있다.

 

CreateProcess 메소드를 통해 자식프로세스를 생성할 수 있다라는 정도만 알고 따라가보자.

CreateProcess 메소드 사용과 파라미터값들이 궁금하다면 msdn 등 다른 자료들을 참고하자.

 

 

CreateProcess 메소드 호출을 통해서 프로세스 생성을 요구하고

Windows 운영체제가 요구에 맞게 프로세스를 생성해 준다.

-> 프로세스를 생성하는 실질적인 주체는 운영체제 이다.

    프로세스의 관리 ( 프로세스의 생성,소멸 상태변화) 역시 운영체제가 주체이다.

 

운영체제가 프로세스를 관리하기 위하여 만들어지는 것이 커널오브젝트 이다.

하지만, 프로세스 관리 목적으로 만들어진 구조체만이 커널오브젝트라고 할 수 없다.

커널오브젝트는 다양하다.

 

커널오브젝트?

- Windows 운영체제가 프로세스,쓰레드, 파일과 같은 리소스들을 관리하기 위해서 필요한 데이터들을 저장한다.

   이 데이터를 저장하는 메모리블록을 커널오브젝트 라고 한다.

 

-커널오브젝트의 속성

1. 프로세스에 종속적이지 않다. 운영체제에 종속적이다.

   커널 오브젝트의 생성/소멸시점은 운영체제가 결정한다.

2. 여러 프로세스에 의해서 접근 가능하다.

    ex) A 프로세스가 B 프로세스 커널오브젝트에 접근하여 B 프로세스 우선순위를 수정할 수 있다.

3. 핸들

    커널오브젝트를 구별하기 위해서, 운영체제가 커널오브젝트에 할당하는 숫자

 

-커널오브젝트의 소멸

1. 운영체제가 커널오브젝트의 소멸 시점을 결정한다.

ex) 프로세스가 종료되었다 != 커널오브젝트가 소멸된다

2. 해당 커널오브젝트의 참조카운트( UsageCount ) 가 0 일 때 소멸된다.

ex) A 프로세스와 B프로세스가 A 커널오브젝트를 참조하고 있다.

이 상태에서, A 프로세스가 종료되었다고 하여 A 커널오브젝트가 소멸되지 않는다.

왜냐하면, B 프로세스가 참조하고 있기 때문이다.

 

-CloseHandle 메소드의 오해

CloseHandle 메소드 란?

파라미터로 넘겨진 리소스의 핸들을 반환하는 작업 수행 - 여기서의 반환이란 return 이 아닌 운영체제로의 반환(해제)를 의미한다.

 

오해

이 메소드가 커널오브젝트 소멸작업까지 수행한다는 오해가 있다.

-> CloseHandle 은 커널오브젝트의 UsageCount 를 -1 시켜준다.

    UsageCount 가 1 일 경우 CloseHandle 메소드 호출 시 0 이 되면서,

    커널오브젝트가 소멸되는 현상으로 인해 생긴 오해

 

 

 

!NOTE_1

간혹 함수가 호출되어 실행되는 중간에는 절대로 CPU 할당 시간을 다른 프로세스에게 넘겨주지 않을 것이다 라고 생각할 수 있다.

이는 큰 오해. 함수실행 중에도 (while 문을 돌던 중에도) 다른 프로세스에게 CPU 할당을 넘겨줄 수 있다.

!NOTE_2.

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

-> 커널오브젝트는 운영체제에 종속적이기 때문에. 커널오브젝트의 소멸이 필요한 시점은 운영체제가 판단한다.

!NOTE_3.

부모 프로세스가 자식 프로세스 생성 후 바로 CloseHandle 메소드로 자식 프로세스 핸들을 반환을 해주는 것이 좋다.

why? 자식프로세스 커널오브젝트가 소멸되지 않는 문제를 방지하기 위해서.

ex)   부모 프로세스에서 자식 프로세스를 생성하면, 자식 프로세스의 커널오브젝트 UsageCount 는 2 이다.

        자식프로세스가 종료되어도 자식프로세스의 커널오브젝트 UsageCount 는 1 이기 때문에 ( 부모프로세스에서 여전히 참조하고 있으니까 )

        자식프로세스의 커널오브젝트가 소멸되지 않는다.

!NOTE_4.

프로세스, 쓰레드를 제외한 모든 커널오브젝트는 생성과 동시에 UsageCount 가 1이다.

자식프로세스의 커널오브젝트는 생성과 동시에 UsageCount 2 이다. ( 부모/자식프로세스가 생성과 동시에 참조하고 있으니까 )

 

'프로그래밍 > 시스템' 카테고리의 다른 글

1-5. 프로세스  (0) 2015.12.28
1-3. 운영체제 32bit vs 64bit  (0) 2015.12.20
1-4. 메모리 접근 방식  (0) 2015.12.20
1-2. 문자셋 ( CharacterSet )  (0) 2015.12.20
1-1. 프로그램의 실행과정  (0) 2015.12.16