LISTORY

[윈도우즈 시스템 프로그래밍] Signaled vs Non-Signaled 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] Signaled vs Non-Signaled

LiStoryTeller 2018. 6. 17. 14:57


뇌를 자극하는 윈도우즈 시스템 프로그래밍 YouTube 강의 정리이다.


이번에는 저번 강의에 이어 7장 내용을 계속 정리하겠다. 


이번 강의 주제는 Signaled vs Non-Signaled 이다.


⊙ YouTube 강의 주소 ⊙ ☞ Signaled vs Non-Signaled




Signaled vs Non-Signaled


⊙ 커널 오브젝트의 상태


* 커널 오브젝트?

  - 커널의 리소스의 정보를 담고있는 데이터 블록


예전에 설명했던 커널 오브젝트안에 멤버 중엔, 커널 오브젝트의 상태를 반영하기 위한 boolean 형 멤버가 존재한다.


이 멤버의 값에 따른 상태는 다음과 같다.


 TRUE   : SIGNALED 상태

 FALSE  : NON-SIGNALED 상태


그렇다면 이 값은 왜 존재하며, 이 상태가 변경되는 시점은 언제일까?


리소스 생성 시, 커널 오브젝트의 핸들이 생성된다.


근데 이는 리소스에 따라 다르다. 예를 들어, 메일 슬롯은 생성 시 반환되는 값을 통해 핸들을 받고


프로세스의 경우, 자식 프로세스 생성 시 구조체를 통해 핸들을 받는다.


커널 오브젝트의 상태가 나타내는 의미도 리소스 별로 다르다.


그러므로 리소스의 상태를 나타내는 커널 오브젝트의 상태가 무슨 의미인지는 리소스 별로 공부를 따로 해야한다.


이번 강의에서는 프로세스 기준으로 살펴보겠다.


부모 프로세스는 자식 프로세스를 생성하고, 생성과 동시에 자식 프로세스의 커널 오브젝트가 생성되고 핸들이 반환된다.


생성된 커널 오브젝트는 생성과 동시에 Non-Signaled 상태가 된다. 이 의미는 현재 프로세스가 실행중이라는 뜻이다.


그리고 프로세스가 종료되면 이 상태는 Signaled 상태로 바뀐다. 


즉, 프로세스가 실행 중일 때와 종료되었을 때로 나뉘며, 이때 상태는 각각 Non-signaled 상태, 그리고 Signaled 상태이다.


이유는 다음과 같다.


이 커널 오브젝트의 핸들을 가지고 있는 프로세스가, 커널 오브젝트의 프로세스의 현재 상태를 알 수 있게 하기 위해서이다.


즉, 현재 프로세스의 상태를 알기 위한게 커널 으브젝트의 상태 멤버이다.



이를 통해 프로세스 종료 정보를 알 수 있다.


그렇다면 이 상태들을 확인하기 위해선 어떤 방법을 쓸 수 있을까?



⊙ 상태 관찰 시나리오


모든 리소스의 상태를 관찰하는 방법은 다음과 같다.




부모 프로세스가 자식 프로세스 생성하면 핸들 값을 얻게 된다. 여기서 그 값은 7이다.


부모 프로세스는 이 핸들 값을 통해 자식 프로세스가 살아있는지 여부를 알 수 있는데, 이를 알려주는 함수가 WaitForSingleObject()이다.


이 함수의 매개변수는 사실 두갠데, 여기서는 하나인것처럼 그려두었다.


여하튼 이 함수의 매개변수에 7을 넣어 호출하면, 7에 대한 커널 오브젝트의 상태를 물어보는 것이 된다.


반응은 다음과 같다.


1. signaled : 바로 반환

2. non-signaled : blocking. 함수가 빠져나오지 않고 멈춘다 / 또는 바로 반환


즉 이 함수는 오브젝트의 상태값을 반환한다기 보단, 해당 오브젝트가 signaled 상태가 될때까지 기다리는 함수이다.


대상 오브젝트가 signaled 상태면 바로 반환되고, 아닐 경우 signaled 상태로 바뀌는 순간 빠져나온다.


어떤 리소스에 관심이 있어서 걔가 signaled 상태가 되길 기다리거나, signaled 되야 어떠한 일 진행할 경우 이 함수를 호출하면 된다.











Comments