1. 커널 오브젝트와 핸들

- 커널 오브젝트 : Windows 운영체제에서 리소스(프로세스, 스레드, 파일 등)를 관리하기 위해 필요한 정보를 모아둔 데이터 블록.


- 핸들 : 커널 오브젝트에 접근하기 위한 숫자.


- 커널 오브젝트에 직접적인 접근이 불가능하기 때문에 핸들을 인자로 전달하는 함수 호출을 이용해서 접근한다.



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

- 커널 오브젝트의 생성 주체는 운영체제 이기 때문에 프로세스가 아닌 운영체제에 종속적이다.


- 운영체제에 종속적이기 때문에 여러 프로세스에서 하나의 커널 오브젝트에 접근이 가능하다.


- 운영체제에 의해서 생성되었기 때문에 소멸 역시 운영체제에 의해서 결정된다.



3. Usage Count

- 커널 오브젝트에 접근 가능한 대상의 수


- 커널 오브젝트에 존재한다.


- 커널 오브젝트에 접근 가능 대상이 늘어날 때마다 증가하고,  CloseHandle 함수가 호출될 때 감소한다.


- 프로세스가 종료되는 시점에도 감소한다.



4. CloseHandle 함수

- 핸들을 반환하는 함수이지만, Usage Count와 연관 지어 설명하자면 "인자로 전달된 핸들이 가리키는 커널 오브젝트를 더 이상 참조하지 않겠다. 즉, 필요가 없다."라는 의미이다.


- 따라서 CloseHandle 함수가 호출된다면 해당 커널 오브젝트의 Usage Count 값이 1 감소하게 된다.



5. 프로세스의 Usage Count

- 프로세스는 생성과 동시에 Usage Count가 1이 아닌 2로 세팅된다.


- 바탕화면에서 더블 클릭 해 실행된 프로세스는 '바탕화면'이라는 프로세스에 의해서 실행된 것이다.


- "바탕화면 = 부모 , 실행된 프로세스 = 자식" 이렇게 성립된다.



6. 종료 코드

- 자식 프로세스에서 exit(1), return 1 등을 종료 코드를 사용한다.


- 부모 프로세스에서는 GetExitCodeProcess 함수를 이용해 자식 프로세스의 종료 코드를 얻어온다.


- exit(), return을 이용해서 전달되는 값을 통해서 부모 프로세스에서 적절한 조치를 취하도록 프로그래밍할 수 있다.


ex)

exit(-1);이라면 부모 프로세스에서 _tprintf(_T("에러 발생!"));


GetExitCodeProcess 함수의 반환 값 중 STILL_ACTIVE는 자식 프로세스가 실행 중인 상태를 의미한다.



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

- 만약 부모 프로세스에서 수많은 자식 프로세스를 생성하고, 자식 프로세스의 리소스가 필요 없다고 가정하자.


- 부모 프로세스가 CloseHandle 함수를 호출하지 않으면 자식 프로세스가 종료되었음에도 불구하고 Usage Count는 0이 되지 않는다.


- 즉, 쓸모없는 커널 오브젝트가 소멸되지 않고 계속해서 남아 자원을 낭비하게 된다.


- 자식 프로세스의 종료 코드는 자식 프로세스의 커널 오브젝트에 저장되므로, 부모 프로세스에서 자식 프로세스의 종료 코드를 얻어오기 전에 CloseHandle 함수를 호출해버린다면, 자식 프로세스의 종료 코드를 얻어 올 수 없게 된다.

+ Recent posts