2015. 1. 28.

[OS]임계영역(Critical Section) 접근 동기화3 - 세마포어(Semaphore) 기반의 동기화

뮤텍스에 대한 지식을 가지고 있다면 세마포어는 공짜이다.
왜냐하면 뮤텍스를 세마포어 중 하나로 볼 수 있기 때문이다.

이 글은 Windows system을 기반으로 설명하고 있습니다.


세마포어(semaphore)

 critical section과 뮤텍스를 설명할 때는 옷가게의 fitting room을 예로 들었다. 세마포어는 fitting room으로 설명하기 힘들다. 그래서 별다방 같은 카페로 설명하겠다.

 내가 운영하는 별다방이 있다. 돈이 부족해서 좌석은 테이블이 5개 밖에 안된다. 상황을 좀더 단순화하기 위해서 한 테이블에는 한 명만 사용할 수 있다. 손님이 들어와서 빈 테이블을 보면 찾아서 앉고 시간을 보내다가 집에 간다. 이 카페는 5개의 테이블만큼 손님을 받을 수가 있다. 5개의 테이블이 가득 차면 다음 손님은 기다려야 한다. 옷가게 fitting room과 비교해보자. fitting room에서는 한 명만 이용할 수 있었다. 하지만 카페에서는 다섯 테이블을 이용할 수 있다. 이 점이 뮤텍스와 세마포어의 가장 큰 차이점이다.

 카페가 critical section이 되고, 손님은 쓰레드이다. 5개의 테이블이 바로 세마포어이다. 뮤텍스가 5개가 되는 상황으로 이해할 수 있다. fitting room으로 상황을 바꾸면 이렇게 이해할 수 있다. 최대 5명이 동시에 이용할 수 있는 큰 fitting room이 있다. 개인의 권리 따위는 없는 이상한 fitting room이다. 여튼 이런 fitting room을 이용하려면 5개의 열쇠가 필요하다. 5개의 열쇠, 즉, 5개의 뮤텍스가 바로 세마포어가 된다. 그래서 세마포어는 뮤텍스와 다르게 count와 관련된 사항이 중요하다.


 위 그림은 뮤텍스를 설명하는 그림이다. 세마포어는 다수의 뮤텍스로 이해할 수 있다고 했다. 이를 그림으로 표현하면 다음과 같다.


 임계영역으로 들어갈 수 있는 열쇠인 세마포어가 3개이다. 어떤 쓰레드가 세마포어를 얻으면 남은 세마포어의 수는 2개이다. 또 어떤 쓰레드가 세마포어를 얻어서 진입했다. 남은 세마포어의 수는 1개이다. 또 어떤 쓰레드가 세마포어를 얻어서 진입했다. 남은 세마포어의 수는 0개이다. 또 어떤 쓰레드가 임계영역에 진입할 때, 더이상 남은 세마포어가 없기 때문에 임계영역 내에 어떤 쓰레드가 빠져나오면서 세마포어를 반납할 때까지 기다려야 한다.

 이상이 세마포어에 대한 간략한 설명이다. 그럼 이제 세마포어를 사용하는 코드를 보도록 하자.


세마포어기반의 동기화


 사용하는 형태는 뮤텍스와 유사하다. 다른 점이라면 세마포어는 생성할 때, 뮤텍스와 달리 접근 가능한 쓰레드의 개수를 정할 수 있다. CreateSemaphore() 함수의 2번째 인자이다. 뿐만 아니라 세마포어가 지닐 수 있는 값의 최대 크기를 지정할 수도 있다. 3번째 인자이다. 최대 크기를 1로 정하면 이 세마포어는 뮤텍스와 동일한 기능을 하게 된다. 접근 가능한 쓰레드의 개수가 1개라면 뮤텍스와 동일하기 때문이다.

댓글 없음:

댓글 쓰기