뮤텍스와 세마포어 (Mutex and Semaphore)

컴퓨터과학·AI
한 줄 정의: 여러 프로세스나 스레드가 공유 자원에 동시에 접근하지 못하도록 순서를 조율하는 동기화 도구입니다.

쉽게 풀면

뮤텍스는 화장실 열쇠와 비슷합니다. 열쇠는 하나뿐이라 한 사람이 들고 들어가면 다른 사람은 반납될 때까지 밖에서 기다려야 합니다. 세마포어는 좀 더 유연해서, "동시에 최대 3명까지만 입장 가능"이라고 적힌 좌석표와 비슷합니다. 정해진 개수만큼은 동시에 들어갈 수 있고, 자리가 다 차면 누군가 나올 때까지 기다립니다. 즉 뮤텍스는 "한 번에 하나만" 허용하는 잠금이고, 세마포어는 "한 번에 N개까지" 허용하는 좀 더 일반화된 잠금이라고 볼 수 있습니다.

왜 중요한가

뮤텍스와 세마포어는 병렬·분산 시스템 논문에서 성능과 정확성을 동시에 논할 때 빠지지 않는 개념입니다. 멀티코어 프로세서나 분산 데이터베이스처럼 여러 실행 흐름이 동시에 자원을 다투는 환경이 보편화되면서, 두 동기화 도구를 어떻게 설계하고 배치하느냐가 시스템의 처리량과 안정성을 좌우합니다. 그래서 운영체제, 데이터베이스, 임베디드 시스템 연구 전반에서 동기화 기법의 기본 어휘로 반복적으로 등장합니다.

논문에서는 이렇게 쓰입니다

"공유 버퍼에 대한 동시 접근을 막기 위해 뮤텍스(mutex)로 임계 구역(critical section)을 보호했으며, 커넥션 풀의 동시 사용 개수는 세마포어(semaphore)로 제한했다."

이 문장은 여러 스레드가 같은 데이터를 동시에 건드리지 못하게 뮤텍스로 막고, 동시에 쓸 수 있는 자원의 개수는 세마포어로 관리했다는 뜻입니다.

"임베디드 실시간 운영체제 환경에서는 우선순위 역전 문제를 완화하기 위해 우선순위 상속 뮤텍스(priority-inheritance mutex)를 채택하였다."

이 문장은 실시간 시스템 연구에서 단순한 뮤텍스 사용을 넘어, 낮은 우선순위 작업이 락을 오래 쥐고 있어 높은 우선순위 작업이 지연되는 문제까지 함께 고려했다는 것을 보여줍니다.

"생산자-소비자 패턴에서는 버퍼가 가득 찼는지 여부를 세마포어 두 개(빈 슬롯 수, 채워진 슬롯 수)로 관리하여 생산자와 소비자 스레드 간의 흐름을 조절하였다."

이 문장은 세마포어가 단순한 접근 제한뿐 아니라, 여러 스레드 간 작업 순서를 조율하는 신호(signal) 메커니즘으로도 활용된다는 것을 보여주는 사례입니다.

조금 더 깊게 보면

뮤텍스는 보통 "소유권" 개념이 있어서 락을 건 스레드만 풀 수 있는 반면, 세마포어는 소유권 개념 없이 카운터 값을 여러 스레드가 자유롭게 증감시킬 수 있어 순서 조율(signaling) 용도로도 쓰입니다. 세마포어 중 값이 0과 1만 갖는 것을 이진 세마포어라 부르는데, 이는 뮤텍스와 비슷해 보이지만 소유권 규칙이 없다는 점에서 여전히 구분됩니다. 논문을 읽을 때는 저자가 "lock/unlock"이라는 표현을 쓰는지, "wait/signal(또는 P/V 연산)"이라는 표현을 쓰는지를 보면 뮤텍스와 세마포어 중 어느 쪽을 염두에 두고 있는지 가늠하는 데 도움이 됩니다.

주의할 점

뮤텍스나 세마포어를 잘못 사용하면 경쟁 상태를 막으려다 오히려 교착 상태를 만들 수 있습니다. 예를 들어 여러 개의 락을 서로 다른 순서로 잠그면 두 스레드가 서로의 락을 기다리며 멈춰버릴 수 있으므로, 락을 획득하는 순서를 항상 일정하게 유지하는 것이 중요합니다.

관련 용어