뮤텍스 (Mutex)

컴퓨터과학·AI
한 줄 정의: 여러 스레드나 프로세스가 동시에 같은 자원에 접근하지 못하도록, 한 번에 오직 하나만 그 자원을 사용하도록 잠그고 푸는 동기화 장치입니다.

쉽게 풀면

공용 화장실 열쇠를 생각해 보면 이해가 쉽습니다. 화장실은 하나뿐이고 열쇠도 하나뿐이라면, 열쇠를 가진 사람만 들어갈 수 있고 나머지 사람들은 밖에서 줄을 서서 기다려야 합니다. 사용을 마친 사람이 열쇠를 반납해야 다음 사람이 들어갈 수 있습니다. 뮤텍스도 똑같은 원리입니다. 여러 스레드가 동시에 같은 변수나 파일 같은 "공유 자원"을 건드리면 값이 뒤섞이거나 프로그램이 오작동할 수 있는데, 뮤텍스라는 열쇠(lock)를 획득한 스레드만 그 자원을 사용하게 하고, 작업이 끝나면 열쇠를 반납(unlock)해서 다음 스레드가 사용할 수 있게 합니다.

왜 중요한가

뮤텍스는 멀티스레드 프로그램의 정확성을 보장하는 가장 기본적인 도구이기 때문에, 병렬 컴퓨팅·운영체제·데이터베이스 시스템 논문에서 구현 세부사항을 설명할 때 빈번하게 언급됩니다. 코어 수가 늘어난 현대 하드웨어에서 성능을 끌어올리려면 여러 스레드를 동시에 돌려야 하는데, 이때 데이터 손상을 막으면서도 성능 저하를 최소화하는 동기화 전략이 시스템 논문의 핵심 평가 항목이 되기 때문입니다.

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

"각 워커 스레드는 공유 큐에 접근하기 전 뮤텍스를 획득(lock)하고 작업이 끝난 직후 즉시 해제(unlock)하도록 구현하여 경쟁 상태를 방지하였다."

이 문장은 병렬 프로그래밍이나 시스템 성능을 다루는 논문의 구현 방법 부분에서 흔히 등장합니다. 여러 스레드가 동시에 데이터를 읽고 쓰는 상황에서 데이터가 손상되지 않도록 뮤텍스로 접근 순서를 통제했다는 뜻입니다.

"데이터베이스 엔진은 페이지 단위의 세밀한(fine-grained) 뮤텍스를 도입하여 전체 테이블을 잠그는 방식보다 동시성을 크게 향상시켰다."

이 문장은 뮤텍스를 얼마나 세밀한 단위로 거느냐에 따라 시스템의 동시 처리 성능이 달라진다는 점을 보여주며, 데이터베이스 시스템 논문에서 잠금 세분화(lock granularity)를 논할 때 흔히 쓰이는 표현입니다.

"분산 환경에서는 단일 노드 내 뮤텍스만으로는 충분하지 않아, 여러 노드에 걸친 동시 접근을 조율하기 위한 분산 락(distributed lock) 메커니즘이 별도로 요구되었다."

이 문장은 뮤텍스가 원래 하나의 프로세스나 시스템 내부에서 동작하는 개념이며, 분산 시스템에서는 이를 확장한 별도의 메커니즘이 필요하다는 것을 보여줍니다.

조금 더 깊게 보면

뮤텍스는 대개 락을 건 스레드만 풀 수 있는 "소유권" 개념을 가지고 있어, 소유권 없이 값을 자유롭게 조정할 수 있는 세마포어와 구분됩니다. 구현 방식에 따라 락을 얻지 못한 스레드가 CPU를 양보하지 않고 계속 확인만 반복하는 스핀락(spinlock)과, 대기 상태로 전환되어 운영체제 스케줄러에 의해 깨어나는 방식이 있으며, 논문에서는 상황에 따라 어떤 방식이 더 효율적인지를 비교하기도 합니다. 또한 락을 얼마나 넓은 범위(coarse-grained)로 걸지, 얼마나 좁은 범위(fine-grained)로 걸지도 성능과 구현 복잡도를 가르는 중요한 설계 선택으로 다뤄집니다.

주의할 점

뮤텍스로 자원을 보호하는 것은 경쟁 상태를 막아주지만, 여러 개의 뮤텍스를 서로 다른 순서로 잠그면 두 스레드가 서로의 열쇠를 기다리며 영원히 멈추는 교착 상태가 발생할 수 있습니다. 또한 잠금을 오래 유지할수록 다른 스레드가 오래 기다리게 되어 프로그램 전체의 성능이 떨어질 수 있습니다.

관련 용어