OS

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

KJihun 2025. 10. 17. 16:47
728x90


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

다중 스레드 환경에서 웹 애플리케이션을 개발할 때, 공유 자원(Shared Resource) 에 대한 접근 제어는 피할 수 없는 문제다
여러 스레드가 동시에 동일한 데이터를 수정하려 하면, 데이터 무결성이 깨지거나 경쟁 상태(Race Condition) 가 발생할 수 있다.

이러한 문제를 해결하기 위한 대표적인 동기화 기법이 세마포어(Semaphore) 와 뮤텍스(Mutex) 이다.
이들은 모두 운영체제(OS) 수준에서 공유 자원에 대한 접근을 제어하기 위해 사용되는 동기화 메커니즘으로,
자원 접근을 제어하는 ‘락(lock)’을 관리하는 기술이라 할 수 있다.

 

즉, 낙관적 락(Optimistic Lock), 비관적 락(Pessimistic Lock), 분산 락(Distributed Lock) 등이
서버나 데이터베이스 수준에서 웹 개발자가 구현하는 락이라면,
세마포어와 뮤텍스는 운영체제 차원에서 제공되는 락 관리 기법이다.

 

 


 


세마포어 (Semaphore)

 

공유 자원에 동시 접근 가능한 개수를 제어하는 역할이다.

일반적으로 1 이상의 값을 가지며, 해당 값은 동시 접근을 허용하는 허용치를 나타낸다.

 

특징

  • 소유권이 없다 (누가 잠갔는가를 추적하지 않는다) → 세마포어를 잠근 스레드가 아니더라도 해제할 수 있다
  • 상대적으로 많은 오버헤드를 가진다(정수 카운터 관리 등)
     


작동 방식

 

`P()` (Wait)와 `V()` (Signal) 두 가지 연산을 사용한다.

  • `P()`: 세마포어 값을 감소시키고, 이 값이 0보다 작아질 경우 대기 상태로 전환
  • `V()`: 세마포어 값을 증가시키고, 대기 중인 프로세스나 스레드를 실행 상태로 전환

 

 


 

 


뮤텍스 (Mutex)

 

데이터 무결성과 경쟁 상태(Race Condition)를 방지하기 위한 상호 배제(Mutual Exclusion) 기반의 동기화 기법이다.

  • 공유 자원에 대한 접근을 단 하나의 프로세스 또는 스레드에게만 허용하여 데이터의 일관성을 보장한다.
  • 이진 상태를 가지며(Lock, Unlock) 임계 영역이 잠겨있는지 여부를 나타낸다.
  • 소유권을 가진다. 뮤텍스의 상태변화는 한 스레드 또는 프로세스만 가능하다.
  • 하나의 공유 자원에 여러 프로세스나 스레드가 접근하려고 할 때 임계구역 보호를 위해 사용된다.
  • 세마포어 보다 오버헤드가 적다(이진 상태 체크)


작동 방식

  • 뮤텍스를 소유하고 있는 스레드 또는 프로세스만이 뮤텍스를 해제하거나 잠그는 것이 가능하다
  • 스레드가 뮤텍스를 잠그면, 다른 스레드는 해당 뮤텍스를 얻을 때까지 대기한다.

 

 


 

 

 

 

세마포어의 값이 1인 경우, 뮤텍스와 같은 용도로 사용될 수 있다.

그러나 세마포어가 설계된 목적을 벗어나기 때문에 일반적으로 뮤텍스를 사용하는 것이 더 명확하고 안전하다.
따라서 세마포어를 뮤텍스로 사용하는 것은 가능하지만, 뮤텍스가 상호 배제를 위해 더 적합한 동기화 기법이다.

 

 


 

 

요약

 

세마포어는 접근 가능한 자원 수량을 제어하고, 
뮤텍스는 데이터 무결성과 경쟁 상태(Race Condition) 를 방지하기 위해 사용한다.

두 기법 모두 단일 시스템 내 스레드 간의 코드 실행 및 리소스 접근을 비관적으로 제어하는 기법이다.

 

 

 

 

 

 

낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)

동시에 여러 트랜잭션이 같은 데이터를 수정하려고 할 때, 데이터의 정합성(Consistency)이 깨질 수 있다.이를 방지하기 위해, 트랜잭션 간의 충돌을 제어하는 동시성 제어(Concurrency Control) 기법이

developerhun.tistory.com