삽질의 현장/- 윈도우 시스템

#025_WIndow_System_커널 모드 동기화 객체_이벤트

shovelman 2015. 9. 25. 01:19


안녕하세요 삽잡이입니다.


이번 시간에는 커널 모드 동기화 객체 중에 이벤트에 대해서 알아보려고 합니다.


이벤트는 다른 동기화 오브젝트와 동작방식 자체가 좀 다릅니다.

지금까지 사용했던 동기화 객체들은 데이터 보호에 사용이 되었던 것이고,

이벤트는 일반적으로 순서 제어에 사용됩니다.

즉, 내가 원하는 시점에 그 이벤트가 신호 상태가 되도록 만드려는 매커니즘에 많이 사용됩니다.


이벤트는 '어떤 사건', '어떤 신호'를 말합니다.

어떤 사건이 주어지면 신호 상태로 바꾸는 메커니즘이라는 것입니다.

이벤트도 커널 오브젝트이기 때문에 신호, 비신호 상태를 가집니다.


이벤트에는 두 가지 종류가 있습니다. 바로 수동 이벤트와 자동 이벤트입니다.



우선 이벤트를 생성하기 위한 함수입니다.

수동 이벤트와 자동 이벤트를 결정하는 인자는 두번째 인자입니다.

그리고, 세번째 인자는 초기 상태를 결정합니다.

즉, 처음에 신호 상태로 만들지, 비 신호 상태로 만들지 결정하는 것입니다.


아무튼...

쓰레드나 프로세스가 종료되면 자동으로 해당 커널 오브젝트들이 신호 상태로 변경되는 것과 달리,

이벤트 객체는 자동으로 신호 상태가 되지 않습니다.

따라서 우리가 직접 이벤트 객체의 상태를 신호 상태로 변경시켜야합니다.

여기서 이벤트의 종류가 나뉘는 것입니다.


이벤트 오브젝트가 신호 상태가 되어 Blocking 상태에 있던 쓰레드가 빠져 나오게 되면,

빠져 나온 이후 이벤트 객체는 어떠한 상태에 놓일까요?

신호 상태 그대로라면... 수동 모드,

자동으로 비 신호 상태가 된다면 자동 모드가 되는 것입니다.


위에서 언급했듯이 이벤트도 누군가에 의해 신호 상태가 됩니다.

신호 상태로 만들어주는 함수는 바로 SetEvent입니다.


자동 이벤트와 수동 이벤트에 대해서 자세하게 살펴보도록 하겠습니다.


우선, 자동 이벤트를 생각해봅시다...

쓰레드들은 신호 상태를 감지합니다. Wait함수가 Return 됬다고 해봅시다.

Return 됬다는 것은 이벤트가 신호 상태가 됬다는 것을 의미합니다.


그렇다면, 기다리던 쓰레드들이 모두 감지를 하고 그 중 한놈만이 가져가게 됩니다.

즉, 바로 비신호 상태로 만들고 동작한다는 것입니다.

이게 바로 자동 이벤트이며 자동으로 비신호 상태로 돌아가는 것을 뜻합니다.


다음으로 수동 이벤트를 생각해보도록 하겠습니다.

수동으로 이벤트를 바꾸면 신호 상태가 되고, 다시 비신호 상태로 돌아가지 않습니다.

그러니까, 신호 상태로 바뀌는 순간 모든 쓰레드들이 날뛰게 됩니다.

그래서 수동 이벤트에서는 ResetEvent를 쌍으로 데리고 다닙니다.

즉, SetEvent와 ResetEvent 함수를 사용해서 신호, 비신호 상태를 만들 수 있게 됩니다.


마지막으로 PulseEvent에 대해서 알아보도록 하겠습니다.

Pulse는 심장 박동을 뜻합니다. 

컴퓨터에서는 시간이 매우 중요한데 (어디서나 마찬가지겠지요...)

하드웨어에서 시간의 단위를 Pulse라고 합니다...


아무튼... 소프트웨어에서 Pulse라는 뜻은

신호를 하나 딱! 줄 때 pulse라고 합니다. 딸깍!

딸깍 한다고 해서 pulse.... 허허...


PulseEvent 함수는 딱 한번 신호 상태를 줬다가,

다시 비신호 상태로 만들어 버리는 함수입니다.


SetEvent 함수를 쓴 다음 바로 ResetEvent 함수를 사용하면 어떻게 될까요?

Set 하는 순간 신호 상태로 변하고, 대기 상태에 있던 놈들이 모두 감지를 하겠지요...

SetEvent에서 신호 상태가 변한 다음

Reset 하는 시간이 오래 걸리는 상황에 쳐한다고 생각해봅시다...


음... 나는 한번만 신호 상태가 되어서 대기하던 놈이 실행되게 하고 싶은데,

SetEvent에서 ResetEvent로 가는 사이가 오래 걸리게 되면,

문제가 발생할 수 있다는 것입니다.


하지만, PulseEvent 함수는 이를 보장해줍니다.

딱 한번 신호 상태로 만들어 줬다가 다시 비신호 상태로 만들어 주는 것을

보장한다는 것입니다...


이번 시간은 여기까지 하겠습니다!

이상 삽잡이였습니다!