CS/운영체제

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

sun._.ny 2022. 6. 18. 09:27

사전지식

 

IPC 란 Inter Process Communication의 약자로, 직역하면 프로세스간의 통신을 의미한다.
프로세스간의 통신이 가능하도록 커널에서는 IPC 통신 설비를 제공해주는데, IPC 설비 종류에도 여러가지가 있고 (PIPE, Message Queue, Socket ...) 이는 필요에 따라 선택해서 사용한다.

이러한 IPC 통신에서 프로세스 간의 데이터를 동기화하고 보호하기 위해 운영체제에서 제공하는 동기화용 커널객체가 있다.

즉, 데이터를 한번에 하나의 프로세스만 접근할 수 있도록 제한을 두는 일종의 프로세스 동기화 메커니즘이 존재한다.

 

 

 


이걸 다른 말로 한번더 설명한다면…
운영체제 상에는 '임계구역' 이라는 것이 존재한다.


임계구역이란, 멀티 프로세스 환경에서 둘 이상의 프로세스가 동시에 접근해서는 안되는 공유자원의 코드 영역이다.
이렇게 임계 구역에 여러 프로세스 및 스레드가 함부로 접근할 수 없도록 관리를 잘 해줘야 하는데, 이를 위해 사용하는 방식에 대표적으로 세마포어(Semaphore)와 뮤텍스(Mutex)가 있다

 

 

 

 

 

세마포어 (Semaphore)

멀티 프로그래밍 환경에서 공유된 자원에 대한 접근을 제한하는 방법

 

 

뮤텍스 (Mutex)

공유 불가능한 자원의 동시 사용을 피하기 위해 사용하는 방법

→ 접근 제어를 위해 lock과 unlock 사용

- lock: 현재 임계 구역에 들어갈 권한을 얻어옴
- unlock: 현재 임계 구역을 모두 사용했음을 알림

 

 

참조) 세마포어와 뮤텍스에 대한 개념을 알기 쉽게 화장실에 비유하여 설명해준 블로그

https://worthpreading.tistory.com/90

 

→ 세마포어와 뮤텍스 둘다 공유자원에 여러 프로세스가 동시에 접근하는 것을 막는다.

 

 

 

 

 

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

 

1) 세마포어

  - 현재 공유 자원의 상태를 나타내는 카운터 변수를 사용
  - 카운터 변수는 운영체제 혹은 커널에 값으로 저장

  - 각 프로세스는 해당 카운터 변수를 확인하고 변경 가능
  - 카운터 변수의 값은 1보다 더 큰 숫자도 가질 수 있음
  - 해당 변수값이 공유 자원에 접근할 수 있는 프로세스 개수의 임계치
  - 이를 조정해 접근 가능한 프로세스 개수 통제

 

 

2) 뮤텍스
  - 이진 세마포어라고도 불림 (상태가 0,1)
  - 1개의 프로세스 혹은 스레드만이 공유 자원에 접근 가능함
  - lock과 unlock
    ▷ 뮤텍스는 자원을 점유하고 있는 프로세스가 lock을 할 수 있는 권한을 가져서, 자원을 점유하기 시작할때 lock을 걸어버림
    lock을 가지고 있는 변수만이 unlock을 할 수있고, 다른 프로세스들은 unlock 상태가 될때까지 기다렸다가 나중에 해당 공유 자원에 접근 가능
     반면 세마포어는 현재 공유 자원을 사용중인 대상뿐만 아니라 다른 프로세스 및 스레드도 unlock이 가능함


 

 

 

정리하자면...

세마포어는 카운터 변수값만큼 공유 자원에 해당 프로세스(또는 스레드)가 접근 가능

뮤텍스는 오직 하나의 프로세스(또는 스레드)가 접근 가능

세마포어는 현재 수행중인 프로세스가 아닌 다른 프로세스가 unlock이 가능

뮤텍스는 lock을 획득한 프로세스가 반드시 unlock을 해야 다른 프로세스가 접근 가능