뮤텍스 vs 세마포어: 차이점 설명

뮤텍스는 임계 구역을 보호하여 한 번에 하나의 스레드만 공유 자원을 사용하게 하며, 잠근 스레드가 반드시 잠금을 해제해야 합니다. 세마포어는 카운터로서, 한정된 자원을 사용할 수 있는 스레드 수를 제어하고 한 스레드에서 다른 스레드로 이벤트를 알리는 데에도 쓸 수 있습니다. 뮤텍스는 소유권과 배타성에 관한 것이고, 세마포어는 카운팅과 시그널링에 관한 것입니다.

비교 항목뮤텍스세마포어
목적상호 배제: 임계 구역에 한 번에 한 스레드만카운팅: N개 자원 풀에 대한 접근 제한, 또는 스레드 간 이벤트 알림
값잠김 또는 풀림(이진)음이 아닌 정수 카운트(이진 세마포어는 0 또는 1인 특수한 경우)
소유권잠근 스레드가 소유하며, 그 스레드가 해제해야 함소유자 없음: 어떤 스레드든 post 또는 signal 가능
연산Lock과 unlockWait(P, 감소)와 post(V, 증가)
스레드 간 시그널링의도된 용도가 아님가능: 예를 들어 생산자가 소비자에게 신호를 보냄
우선순위 역전우선순위 상속으로 피하는 경우가 많음보통 지원되지 않음
주요 용도리스트나 카운터 같은 공유 데이터 구조 보호커넥션 풀 제한, 유한 버퍼 생산자-소비자, 인터럽트 핸들러에서 태스크로의 신호 전달
흔한 함정일관되지 않은 잠금 순서로 인한 교착 상태, 잠금 해제 누락카운트가 맞지 않을 때 발생하는 신호 유실과 교착 상태

수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.

상황별 선택 기준

뮤텍스
여러 스레드가 같은 데이터를 다루지만 한 번에 하나만 접근해야 할 때.
세마포어
자원을 사용하는 스레드 수를 제한하거나, 어떤 일이 일어났을 때 스레드를 깨워야 할 때.

자주 묻는 질문

뮤텍스는 이진 세마포어와 같은가요?

완전히 같지는 않습니다. 둘 다 상태가 두 가지이지만, 뮤텍스는 반드시 해제해야 하는 소유자가 있고 우선순위 상속을 지원하는 경우가 많은 반면, 세마포어는 소유자가 없으며 어떤 스레드든 신호를 보낼 수 있습니다.

카운팅 세마포어는 언제 필요한가요?

N개 연결 풀처럼 자원을 사용하는 스레드 수를 제한해야 하거나, 생산자-소비자 버퍼의 사용 가능한 항목 수를 세어야 할 때입니다.

교착 상태란 무엇인가요?

스레드들이 서로를 영원히 기다리는 상황입니다. 예를 들어 스레드 A가 잠금 1을 쥐고 잠금 2를 기다리는데, 스레드 B가 잠금 2를 쥐고 잠금 1을 기다리는 경우입니다. 항상 일정한 순서로 잠금을 획득하면 피할 수 있습니다.

스핀락과 뮤텍스는 어떻게 다른가요?

스핀락은 바쁜 대기(busy-wait)를 하며 멀티코어 시스템에서 아주 짧은 대기에 적합합니다. 뮤텍스는 대기 중인 스레드를 재워서 더 긴 대기에 유리합니다.

주요 용어 설명

ミューテックス
同時に1つのスレッドだけが持てるロック。取れないときはスレッドを眠らせてCPUを譲り、解放されるとOSが起こす実装が一般的。
セマフォ
残りの数を表すカウンタを持つ同期の仕組み。使う前に1減らし(0なら待つ)、使い終わったら1増やす。同時に使える数が決まった資源の管理に使う。
スピンロック
ロックが空くまで、ループでロックの変数を調べ続けて待つ方式のロック。待ちが短いときに速いが、待つ間もCPUを使い続ける。
デッドロック
複数のスレッドがそれぞれ資源を持ったまま、ほかのスレッドが持つ資源を待ち合い、誰も先に進めなくなる状態。ロックを取る順番を全体で決めて防ぐ。

관련 비교