운영체제

[운영체제] Thread(2) - Thread 동기화

재담 2022. 3. 11. 00:03

Thread 동기화

스레드 동기화에는 뮤텍스(Mutex), 세마포어(Semaphore), 모니터(Monitor) 등이 있다. 세 가지의 공통점은 모두 운영체제의 동기화 기법이라는 것이다. 각자의 특징을 살펴보자.

 

뮤텍스(Mutex)

뮤텍스는 Mutual Exclusion의 약자로, 스레드의 동시 접근을 허용하지 않는다는 의미이다. 뮤텍스의 스레드 동기화 방법은 임계 영역(Critical Section)에 들어가기 위해 이 뮤텍스를 가지고 있어야 들어갈 수 있다. 일종의 자물쇠 역할을 한다고 볼 수 있다. 임계 영역에 들어간 스레드가 뮤텍스를 이용해 임계 영역에서 본인이 나올 때까지 다른 스레드가 못 들어오게 내부에서 자물쇠로 잠근다.

 

세마포어(Semaphore)

세마포어는 뮤텍스와 비슷한 역할을 하지만 세마포어는 동시 접근 동기화가 아닌 접근 순서 동기화에 더 관련 있다. 

 

모니터(Monitor)

모니터는 뮤텍스와 Condition Variables을 가지고 있는 동기화 메커니즘이다.

 

 

위의 동기화 방법들은 개념적으로 차이가 있다. 뮤텍스와 모니터는 상호 배제를 함으로써 임계 영역에 하나의 스레드만 들어갈 수 있다. 세마포어는 하나의 스레드(Binary Semaphore)만 들어가거나 여러 개의 스레드(Counting Semaphore)가 들어가게 할 수도 있다.

 

뮤텍스 vs 세마포어

  • 세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없다. 
  • 세마포어는 소유할 수 없는 반면 뮤텍스는 소유할 수 있고 소유자가 이에 책임을 진다.
  • 뮤텍스는 한 개만 동기화되지만 세마포어는 한 개 이상을 동기화할 수 있다.

 

세마포어 vs 모니터

  • 세마포어는 카운터라는 변수로 프로그래머가 상호 배제나 정렬의 목적으로 사용 시 매번 값을 따로 지정해줘야 한다.
  • 모니터는 캡슐화되어 있기 때문에 synchronized, wait(), notify() 등의 키워드를 이용해 좀 더 편하게 동기화할 수 있다.
  • 자바에서는 모니터를 모든 객체에게 기본적으로 제공하고 있는 반면 C에서는 모니터를 사용할 수 없다.

 

모니터 vs 뮤텍스

  • 뮤텍스는 다른 프로세스 간에 동기화를 위해 사용한다.
  • 모니터는 하나의 프로세스 내에 다른 스레드 간에 동기화할 때 사용한다.
  • 뮤텍스는 보통 커널에 의해서 제공된다.
  • 모니터는 프레임워크나 라이브러리 자체에서 제공된다.
  • 뮤텍스는 무겁고 느리며, 모니터 가볍고 빠르다.

Reference