동시에 최대 10개 작업만 허용하려 합니다. 뮤텍스와 세마포어는 어떻게 다르게 쓰이나요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
뮤텍스는 한 시점에 하나의 실행 흐름만 임계 구역을 소유하도록 하는 잠금이고, 세마포어는 사용 가능한 허가 수를 세어 동시 진입 수를 제한하는 도구입니다. 최대 10개의 외부 API 호출이나 DB 작업을 허용하려면 초기 허가가 10인 세마포어를 작업 시작 전에 acquire하고 끝난 뒤 release합니다. 반면 공유 자료구조의 불변식을 한 번에 한 흐름만 바꿔야 한다면 뮤텍스가 맞습니다. 이 목적의 차이를 소유 잠금과 허가 제한으로 설명합니다.
허가의 수명과 소유권을 관리합니다
세마포어 acquire 뒤 예외·timeout·취소가 나면 반드시 허가를 반환해야 합니다. 성공 경로에만 release를 두면 작업은 끝났는데 허가가 사라지는 누수가 생겨 이후 작업이 영원히 기다릴 수 있습니다. 반대로 acquire하지 않은 경로에서 release하면 허가 수가 실제 용량보다 커져 10개 제한이 깨집니다. 취소가 acquire 전에 발생했는지, 허가를 얻은 뒤 작업 시작 전에 발생했는지를 구분해 반환 책임을 한 곳에 두겠습니다.
세마포어 허가가 10개라고 해서 그 안에서 공유 카운터·큐·상태가 자동으로 안전해지는 것은 아닙니다. 10개 작업이 동시에 같은 데이터를 바꾸면 별도 뮤텍스, 소유권 이전, 원자 연산이 필요합니다. 이진 세마포어와 뮤텍스도 소유 스레드만 unlock할 수 있는지, 우선순위 역전 처리와 재귀 획득이 있는지 같은 계약이 다를 수 있습니다. 뮤텍스로 외부 호출 동시성을 제한하려 하면 하나의 작업만 실행되어 용량을 활용하지 못하고, 세마포어만으로 복합 불변식을 보호하면 경합 데이터가 깨질 수 있습니다.
제한이 실제 병목과 맞는지 확인합니다
허가 수는 외부 서비스 한도, DB 연결 수, 메모리, CPU와 작업별 비용을 고려해 정합니다. 작업 비용이 크게 다르면 허가 1개가 동일한 비용이라는 가정이 부정확할 수 있어 가중 허가나 비용별 큐를 검토합니다. queue length, permit wait, active count, 작업 age, timeout·취소·오류율과 하위 서비스 포화를 기록합니다. 10으로 바꾼 뒤 처리량이 늘어도 DB p99와 재시도가 악화되면 숫자를 키우지 않고 병목 용량과 backpressure를 다시 조정하겠습니다.
허가를 얻기 전 취소된 요청과 허가를 얻은 뒤 취소된 요청을 구분해 정확히 한 번만 반환해야 합니다. 허가 10개를 모두 사용 중인 상태에서 대기 요청을 무제한으로 보유하면 active 작업 수는 제한돼도 연결·메모리·deadline이 고갈될 수 있으므로 bounded queue와 acquire timeout을 함께 둡니다. FIFO 공정성을 추가하면 취소된 waiter 제거와 우선순위 처리 비용도 생깁니다.
비용이 다른 작업은 허가 하나가 같은 자원량이라는 가정이 맞지 않을 수 있습니다. DB 쿼리 10개와 대용량 export 10개를 같은 세마포어로 허용하면 메모리와 저장소 대역폭이 먼저 포화될 수 있어 별도 허가나 가중치를 검토합니다. 세마포어 안의 공유 카운터는 별도 뮤텍스·원자 연산·소유권 규칙이 필요합니다. active count, permit wait, queue age, timeout·취소와 하위 시스템 p99를 함께 측정하겠습니다.
허가 10개는 동시에 시작할 수 있는 작업 수이지 외부 시스템이 감당할 수 있는 총 비용을 뜻하지 않습니다. 대용량 작업과 소형 작업이 섞이면 가중 허가나 별도 풀을 검토하고, acquire 전 취소와 acquire 후 취소의 반환 책임을 구분합니다. 제한 뒤에도 대기 요청의 deadline과 메모리를 관리해야 합니다.
세마포어는 작업의 시작 수를 제한할 뿐 작업의 순서나 공정성을 보장하지 않습니다. 허가를 기다리는 연결을 무제한으로 유지하면 active 작업은 10개여도 메모리·deadline이 고갈될 수 있으므로 bounded queue와 acquire timeout을 둡니다. DB 작업과 대용량 export처럼 비용이 다른 작업은 별도 풀이나 가중 허가를 검토하겠습니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- 뮤텍스의 소유권과 세마포어 허가 수를 목적별로 구분한다.
- 예외·취소·조기 종료의 허가 반환 책임을 설명한다.
- 동시성 제한과 공유 데이터 보호를 별도 계약으로 둔다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- 세마포어가 여러 작업을 허용하므로 공유 데이터도 자동 안전하다고 말한다.
- 이진 세마포어와 뮤텍스 계약이 항상 같다고 단정한다.
- 성공 경로에서만 허가를 반환한다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- 허가를 얻기 전과 얻은 직후 취소가 발생합니다. 허가를 누수하거나 두 번 반환하지 않게 어떻게 구분하나요?
- FIFO가 아닌 허가 분배에서 낮은 우선순위 작업의 기아를 어떻게 막을까요?
- 비용이 다른 작업에 가중 허가를 줄 때 허가 누수와 공정성을 어떻게 검증할까요?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.
원리부터 공부하고 싶다면
답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.