상태에 대한 이해

커널 오브젝트는 두 가지의 상태를 지니며,
하나는 Signaled 상태(신호를 받은 상태) 이고, 하나는 Non-Signaled 상태이다.
특정 상황 하에서 커널 오브젝트의 상태는 Signaled 에서 Non으로 Non에서 Signal 로 변경된다.
즉 Non-Signaled 상태일 때 FALSE 값을 지니고, Signaled 면 TRUE 값을 가진다.


프로세스 커널 오브젝트의 상태에 대한 이해

커널 오브젝트의 상태는 리소스에 특정 상황이 발생하였음을 알려주기 위해 존재하는 것이다.
특정상황은 리소스마다 다르기 때문에 커널 오브젝트의 상태가 변하는 시점은 커널 오브젝트의 종류에 따라 달라진다.


프로세스 커널 오브젝트는 프로세스가 생성될 때 만들어지며,
처음 생성될 때 커널 오브젝트의 상태는 Non-signaled 상태에 놓이다가, 프로세스가 종료될 때 signaled 상태로 변경된다.
이는 일종의 약속이다. 그러므로 우리는 Signaled 상태의 프로세스 커널 오브젝트를 보고
프로세스가 종료되었음을 알 수 있다.
정리하자면 프로세스 커널 오브젝트는 프로세스 실행 중에는 Non-signaled 상태에 놓이며,
그러다가 프로세스가 종료될 때 Windows 운영체제에 의해 자동적으로 Signaled 상태가 된다.
그러나 종료될 때 Signaled가 되었다고 했는데, 그 반대의 경우는 어떠할까?
물론 불가능하다. 종료된 그 프로세스를 다시 살릴수가 없기 때문이다.
즉 일단 Signaled 가 되면 절대 다시 Non-Signaled 상태로 변경되지 않는다.

 

 

-- 커널 오브젝트의 두가지 상태를 확인하는 용도의 함수

커널 오브젝트가 상태를 지니도록 Windows 운영체제가 디자인 된 것은 프로그래머에게 다양한 기능을 제공하기 위함이다.
다양한 상황을 알리기 위함인데, 커널 오브젝트의 상태 정보가 우리에게 주는 이점이 있다. 이는 나중에 살펴보고, 우선
커널 오브젝트의 상태 정보를 확인하는데 사용되는 대표적인 함수 하나를 보자.
다음 함수는 핸들을 인자로 전달해서 커널 오브젝트의 상태를 확인하는데 사용되는 함수이다.

DWORD WaitForSingleObject(
 HANDLE hHandle;
 DWORD dwMilliseconds
);
// 실패시 WAIT_FAILED 가 리턴된다.

1) 상태 확인을 원하는 커널 오브젝트의 핸들을 인자로 젇날한다.
2) 이 함수는 인자로 전달된 hHandle 이 가리키는 커널 오브젝트가 Signaled 상태가 되엇을 때 반환한다.
그래서 함수의 이름이 Wait~ 으로 시작되며, 커널 오브젝트가 Signaled 상태가 될 때 까지 기다린다.
두번 째 인자는 커널 오브젝트가 Signaled 상태가 될 때까지 기다릴 수 있는 최대 시간을 밀리 세컨드 단위로 지정하는 용도로 사용된다.
즉 타임아웃을 설정하는 인자이며, INFINITE 를 인자로 전달시 Signaled 상태가 될 때까지 반환하지 않고 무한정 기다린다.

== 이 함수가 반환하는 상황은 다양하므로 함수 호출이 완료된 후 반환값을 꼭 확인해야 한다.

VALUE  의미
WAIT_OBJECT_0 커널 오브젝트가 Signaled 상태가 되었을 때 반환하는 값
WAIT_TIMEOUT 커널 오브젝트가 Signaled 상태가 되지 않고, 설정된 시간이 다 된 경우 반환되는 값
WAIT_ABANDONED 소유 관계와 관련하여 함수가 정상적이지 못한 오류 발생에 의해 반환하는 경우 반환되는 값


다음 함수는 상태를 확인하고자 하는 커널 오브젝트가 둘 이상이고, 핸들이 배열로 묶여 있다면 다음 함수를 활용하는 것이 편리하다

DWORD WINAPI WaitForMultipleObjects(
  __in          DWORD nCount,
  __in          const HANDLE* lpHandles,
  __in          BOOL bWaitAll,
  __in          DWORD dwMilliseconds
);

1) 배열에 저장되어 잇는 핸들 개수를 전달한다
2) 핸들을 저장하고 있는 배열의 주소 정보를 전달한다.
이 주소값을 시작으로 총 nCount 개의 핸들이 관찰 대상이 된다.
3) 관찰 대상이 모두  Signaled 상태가 되기를 기다리고자 하는지, 아니면 하나라도
Signaled 상태가 되면 반환할 것인지를 결정한다.

 

+ Recent posts