본문 바로가기

CS

뮤텍스와 세마포어

뮤텍스(Mutex)와 세마포어(Semaphore)

  • 프로세스 간 메시지를 전송하거나, 공유메모리를 통해 공유된 자원에 여러 개의 프로세스가 동시에 접근하면 Critical Section에 문제가 발생할 수 있다. 
  • 이를 해결하기 위해 데이터를 한번에 하나의 프로세스만을 접근할 수 있도록 제한을 두는 동기화 방식을 취해야 한다.
  • 동기화 도구에는 뮤텍스(Mutex)와 세마포어(Semaphore)가 있다. 이들은 공유된 여러 데이터를 여러 프로세스/스레드가  접근하는 것을 막는 역할을 한다.

뮤텍스(Mutex)

  • 공유된 자원의 데이터 혹은 임계영역 (Critical Section)등에 하나의 Process혹은 Thread가 접근하는 것을 막는다.
  • 임계구역을 가진 스레들의 실행시간이 서로 겹치지 않고 단독으로 실행되도록 하는 기술.  (상호배제 _Mutual exclusion)
  • 한 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호배제 기법
  • Key에 해당하는 어떤 객체(Object)가 있으며, 이 객체를 소유한 스레드/프로세스만이 공유자원에 접근할 수 있다.
  • 공유 리소스에 대한 접근을 조율하기 위해 동기화(Synchronization)또는 락(Lock)을 사용함으로써 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다.

세마포어(Semaphore)

  • 공유된 자원의 데이터 혹은 임계영역(Critital Section)등에 여러 Process 혹은 Thread가 접근하는 것을 막아줌(동기화 대상이 하나 이상)
  • 스레드/프로세스의 수를 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성
  • 공유 자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근할 수 있고, 각 프로세스는 세마포어의 값을 확인하고 변경할 수 있다.
  • 세마포어는 영화관 예매와 비슷합니다. 영화관의 자리를 확인하고 남이있는 자리가 없다면 자리가 나타날 때 까지 기다려야합니다.
  • 영화관 자리가 공유자원이며 사람들이 쓰레드,프로세스 입니다. 그리고 남아있는 좌석이 접근할 수 있는 쓰레드,프로세스의 개수 입니다.

차이점

  • 가장 큰 차이점은 동기화 대상의 개수, 예시된 좌석의 갯수입니다.
  • Mutex는 동기화 대상이 오직 1개일 때 사용하며, Semaphore는 동기화 대상이 1개 이상일 때 사용한다.
  • Mutex는 자원을 소유할 수 있고, 책임을 가지는 반면 Semaphore는 자원 소유가 불가능하다.
  • Mutex는 상태가 0,1뿐이므로 Lock을 가질 수 있고, 소유하고 있는 스레드만이 이 Mutex를 해제할 수 있다. 세마포어는 소유하지 않은 스레드가 해제할 수 있다.
  • Semaphore는 시스템 범위에 걸쳐 있고, 파일 시스템 상의 파일로 존재한다. 반면, Mutex는 프로세스의 범위를 가지며 프로세스 종료될 때 자동으로 Clean up 된다.
뮤텍스와 세마포어는 모두 완벽한 기법은 아니므로 데이터 무결성을 보장할 수는 없으며 모든 교착상태를 해결하지는 못합니다. 하지만 상호배제를 위한 기본적인 문법이며 여기에 좀 더 복잡한 매커니즘을 적용해 개선된 성능을 가질 수 있도록 하는 것이 중요합니다. 

출처: https://heeonii.tistory.com/14 [우당탕탕 히온이네:티스토리]