본문 바로가기

.Tip

모니터, 세마포어, 뮤텍스, 동기화

( 회사 온라인 강좌 내용 중 )


* 모니터, 세마포어, 뮤텍스, 동기화

전통적으로 시스템의 한정된 자원이, 특정 프로세스에 점유되어있는지 여부를 표시하기 위해서

많이 사용했던 용어가 세마포어(Semaphore) 이다.

시스템의 각 리소스마다 세마포어라는 플래그가 존재하고, 이 세마포어를 먼저 획득하는 프로세스만이

리소스를 점유해 사용할 수 있도록 하는 것이다.


자바에서는 이 개념을 객체에 적응해서 뮤텍스 (mutex: Mutual Exclusion) 라는 용어로도 부른다.

즉, 동시에 한개의 객체 인스턴스에 접근할 수 있는 Thread는 오직 한개만이 존재하도록 한다는 개념이다.


다른 말로는 Object Lock이라는 말로도 표현하는데, 각 Object(인스턴스) 별로 Lock을 먼저 획득하는

Thread만이 해당 Object를 사용할 수 있다는 개념이다.

당연히 이 Thread가 Lock을 해제하기 전까지는, 다른 Thread는 그 Object에 아무런 작업도 할 수 없게 된다.


* Race Condition 과 Dead Lock

Race Condition이란, 어떤 Object를 사용하기 위해 여러개의 Thread가 경쟁을 하는 상태를 의미한다.

결국 이 Object의 Lock을 먼저 획득하는 하나의 Thread만이 경쟁에서 이기게 되고, Object의 제어권을 갖게 된다.

다른 Thread들은 이 Thread가 제어권을 놓기 전까지 다시 대기상태가 되는 것이다.


그런데, 어떤 경우에는 두개의 Thread가 자신이 필요로 하는 Object의 제어권을 상대방이 갖고 있어서

더이상 작업을 진행하지 못하는 경우가 발생한다.


예를들어, 도서관에서 A 사람은,  a라는 책을 보던중에, b라는 책을 빌리려 하고,

                                  B 사람은, b라는 책을 보던중에, a라는 책을 빌리려 한다.

그러면, 이와 같은 상황은 두 사람 모두 책을 빌려 볼 수 없는 것이다.


이를 바로 데드락(Dead Lock)이라 한다.