뮤텍스와 세마포어 (Mutex and Semaphore)
쉽게 풀면
뮤텍스는 화장실 열쇠와 비슷합니다. 열쇠는 하나뿐이라 한 사람이 들고 들어가면 다른 사람은 반납될 때까지 밖에서 기다려야 합니다. 세마포어는 좀 더 유연해서, "동시에 최대 3명까지만 입장 가능"이라고 적힌 좌석표와 비슷합니다. 정해진 개수만큼은 동시에 들어갈 수 있고, 자리가 다 차면 누군가 나올 때까지 기다립니다. 즉 뮤텍스는 "한 번에 하나만" 허용하는 잠금이고, 세마포어는 "한 번에 N개까지" 허용하는 좀 더 일반화된 잠금이라고 볼 수 있습니다.
왜 중요한가
뮤텍스와 세마포어는 병렬·분산 시스템 논문에서 성능과 정확성을 동시에 논할 때 빠지지 않는 개념입니다. 멀티코어 프로세서나 분산 데이터베이스처럼 여러 실행 흐름이 동시에 자원을 다투는 환경이 보편화되면서, 두 동기화 도구를 어떻게 설계하고 배치하느냐가 시스템의 처리량과 안정성을 좌우합니다. 그래서 운영체제, 데이터베이스, 임베디드 시스템 연구 전반에서 동기화 기법의 기본 어휘로 반복적으로 등장합니다.
논문에서는 이렇게 쓰입니다
이 문장은 여러 스레드가 같은 데이터를 동시에 건드리지 못하게 뮤텍스로 막고, 동시에 쓸 수 있는 자원의 개수는 세마포어로 관리했다는 뜻입니다.
이 문장은 실시간 시스템 연구에서 단순한 뮤텍스 사용을 넘어, 낮은 우선순위 작업이 락을 오래 쥐고 있어 높은 우선순위 작업이 지연되는 문제까지 함께 고려했다는 것을 보여줍니다.
이 문장은 세마포어가 단순한 접근 제한뿐 아니라, 여러 스레드 간 작업 순서를 조율하는 신호(signal) 메커니즘으로도 활용된다는 것을 보여주는 사례입니다.
조금 더 깊게 보면
뮤텍스는 보통 "소유권" 개념이 있어서 락을 건 스레드만 풀 수 있는 반면, 세마포어는 소유권 개념 없이 카운터 값을 여러 스레드가 자유롭게 증감시킬 수 있어 순서 조율(signaling) 용도로도 쓰입니다. 세마포어 중 값이 0과 1만 갖는 것을 이진 세마포어라 부르는데, 이는 뮤텍스와 비슷해 보이지만 소유권 규칙이 없다는 점에서 여전히 구분됩니다. 논문을 읽을 때는 저자가 "lock/unlock"이라는 표현을 쓰는지, "wait/signal(또는 P/V 연산)"이라는 표현을 쓰는지를 보면 뮤텍스와 세마포어 중 어느 쪽을 염두에 두고 있는지 가늠하는 데 도움이 됩니다.
주의할 점
뮤텍스나 세마포어를 잘못 사용하면 경쟁 상태를 막으려다 오히려 교착 상태를 만들 수 있습니다. 예를 들어 여러 개의 락을 서로 다른 순서로 잠그면 두 스레드가 서로의 락을 기다리며 멈춰버릴 수 있으므로, 락을 획득하는 순서를 항상 일정하게 유지하는 것이 중요합니다.