운영체제 | Semaphore & Mutex

성수당·2025년 9월 4일

운영체제

목록 보기
6/31
post-thumbnail

🥔 Semaphore와 Mutex란?

운영체제나 멀티스레딩 프로그래밍에서 공유 자원에 대한 동기화(Synchronization) 는 매우 중요한 문제다.

여러 개의 스레드나 프로세스가 동시에 자원에 접근할 경우 데이터 충돌, 레이스 컨디션이 발생할 수 있기 때문에, 이를 제어하기 위한 수단으로 세마포어(Semaphore)뮤텍스(Mutex) 가 존재한다.

🥔 공통 개념: 임계 구역(Critical Section)

임계 구역(Critical Section) 이란, 여러 스레드가 동시에 접근해서는 안 되는 공유 자원에 접근하는 코드 영역이다.

이 임계 구역에 동시에 하나의 스레드만 진입하도록 제한해야 한다.

이러한 제한을 구현하는 대표적인 도구가 SemaphoreMutex다.

🥔 Mutex (Mutual Exclusion)

뮤텍스는 "상호 배제"라는 의미 그대로, 동시에 하나의 스레드만 자원에 접근 가능하도록 보장하는 객체다.

특징

  • Binary 상태만 가짐 (Lock / Unlock)
  • 한 번에 하나의 스레드만 소유 가능
  • 락을 획득한 스레드만 해제 가능

사용 예시 (C / POSIX)

pthread_mutex_t lock;

pthread_mutex_init(&lock, NULL);
pthread_mutex_lock(&lock);   // 자원 접근
// 임계 구역
pthread_mutex_unlock(&lock); // 자원 반환

장점

  • 구현이 간단하고 가볍다
  • 빠른 동기화 가능

단점

  • 데드락(Deadlock) 발생 가능성 있음 (락 획득 후 해제를 하지 않으면 전체 시스템이 정지)

🥔 Semaphore

세마포어는 뮤텍스보다 더 일반화된 동기화 도구로, 정수 값을 기반으로 자원 개수를 관리한다.

즉, 여러 개의 스레드가 동시에 접근 가능하지만, 정해진 개수만큼만 허용된다.

종류

  1. Counting Semaphore

    • 정수 값을 가짐 (0 이상)
    • N개의 동시 접근 허용 (예: 데이터베이스 연결 풀)
  2. Binary Semaphore

    • 값이 0 또는 1만 가능 → 뮤텍스와 유사하지만 역할은 다름

기본 연산

연산설명
wait() 또는 P()자원 사용 전 호출 (값 감소). 값이 0이면 대기
signal() 또는 V()자원 사용 후 호출 (값 증가). 대기자 깨움

사용 예시 (POSIX 세마포어)

sem_t sem;

sem_init(&sem, 0, 3); // 초기값 3 (최대 3개 동시 접근 가능)
sem_wait(&sem);       // 접근 시도
// 임계 구역
sem_post(&sem);       // 자원 반납

🥔 Semaphore vs Mutex 비교

항목MutexSemaphore
목적상호 배제를 통한 자원 보호제한된 개수의 자원 접근 허용
값 범위0 또는 1 (Binary)0 이상 정수 (N개 자원 관리 가능)
소유 개념특정 스레드가 소유 (소유자만 해제 가능)소유 개념 없음 (누구나 wait/post 가능)
사용 시점임계 구역 보호리소스 접근 제어 또는 동기화
예시 사용처변수 보호, 파일 접근 제한쓰레드 간 동기화, 연결 풀 관리 등
구현 난이도비교적 간단더 유연하지만 사용법에 따라 복잡해질 수 있음

🥔 Deadlock 주의사항

동기화 도구는 편리하지만, 잘못 사용하면 데드락(Deadlock) 이 발생할 수 있다.
대표적인 데드락 상황은 다음과 같다:

  • 뮤텍스 획득 후 예외 발생으로 unlock 없이 종료
  • 두 개 이상의 락을 순서 없이 획득
  • 락을 이중으로 요청 (Recursive Lock)

→ 반드시 락을 획득한 후에는 예외 상황을 대비해 try-finally 또는 unlock을 보장하는 코드를 작성해야 한다.

🥔 마무리

  • 동기화는 멀티스레딩/멀티프로세스 환경에서 안전한 자원 접근을 보장하는 핵심 개념이다.
  • Mutex는 단 하나의 스레드만 접근하도록 제한할 때 사용한다.
  • Semaphore복수 자원이나 스레드 간 시그널링 목적으로 사용된다.
  • 상황에 맞는 도구를 정확히 이해하고 사용하는 것이 중요하다.
profile
말하는 감자🥔

0개의 댓글