상세 컨텐츠

본문 제목

07.3 Signaled vs Non-Signaled

Programming/Windows System

by RACC8N 2020. 4. 18. 15:22

본문

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 함수를 호출하면 된다. 종료코드는 프로세스의 종료 이유를 담는 용도로 사용하는 것이 일반적이다.

관련글 더보기

댓글 영역