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

면접 답변

세마포어와 뮤텍스는 임계 영역을 보호하기 위한 동기화 도구입니다. 뮤텍스는 한 번에 하나의 스레드만 임계 영역에 접근 가능하도록 보장하지만, 세마포어는 동시에 여러 스레드가 접근 가능한 자원의 개수를 제어할 수 있습니다. 그리고 뮤텍스는 락을 획득한 스레드만 해제할 수 있지만 세마포어는 다른 스레드도 해제 가능하다는 차이가 있습니다.

개념 정리

세마포어와 뮤텍스는 왜 필요할까?

멀티스레드 환경에서는 여러 스레드가 동시에 하나의 자원에 접근할 수 있기 때문에, 자원이 예상치 못한 방식으로 변경되거나 충돌이 생기는 Race Condition이 발생할 수 있다. 이를 방지하기 위해, 하나의 스레드만 자원에 접근하도록 제어하거나 자원 접근 개수를 제한하는 메커니즘이 필요하다.세마포어뮤텍스는 이러한 문제를 해결하기 위한 동기화 도구로, 자원의 사용을 적절히 조율하여 안정적인 동시성 제어를 가능하게 해준다.

뮤텍스

  • Mutual Exclusion(상호 배제)의 약자

  • 임계 영역에 하나의 스레드만 접근 가능하게 제한한다.

  • 주로 임계 구역 보호에 사용된다.

  • 락을 획득한 스레드만 해제할 수 있다. (소유권 존재)

Java 예시

synchronized

세마포어

  • 정수형 카운터로 동시 접근 가능한 자원의 개수를 제어한다.

  • 초기값을 설정해 동시에 접근 가능한 스레드 수를 설정한다.

  • acquire()로 접근 요청하고, release()로 해제한다.

  • 소유권 개념이 없어 다른 스레드도 해제가 가능하다.

Java 예시

뮤텍스 vs 세마포어

구분
뮤텍스 (Mutex)
세마포어 (Semaphore)

자원 접근 수

1개 자원만 접근 가능

n개 자원까지 동시 접근 가능

값 범위

0 또는 1 (이진 락)

0 이상의 정수

목적

임계 영역 보호

자원 개수 제어

해제 권한

획득한 스레드만 해제 가능 (소유권 있음)

다른 스레드도 해제 가능 (소유권 없음)

사용 예시

임계 영역 보호, 상호 배제

DB 커넥션 풀, 프린터 대기열 등

꼬리 질문

  • 세마포어를 이진 세마포어로 사용하면 뮤텍스와 완전히 같다고 볼 수 있을까요?

  • 뮤텍스를 잘못 사용했을 때 발생할 수 있는 문제에는 어떤 것들이 있을까요?

  • 뮤텍스와 세마포어를 동시에 사용해야 하는 경우가 있을까요?

Last updated