2015. 1. 27.

[OS]임계영역(Critical Section) 접근 동기화2 - 뮤텍스(Mutex) 기반의 동기화

 임계영역 동기화와 가장 기본적인 아이디어에 대해서 알아보았다.
 이번에는 유사하지만 조금 다른 동기화 기법을 알아보자.
 참고로 예제는 Windows system을 기반으로 하고 있다.


뮤텍스(Mutex)

 뮤텍스 역시 기본적인 아이디어는 critical section 기반의 동기화와 유사하다. 임계영역 기반의 동기화에 뮤텍스라는 오브젝트만 추가했다고 생각하자. 먼저 그림을 보자.

 임계영역 기반의 동기화와 마찬가지로 옷가게의 fitting room을 예로 들어 설명하겠다. fitting room은 한 사람만 들어가야 한다. 한 사람만 들어가려면 일반적으로 '사용중' 표시가 fitting room 문에 표시된다. '사용중'이라면 다른 사람은 fitting room 안으로 들어갈 수 없다. 여기까지의 설명은 critical section 기반의 동기화이다.

 이를 기본으로 하여 뮤텍스를 살펴보자. 이번 fitting room은 '사용중' 표시를 하는 대신에 사용자들에게 열쇠를 지급한다. 열쇠를 지급받은 사용자는 fitting room에 들어가서 옷을 갈아입는다. 열쇠가 없는 사람은 기다린다. 옷을 다 갈아입은 사람은 그 열쇠를 카운터에 맡긴다. fitting room을 사용할 사람은 카운터로 가서 열쇠를 받아서 사용한다. 

 이것이 바로 대략적인 뮤텍스에 대한 설명이다. fitting room이 임계영역이 되고, 열쇠가 mutex object 혹은 뮤텍스가 된다. 사용자는 쓰레드이다. 아래 그림을 보며 정리하자.



 임계영역에 진입하길 원하는 3개의 쓰레드가 있다. 고양이가 쓰레드이다. 앞에서 설명하였듯이 임계영역(그림에서는 protected resource)에 접근하기 위해서 뮤텍스라는 열쇠가 필요하다. 뮤텍스를 얻어야 임계영역에 진입할 수 있다.



 한 쓰레드가 뮤텍스를 획득했다. 이 쓰레드는 임계영역에 진입할 수 있게 된다.



 진입한 쓰레드는 임계영역을 처리한다. 이 때 다른 쓰레드들은 아무일도 못하고 쉬게 된다. 뮤텍스가 반환될 때까지 쉬면서 기다릴 수 밖에 없다.(BLOCK 상태를 의미한다)



  임계영역에 있던 쓰레드가 빠져나와 뮤텍스를 반환했다. 쉬던 쓰레드들이 이제 뮤텍스를 가질 수 있다. 이 쓰레드들 중 하나가 뮤텍스를 가지게 될 것이다. 그리고 지금까지의 과정을 반복된다.


 뮤텍스 기반의 동기화 기법

 먼저 CreateMutex() 함수로 뮤텍스를 생성한다.

 WaitForSingleObject() 함수로 뮤텍스는 한 쓰레드만 가질 수 있다. 이 함수는 signaled 상태의 커널 오브젝트를 반환할 경우, 해당 커널 오브젝트를 non-signaled 상태로 변경해버린다. 결국 한 쓰레드가 뮤텍스를 획득하자마자 뮤텍스커널 오브젝트 상태는 non-signaled 상태가 되기 때문에 다른 쓰레드들은 뮤텍스를 가질 수 없다. 이 때문에 하나의 쓰레드만 임계영역에 진입할 수 있다.

 임계영역을 빠져나온 쓰레드는 뮤텍스를 반납해야 한다. 그래야지 다른 쓰레드가 뮤텍스를 얻어 임계영역에 접근할 수 있다. 이를 위해 ReleaseMutex() 함수를 호출한다.

 그리고 뮤텍스 리소스를 반납한다.

댓글 없음:

댓글 쓰기