뮤텍스 vs 세마포어, 동시성 제어의 차이 완벽 정리

뮤텍스와 세마포어란?

여러 스레드나 프로세스가 동시에 실행되는 환경에서는 공유 자원(변수, 파일, 데이터베이스 커넥션 등)에 여러 주체가 동시에 접근하면 데이터가 꼬이는 문제가 발생합니다. 이를 막기 위해 사용하는 대표적인 동기화 도구가 뮤텍스(Mutex)세마포어(Semaphore)입니다.

뮤텍스는 ‘Mutual Exclusion(상호 배제)’의 줄임말로, 하나의 자원에 오직 하나의 스레드만 접근할 수 있도록 잠그는 도구입니다. 반면 세마포어는 정해진 개수만큼 여러 스레드가 동시에 접근할 수 있도록 허용하는 카운터 기반 도구입니다.

동작 원리와 예시

화장실에 비유하면 이해가 쉽습니다. 뮤텍스는 ‘화장실 문이 하나뿐인 1인용 화장실’과 같습니다. 문에 잠금장치(lock)가 있어서 한 사람이 들어가 잠그면(lock), 다른 사람은 그 사람이 나와서 잠금을 풀(unlock) 때까지 기다려야 합니다. 오직 소유자만 잠금을 해제할 수 있다는 점도 특징입니다.

세마포어는 ‘주차장의 빈 자리 개수’와 비슷합니다. 주차 가능한 자리가 3개라면, 동시에 3대까지는 들어갈 수 있고 4번째 차는 자리가 빌 때까지 기다립니다. 세마포어는 내부적으로 카운터 값을 가지고 있어서, 자원을 사용할 때마다 wait()(또는 P 연산)로 카운터를 감소시키고, 사용이 끝나면 signal()(또는 V 연산)로 카운터를 증가시킵니다. 카운터가 1이면 뮤텍스처럼 동작하는 ‘바이너리 세마포어’가 되지만, 소유 개념이 없다는 점에서 뮤텍스와는 근본적으로 다릅니다.

  • 뮤텍스: 1개의 자원, 소유권 개념 있음, 잠근 스레드만 해제 가능
  • 세마포어: N개의 자원, 소유권 개념 없음, 다른 스레드도 카운터 증가 가능

실무에서 왜 쓰는가

실무에서는 자원의 특성에 따라 두 도구를 선택합니다. 데이터베이스 커넥션 풀처럼 ‘동시에 최대 몇 개까지 사용 가능한지’ 제한이 필요한 경우에는 세마포어가 적합합니다. 예를 들어 커넥션이 최대 10개인 풀을 세마포어 카운트 10으로 설정하면, 11번째 요청은 자동으로 대기하게 됩니다.

반면 단일 변수나 특정 코드 블록을 여러 스레드가 동시에 수정하지 못하게 막아야 할 때는 뮤텍스가 적합합니다. 예를 들어 은행 계좌 잔액을 업데이트하는 코드처럼 반드시 한 번에 하나의 스레드만 접근해야 하는 임계 영역(critical section)에는 뮤텍스를 사용합니다.

결국 두 개념 모두 ‘동시성 문제를 막기 위한 잠금 장치’라는 공통점이 있지만, 뮤텍스는 단일 접근 제어, 세마포어는 제한된 다중 접근 제어라는 점에서 목적과 사용 상황이 다릅니다. 이 차이를 이해하고 상황에 맞게 선택하는 것이 안정적인 동시성 프로그래밍의 핵심입니다.

댓글 남기기