윈도우에서 사용되는 리소스는 커널 오브젝트라는 것을 가진다.
(커널 오브젝트 : Windows 운영체제에서 리소스들을 관리하기 위한 데이터를 저장하는 메모리 블록.
여기서 리소스는 프로세스, 쓰레드, 파일 등을 말한다.)
유저의 리소스 생성 요청을 수신한 운영체제가 리소스 생성 뒤 관리를 위해 커널 오브젝트를 생성하는 것.
커널 오브젝트가 생성되면 커널 오브젝트에 핸들이 부여되는 형태를 가진다.
// CreateProcess() 를 실행할 때 전달되는 프로세스 정보 구조체.
typedef struct _PROCESS_INFORMATION
{
HANDLE hProcess; // 커널 오브젝트 구분 위한 핸들
HANDLE hThread;
DWORD dwProcessId; // 프로세스 구분 위한 ID
DWORD dwThreadId;
} PROCESS_INFORMAION;
커널 오브젝트는 시그널 상태와 논시그널 상태를 가진다.
WaitForSingleObject() (혹은 Multiple) 함수로 특정 핸들값(들)이 시그널 상태가 될 때까지 해당 함수가 실행된 스레드의 진행을 대기시킬 수 있다.
CreateEvent()는 이벤트 핸들을 생성하는데, 매개변수로 초기 시그널 상태와 자동 리셋 여부를 설정한다.
자동 리셋이란 해당 핸들이 시그널 상태가 된 뒤, 자신을 기다리는 스레드(WaitFor~~~()) 하나를 활성화 시킨 뒤 자동으로 논시그널 상태로 전환되는 것을 말한다.
SetEvent(HANDLE _eventHandle) 를 통해 해당 핸들을 시그널 상태로 전환한다.
ResetEvent(HANDLE _eventHandle) 은 해당 핸들을 논시그널 상태로 전환. 자동리셋이 안될경우 더욱 중요.
- 커널 오브젝트에 관련된 주의사항
한 프로세스에서 자식 프로세스를 생성하고 종료하면 부모 프로세스가 종료될 때 까지 자식 프로세스의 커널 오브젝트는 제거되지 않는다.
부모 프로세스가 계속 참조하고있기 때문. CloseHandle()을 통해 부모의 참조를 해제시켜주어야 한다.
'프로그래밍 > 미분류' 카테고리의 다른 글
[C#] using의 두가지 용도 (0) | 2020.05.03 |
---|---|
코딩 습관 분석글 (0) | 2018.07.10 |
개발자의 평생공부에 관한 좋은 글 (0) | 2018.07.10 |
명령 (Command) 패턴 (0) | 2018.07.02 |
180629 근황 (0) | 2018.06.29 |