Windows 운영체제에 의해서 생성되는 커널오브젝트는 두 가지 상태를 지닌다.
이는 리소스에 특정 상황이 발생되었음을 알리기 위한 용도이다.
커널 오브젝트의 두 가지 상태(State)
- Signaled 상태 (신호를 받은 상태)
- Non-Signaled 상태 (신호를 받지 않은 상태)
커널 오브젝트에 커널 오브젝트의 상태 정보를 저장하는 멤버 변수가 있다. [FALSE : Non-Signaled, TRUE : Signaled]
※ 커널 오브젝트의 상태가 변하는 시점은 커널 오브젝트 종류에 따라서 달라진다.
프로세스 커널 오브젝트의 상태
프로세스 커널 오브젝트는 프로세스가 생성될 때 만들어진다.
> 처음 커널 오브젝트가 생성되면 커널 오브젝트의 상태는 Non-Signaled 상태에 놓이게 된다.
> 그러다가 프로세스가 종료되면 Signaled 상태로 변경된다.
※ Signaled 상태의 프로세스 커널 오브젝트를 보고 프로세스가 종료되었음을 알 수 있다.
(프로세스 실행 중에는 Non-Signaled상태, 프로세스 종료 시에는 Signaled상태)
Non-Signaled -> Signaled 변경은 프로세스 종료시 가능하지만, Signaled -> Non-Signaled 변경은 불가능하다.
※ 종료된 프로세스는 다시 살릴 수 없기 때문에 새로 다시 실행해야 한다.
커널 오브젝트의 상태 확인 함수
1. WaitForSingleObject ()
hHandle | 상태 확인을 원하는 커널 오브젝트의 핸들 |
dwMilliseconds | hHandle이 가리키는 커널 오브젝트가 Signaled 상태가 될 때 까지 기다릴 수 있는 최대 시간 (INFINITE : 무한정 기다림) |
WaitForSingleObject의 반환 값
WAIT_OBJECT_0 | 커널 오브젝트가 Signaled 되었을 때 반환 |
WAIT_TIMEOUT | 커널 오브젝트가 Signaled 되지 않고, dwMilliseconds 인자를 통해서 설정된 시간이 다 된 경우 반환 |
WAIT_ABANDONED | 소유 관계와 관련하여 함수가 정상적이지 못한 오류 발생에 의해서 반환하는 경우에 반환 [대신 반환] |
2. WaitForMultipleObjects()
nCount | 배열에 저장되어 있는 핸들 개수 |
lpHandles | 핸들이 저장하고 있는 배열의 주소 정보 전달, 이 주소값을 시작으로 총 nCount개의 핸들을 관찰 |
bWaitAll | TRUE : 관찰 대상이 모두 Signaled 되기를 기다림, FALSE : 하나라도 Signaled가 되면 반환 |
dwMilliseconds | 타임아웃 설정 (WaitForSingleObject()와 같음) |
종료코드 (Exit Code)
종료코드는 종료되는 프로세스의 커널 오브젝트에 저장된다. 따라서 종료코드를 부모 프로세스에 전달할 수 있다.
종료코드를 얻는 함수 GetExitCodeProcess()
hProcess | 종료코드를 얻을 프로세스의 핸들 |
lpExitCode | 종료코드를 저장할 공간 주소 |
이것만은 알고 갑시다.
1. 프로세스 통신 기법이 별도로 존재하는 이유
- 프로세스는 개별적으로 독립적인 메모리 공간을 유지하며 다른 프로세스 메모리 공간에 접근할 수 없다. 따라서 둘 이상의 프로세스가 데이터를 주고받기 위해서는 프로세스 통신 기법이 필요하다.
2. 메일슬롯의 특성
- 메일슬롯은 단 방향 통신과, 브로드캐스팅 방식을 지원한다.
3. 커널 오브젝트의 두 가지 상태가 지니는 의미
- Signaled 상태는 신호를 받은 (프로세스가 소멸될때의 상태), Non-Signaled 상태는 신호를 받지 않은 (프로세스가 진행 중인 상태)를 말하며, 커널 오브젝트의 상태는 커널 오브젝트의 종류에 따라 변경 시점이 다르다.
4. WaitForSingleObject, WaitForMultipleObjects 함수와 커널 오브젝트의 관계
- WaitForSingleObject는 커널 오브젝트를 감시하는 역할을 한다. 커널 오브젝트가 Non-Signaled상태에 있는 경우 함수를 반환하지 않고 블로킹 상태에 있다가 Signaled 상태가 되면 함수를 빠져나온다. WailtForMultipleObjects는 둘 이상의 커널 오브젝트를 감시할때 사용한다.
5. 종료코드 (EXIT CODE)
- main 함수의 return문에 의한 반환값은 프로세스의 종료코드로 커널 오브젝트에 저장된다. 종료코드를 얻기 위해서는 GetExitCodeProcess 함수를 호출하면 된다. 종료코드는 프로세스의 종료 이유를 담는 용도로 사용하는 것이 일반적이다.
08.2 파이프 방식의 IPC (0) | 2020.04.18 |
---|---|
08.1 핸들 테이블과 오브젝트 핸들의 상속 (0) | 2020.04.18 |
07.2 메일슬롯 방식의 IPC (0) | 2020.04.18 |
07.1 프로세스간 통신(IPC)의 의미 (0) | 2020.04.18 |
06.3 커널 오브젝트와 Usage Count (0) | 2020.04.05 |
댓글 영역