커널 오브젝트의 종속 관계
커널 오브젝트는 Windows 운영체제에 종속적이다.
커널 오브젝트는 프로세스에 종속적인 것이 아니라, 운영체제에 종속적인 관계로 커널 오브젝트의 소멸 시점은 운영체제에 의해서 결정된다. 커널 오브젝트는 프로세스에 종속적인 것이 아니라 운영체제에 종속적인 관계로 여러 프로세스에 의해 접근 가능하다.
커널 오브젝트는 운영체제에 종속적이지만 핸들(핸들 테이블)은 프로세스에 종속적이다.
프로세스가 생성된 후 정보를 저장하는 PROCESS_INFORMATION pi; 에서 pi.hProcess를 통해 프로세스의 핸들을 받아온다.
PROCESS_INFORMATION 정의
typedef struct _PROCESS_INFORMATION
{
HANDLE hProcess; //프로세스 핸들
HANDLE hThread; //쓰레드 핸들
DWORD dwProcessId; //프로세스의 ID
DWORD dwThreadId; //쓰레드 ID
}PROCESS_INFORMATION;
위 정보들을 통해 자식 프로세스의 핸들을 얻을 수 있다.
핸들을 얻는 방법은 커널 오브젝트의 종류와 상황에 따라서 다양하다. 커널 오브젝트는 프로세스에 종속적인 것이 아니라 운영체제에 종속적인 관계로 여러 프로세스에 의해서 접근이(공유가) 가능하다.
dwProcessId는 새로 생성되는 프로세스 ID 정보로 채워지게 된다. 프로세스 핸들은 프로세스 커널 오브젝트를 가리키기 위한 것이고, 프로세스 ID는 커널 오브젝트가 아니라 프로세스 자체를 구분짓기 위한 것이다. hThread와 dwThreadId도 각각 핸들과 쓰레드 Id를 가리키는 것이다.
커널 오브젝트와 Usage Count
커널 오브젝트를 생성한 주체가 커널 오브젝트를 소멸시킬 권한을 가지고 있다. CreateProcess 함수 호출이 커널 오브젝트의 생성 원인이기는 하나 프로세스 생성에 대한 요청이며, 이 과정에서 운영체제가 프로세스를 관리하고자 커널 오브젝트를 생성한다. 즉 커널 오브젝트 생성 주체는 운영체제이다.
커널 오브젝트를 생성한 것은 프로세스가 아니고 프로세스에 종속적이지도 않기 때문에 프로세스가 소멸된다고 해서 커널 오브젝트가 소멸된다고 말할 수 없다.
CloseHandle 함수
BOOL Close Handle(
HANDLE hObject;
);
위 함수는 핸들을 닫는다. 핸들을 반환한다고도 표현한다.
ex)
A프로세스는 실행과정에서 B프로세스를 생성한다. 그리고 나서 B프로세스의 핸들을 이용해서 CloseHandle 함수를 호출한다. 이는 B프로세스에 대해서 더이상 내가 관여할 바 아니니, B프로세스 핸들을 반환하라 라는 의미이다.
CloseHandle 함수가 호출되는 시점에서 B프로세스가 종료된다면, CloseHandle 함수는 프로세스 종료 및 커널 오브젝트 반환 기능이 있다고 결론 내릴 수 있다.
위 그림은 CloseHandle함수에 의해서 B프로세스 및 해당 커널 오브젝트가 소멸된다는 가정하에 진행되는 그림이다.
'Programming > Windows System Programming' 카테고리의 다른 글
프로세스간 통신(IPC) 메일 슬롯 (0) | 2020.07.10 |
---|---|
CloseHandle 함수와 프로세스 종료코드 (0) | 2020.06.13 |
커널 오브젝트에 대한 이해 (0) | 2020.06.10 |
프로세스 생성 (0) | 2020.06.08 |
프로세스의 스케줄링과 상태변화 (0) | 2020.06.07 |