뮤텍스, 세마포어, 모니터의 차이점은 무엇일까?

상호배제, 임계영역, 뮤텍스, 세마포어, 모니터 등등 C/S Operating System 과목에서 쉽게 볼 수 있는 단어들이다. 다만 머리속에선 금세 사라지는 개념들..;

아직도 헷갈리는 내가 이상한건가? 또 까먹기 전에 정리하고 넘어갈까한다.

상호배제(Mutual Exclusion), 임계영역(Critical Section/Region)이란?

Multi Threading/Processing 같은 Conccurrent한 환경에서 공유 자원에 동시에 접근할 경우 다양한 문제점이 발생 할 수 있다. 이런 상황을 예방하기 위해 "야 우리 동시에 접근 안하는게 어때?"라는 약속이 필요한데 이게 바로 상호배제이다. 또 임계영역이란 이런 공유 자원에 접근하는 코드 영역을 의미한다.

그나저나 相互排除, 臨界領域 정말 한자어로 만들어 놓으면 왠지 이해하기 더 힘들어진다. 그냥 영어로 말하는게 어떨까? -그래서 이하 영어 설명-

Mutual Exclusion을 해결하기 위한 방법들

아무튼 이런 Mutual Exclusion을 해결하기 위해 Mutex, Monitor, Semaphore 등 다양한 방법들이 있다. 라고 끝내기엔 포스팅이 너무 짧아질 것 같으니.. 그 차이점을 간단히 설명 하겠다.

1) Mutex

일종의 Locking 매커니즘이다. lock을 가지고 있을 경우에만 공유 데이터에 접근 가능하다. 일부 음식점들은 공용 화장실 관리 차원에서 화장실을 잠궈두고(Locking) 다닌다. 손님들이 화장실에 가려면 주인에게 열쇠를 받은 후 가야한다. 물론 다음 손님이 화장실에 가려면 앞 손님이 열쇠를 반납해야 갈 수 있다. 이렇게 열쇠가 있는-lock을 가지고 있는 경우-에만 공유자원(화장실)에 접근할 수 있다. 이게 바로 Mutex라고 보면 된다. 유의할 점은 Lock에 대한 소유권이 있다는 점이다. 열쇠를 획득한 사람만 반납할 수 있다.

2) Semaphore

세마포어는 동시에 리소스에 접근할 수 있는 '허용 가능한 Counter의 갯수'를 가지고 있는 Counter로 보면 된다. 예를 들면 107호 병실에 방문객용 의자가 5개 있다고 치자. 간호사는 이 병실에 방문자가 5명만 들어갈 수 있도록 허용하고 나머지 방문객들은 밖에서 대기하도록 한다. Counter 갯수만큼 공유자원(병실)에 접근할 수 있다. 이 세마포어 Counter의 갯수에 따라 1개의 경우 Binary Semaphore, 2개 이상의 경우 Counting Semaphore라고 불린다. Binary Semaphore의 경우 개념적으로 Mutex와 같다고 볼 수 있다.

3) Monitor

Mutex(Lock)와 Condition Variables(Queue라고도 함)을 가지고 있는 Synchronization 메카니즘이다. 예를 들어 자바에서 모든 객체는 Object 클래스를 상속 받는다. 이 Object 클래스에는 wait(), notifyAll(), notify() 메소드를 가지고 있는데 이게 바로 Condition Variables 역할이라고 보면 된다. 고로 모든 자바 객체는 Monitor를 가지고 있다. 자바에서는 Mutual Exclusion 해결을 위한 구현체로 Synchronized 키워드가 있다. 예를 들어 Synchronized가 메소드에 선언되어있고, 쓰레드A가 이미 Lock을 획득해서 Critical Section(메소드)을 수행중이라고 가정하자. 쓰레드B가 동일한 메소드를 수행하기 위해 해당 Object의 Lock을 획득해야 할 것이다. 이 Lock이 반환될 때까지 대기를 해야하는데 그 때 사용되는게 바로 Monitor다. 쓰레드A가 Lock을 반환하면 쓰레드B는 기다렸다가 Lock을 획득하게 된다. 그리고 Critical Section인 메소드를 수행할 수 있게 된다. 물론 Synchronized 키워드를 사용했을 때 자동적으로 수행되는 내부 동작이고, 별도로 명시적인 Monitor를 구현할 수도 있다.(이건 길어질거 같으니 별도 포스팅으로….) 아무튼 Monitor는 이렇게 Mutex(Lock)과 Condition Variables을 이용해서 Mutual Exclustion을 해결하고 있다. 그 외 Monitor의 다른 정의로는 공유자원에 안전하게 접근하기 위해 Mutual Exclusion가 랩핑된 Thread-Safe한 클래스, 객체, 모듈들을 의미하기도 한다.

참고

http://www.quora.com/Semaphore-vs-mutex-vs-monitor-What-are-the-differences
http://stackoverflow.com/questions/23511058/difference-between-mutex-semaphore-spin-locks/24582076#24582076
http://baptiste-wicht.com/posts/2010/09/java-concurrency-part-5-monitors-locks-and-conditions.html
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html
http://en.wikipedia.org/wiki/Mutualexclusion
http://en.wikipedia.org/wiki/Critical
section

http://en.wikipedia.org/wiki/Lock(computerscience)
http://en.wikipedia.org/wiki/Semaphore(programming)
http://en.wikipedia.org/wiki/Monitor
(synchronization)

http://javarevisited.blogspot.kr/2011/04/synchronization-in-java-synchronized.html
http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html
http://www.javaworld.com/article/2076971/java-concurrency/how-the-java-virtual-machine-performs-thread-synchronization.html
http://blog.takipi.com/5-things-you-didnt-know-about-synchronization-in-java-and-scala/
http://www.artima.com/insidejvm/ed2/threadsynch.html

뮤텍스, 세마포어, 모니터의 차이점은 무엇일까?”에 대한 1개의 생각

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.