세마포어와 뮤텍스 차이, P·V 연산과 생산자-소비자 문제로 이해하는 동기화 (정보처리기사)

두 스레드가 같은 변수를 동시에 고치면 결과가 실행할 때마다 달라진다. 이 문제를 푸는 도구가 세마포어와 뮤텍스다. 정보처리기사 운영체제의 프로세스 동기화 단원, 정보관리기술사 운영체제 영역에서 “세마포어와 뮤텍스의 차이”, “생산자-소비자 문제”가 자주 나온다. 용어보다 먼저 “무엇이 문제인가”를 이해하면 암기량이 크게 줄어든다.

임계구역 문제는 공유 자원을 동시에 고치면 결과가 실행 순서에 좌우되는 데서 시작한다

두 스레드가 각각 count++를 1,000번씩 실행하면 2,000이 되어야 한다. 그런데 count++는 읽기, 더하기, 쓰기의 세 단계라 두 스레드가 같은 값을 읽고 각각 1을 더해 쓰면 한 번의 증가가 사라진다(갱신 손실). 공유 자원에 접근하는 코드 구간을 임계구역이라 하고, 올바른 해법은 세 조건을 만족해야 한다.

  • 상호 배제(Mutual Exclusion): 한 번에 하나의 프로세스만 임계구역에 들어간다.
  • 진행(Progress): 임계구역이 비어 있으면 들어가려는 프로세스가 무한정 막히지 않는다.
  • 한정 대기(Bounded Waiting): 기다리는 프로세스가 무한히 밀리지 않는다.

세마포어는 정수 변수와 두 개의 원자적 연산 P·V로 동작한다

다익스트라가 제안한 방식이다. P(wait)는 값을 1 줄이고 값이 0 아래로 내려가야 하면 대기시키며, V(signal)는 값을 1 올리고 대기 중인 프로세스를 깨운다. P와 V는 중간에 끊기지 않는 원자적 연산이어야 한다.

P(S): S가 0이면 대기, 아니면 S = S - 1
V(S): S = S + 1, 대기 중인 프로세스가 있으면 하나 깨움

초기값 3으로 시작하는 카운팅 세마포어에 프로세스 5개가 차례로 P를 호출하면, 1~3번은 값이 2, 1, 0이 되며 진입하고 4·5번은 대기한다. 누군가 V를 호출하면 대기 중이던 하나가 들어간다. 자원이 3개인 풀을 관리하는 모습과 같다.

세마포어와 뮤텍스는 값의 범위와 소유권에서 갈린다

구분 세마포어 뮤텍스(Mutex)
값 0 이상 정수(카운팅) 또는 0/1(이진) 잠금/해제 두 상태
소유권 없음. 다른 프로세스가 V를 호출해도 됨 있음. 잠근 쪽이 풀어야 함
주 용도 자원 개수 관리, 실행 순서 맞추기(신호) 임계구역 상호 배제
접근 대상 여러 개의 같은 자원 하나의 자원

이진 세마포어를 뮤텍스처럼 쓸 수 있지만, 소유권이 없어 다른 쪽이 실수로 풀어 버릴 수 있다는 점이 구조적 차이다. 모니터(Monitor)는 이런 동기화를 언어 차원에서 캡슐화한 상위 개념으로, 한 시점에 하나의 프로세스만 모니터 안에서 실행된다.

생산자-소비자 문제는 세마포어 세 개로 풀린다

버퍼가 3칸일 때 세마포어를 이렇게 둔다. empty=3(빈 칸 수), full=0(찬 칸 수), mutex=1(버퍼 접근 열쇠).

생산자: P(empty) → P(mutex) → 데이터 넣기 → V(mutex) → V(full)
소비자: P(full)  → P(mutex) → 데이터 꺼내기 → V(mutex) → V(empty)
그림 1. 생산자가 데이터 1개를 넣은 직후의 세마포어 상태. 직접 그린 개념도다.

검산해 보자. 생산 2번, 소비 1번이 끝나면 empty는 3−2+1=2, full은 0+2−1=1이다. empty+full=3으로 버퍼 크기와 일치하면 정상이다. 이 합이 어긋나면 P·V가 한쪽만 호출된 곳이 있다는 신호다.

교착상태와 우선순위 역전은 세마포어 사용 순서에서 생긴다

위 코드에서 생산자가 P(mutex)를 먼저 잡고 P(empty)를 호출한다고 해 보자. 버퍼가 가득 찼다면 생산자는 mutex를 쥔 채 빈 칸을 기다리고, 소비자는 mutex를 얻지 못해 영영 꺼내지 못한다. 서로 기다리는 교착상태다. 자원을 얻는 순서를 일관되게 정하는 것이 가장 기본적인 예방책이다. 낮은 우선순위 프로세스가 쥔 락을 높은 우선순위 프로세스가 기다리는 우선순위 역전도 알아 둘 만하며, 우선순위 상속 같은 기법으로 완화한다.

답안에는 임계구역 조건과 P·V의 원자성을 먼저 쓰고 코드는 짧게 보인다

  • 문제 정의(경쟁 조건) → 해결 조건 3가지 → 세마포어 동작 → 뮤텍스와의 차이 → 대표 문제 순으로 쓴다.
  • 세마포어는 대기 중 CPU를 쓰지 않고 잠들게 할 수 있다는 점(바쁜 대기 회피)도 장점으로 적을 수 있다.
  • 실무 연결: 스레드 풀 크기 제한, 커넥션 풀, 락 순서 규칙 문서화, 락 보유 시간 최소화.

시험 직전 한 줄 요약

뮤텍스는 “내가 잠근 문을 내가 푸는” 상호 배제 도구이고, 세마포어는 “남은 자리 수”를 세는 신호 도구이며, 둘 다 사용 순서가 꼬이면 교착상태가 된다.

이 글은 학습용 정리이며 실제 시험 문항과 다를 수 있다. 출제 기준은 큐넷 등 공식 공지를 확인하라. 그림은 개념도이며 실측 데이터가 아니다.

zerg96

Recent Posts

불균형 데이터 처리, 정확도 98%인데 쓸모없는 모델이 되는 이유와 SMOTE·클래스 가중치 비교 (빅데이터분석기사)

환자 1,000명 중 암 환자가 20명뿐인 데이터로 모델을 만들었는데 정확도가 98%라면 훌륭한 모델일까? 안타깝게도 "모두…

2시간 ago

결합도와 응집도 정리, 모듈 설계에서 낮은 결합·높은 응집이 정답인 이유 (정보처리기사)

코드를 고칠 때 한 군데만 바꿨는데 엉뚱한 곳이 줄줄이 깨진 경험이 있다면, 그것이 결합도가 높은…

2시간 ago

커버로스(Kerberos) 인증 흐름 정리, AS·TGS·티켓 6단계와 비밀번호를 보내지 않는 이유 (정보보안기사)

사내 시스템에 한 번 로그인했는데 파일 서버, 메일, 인트라넷이 비밀번호를 다시 묻지 않는다면 뒤에서 커버로스(Kerberos)가…

2시간 ago

B-Tree 인덱스 원리와 인덱스를 못 타는 조건, 1억 건 중 한 건을 5블록으로 찾는 계산 (SQLD)

"인덱스를 만들었는데 왜 안 타요?" SQL 튜닝에서 가장 자주 나오는 질문이다. 답을 알려면 인덱스가 어떤…

2시간 ago

2026년 11월 금융 DT 테스트 시험 일정 (접수·시험·발표)

11월에 일정이 있는 금융 DT 테스트 시험을 정리했습니다. 접수, 시험, 합격 발표 날짜를 한 번에…

4시간 ago

2026년 11월 은행FP 시험 일정 (접수·시험·발표)

11월에 일정이 있는 은행FP 시험을 정리했습니다. 접수, 시험, 합격 발표 날짜를 한 번에 볼 수…

7시간 ago