전체 목록
운영체제Medium#205

뮤텍스와 세마포어의 차이를 설명해주세요.

#운영체제#Mutex#Semaphore#동시성

답변 포인트

소유권 있는 잠금과 카운팅 동기화를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.

정답 및 해설

빠른 요약

뮤텍스는 하나의 실행 흐름만 임계 구역에 들어가게 하는 잠금이고, 세마포어는 카운터로 동시에 접근 가능한 자원 수를 제어합니다. 실무 예시: 운영체제 이슈는 재현이 어려운 경우가 많아 실행 흐름과 자원 소유 관계를 그림처럼 정리하면 원인 분석이 쉬워집니다.

뮤텍스와 세마포어는 모두 동시 접근을 제어하는 동기화 도구지만 의도가 다릅니다. 뮤텍스는 보통 “하나의 공유 자원에 한 번에 하나만 들어오게 하는 잠금”이고, 세마포어는 “동시에 접근 가능한 허용 개수를 관리하는 카운터”입니다.

뮤텍스(Mutex)

Mutex는 mutual exclusion의 줄임말입니다. 공유 상태를 수정하는 임계 구역을 하나의 스레드만 실행하도록 보호합니다.

Java
class Counter {
    private int value = 0;
    private final Object lock = new Object();

    void increment() {
        synchronized (lock) {
            value++;
        }
    }
}

여기서 lock은 한 번에 한 스레드만 획득할 수 있습니다. 일반적으로 lock을 획득한 주체가 lock을 해제해야 한다는 소유권 개념이 있습니다.

세마포어(Semaphore)

세마포어는 permit 개수를 관리합니다. permit이 3개라면 동시에 3개 작업까지 들어올 수 있고, 모두 사용 중이면 나머지는 대기합니다.

Java
Semaphore semaphore = new Semaphore(10); // 동시에 최대 10개

void callExternalApi() throws InterruptedException {
    semaphore.acquire();
    try {
        // 외부 API 호출
    } finally {
        semaphore.release();
    }
}

DB 커넥션, 외부 API 동시 호출, 다운로드 워커 수 제한처럼 “최대 N개” 제어에 적합합니다.

차이 정리

구분뮤텍스세마포어
목적상호 배제동시 접근 개수 제한/신호
잠김/열림0 이상의 카운터
소유권보통 있음구현에 따라 약함
대표 사용공유 변수 보호커넥션 풀, rate 제한, 생산자-소비자

흔한 실수

  • lock 획득 후 예외가 나서 해제하지 않으면 deadlock이 발생합니다. 반드시 finally 또는 RAII 패턴을 사용합니다.
  • 여러 lock을 서로 다른 순서로 잡으면 교착 상태가 생깁니다.
  • 세마포어 permit을 너무 크게 잡으면 보호 효과가 없고, 너무 작게 잡으면 처리량이 떨어집니다.
  • 뮤텍스로 오래 걸리는 I/O까지 감싸면 전체 스레드가 불필요하게 대기합니다.

면접 답변 포인트

“뮤텍스는 단일 임계 구역의 상호 배제를 위한 lock이고, 세마포어는 사용 가능한 자원의 개수를 카운팅하는 동기화 도구입니다. 뮤텍스는 공유 상태 보호, 세마포어는 제한된 리소스 풀이나 동시성 제한에 많이 씁니다.”라고 답하면 명확합니다.

관련 질문

같은 카테고리/태그 기준