본문 바로가기

프로그래밍

커널모드 동기화 기법 - 뮤텍스(Mutex), 세마포어(Semaphore), 이벤트(Event)

1. Mutex 커널 오브젝트 기반 동기화


WaitForSingleObject() 호출 결과는 2가지
- 호출 후 블로킹 상태
: Mutex 오브젝트가 다른 쓰레드에게 소유되어서 현재 non-signaled 상태에 놓여있는 상황
- 호출 후 반환된 상태
: Mutex 오브젝트의 소유가 해제되었거나 소유되지 않아서 signaled 상태에 놓여있는 상황

Mutex는 WaitForSingleObject() 가 반환될 때, 자동으로 non-signaled 상태가 되는 auto-reset 모드 커널 오브젝트.
따라서, WaitForSingleObject()는 결과적으로 Mutex를 소유할려고 할 때 호출하는 함수가 된다.


2. Semaphore 커널 오브젝트 기반 동기화

세모포어 값이라 불리는 정수를 기반으로 동기화가 이뤄지고, 이 값이 0보다 작아질 수 없다. 윈도우의 세마포어 값은 Semaphore 커널 오브젝트에 등록

세마포어 값이 0 - non-signaled
세마포어 값이 0보다 큰 경우 - signaled
WaitForSingleObject()가 호출되면 
- 세마포어 값이 0보다 큰 경우에 반환 -> 세마포어 값을 1 감소 시키면서 non-signaled 상태가 되게 함(세마포어 값이 1 감소해서 0이 되는 경우)
- 0이라면 블로킹 상태


3. Event 커널 오브젝트 기반 동기화

Mutex나 Semaphore와 다른 점 : auto-reset 모드와 manual-reset 모드 중 하나를 선택
-> WaitForSingleObject()가 반환을 한다고 해서 non-signaled 상태로 되돌려지지 않는다.