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 함수를 호출해버린다면, 자식 프로세스의 종료 코드를 얻어 올 수 없게 된다.
'뇌를 자극하는 윈도우즈 시스템 프로그래밍 > 개념' 카테고리의 다른 글
프로세스 간 통신(IPC)2 (0) | 2019.05.17 |
---|---|
프로세스 간 통신(IPC)와 Signaled, Non-Signaled 상태 (0) | 2019.05.08 |
프로그래밍을 통한 프로세스의 생성 (0) | 2019.03.19 |
프로세스와 스케줄러의 이해 (0) | 2019.03.18 |
Direct 모드와 Indirect 모드 (0) | 2019.03.18 |