프로그래밍/미분류2019. 10. 23. 15:38

윈도우에서 사용되는 리소스는 커널 오브젝트라는 것을 가진다.

(커널 오브젝트 : 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
Posted by 초은하