두 스레드가 같은 변수를 동시에 고치면 결과가 실행할 때마다 달라진다. 이 문제를 푸는 도구가 세마포어와 뮤텍스다. 정보처리기사 운영체제의 프로세스 동기화 단원, 정보관리기술사 운영체제 영역에서 “세마포어와 뮤텍스의 차이”, “생산자-소비자 문제”가 자주 나온다. 용어보다 먼저 “무엇이 문제인가”를 이해하면 암기량이 크게 줄어든다.
두 스레드가 각각 count++를 1,000번씩 실행하면 2,000이 되어야 한다. 그런데 count++는 읽기, 더하기, 쓰기의 세 단계라 두 스레드가 같은 값을 읽고 각각 1을 더해 쓰면 한 번의 증가가 사라진다(갱신 손실). 공유 자원에 접근하는 코드 구간을 임계구역이라 하고, 올바른 해법은 세 조건을 만족해야 한다.
다익스트라가 제안한 방식이다. 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)
검산해 보자. 생산 2번, 소비 1번이 끝나면 empty는 3−2+1=2, full은 0+2−1=1이다. empty+full=3으로 버퍼 크기와 일치하면 정상이다. 이 합이 어긋나면 P·V가 한쪽만 호출된 곳이 있다는 신호다.
위 코드에서 생산자가 P(mutex)를 먼저 잡고 P(empty)를 호출한다고 해 보자. 버퍼가 가득 찼다면 생산자는 mutex를 쥔 채 빈 칸을 기다리고, 소비자는 mutex를 얻지 못해 영영 꺼내지 못한다. 서로 기다리는 교착상태다. 자원을 얻는 순서를 일관되게 정하는 것이 가장 기본적인 예방책이다. 낮은 우선순위 프로세스가 쥔 락을 높은 우선순위 프로세스가 기다리는 우선순위 역전도 알아 둘 만하며, 우선순위 상속 같은 기법으로 완화한다.
뮤텍스는 “내가 잠근 문을 내가 푸는” 상호 배제 도구이고, 세마포어는 “남은 자리 수”를 세는 신호 도구이며, 둘 다 사용 순서가 꼬이면 교착상태가 된다.
이 글은 학습용 정리이며 실제 시험 문항과 다를 수 있다. 출제 기준은 큐넷 등 공식 공지를 확인하라. 그림은 개념도이며 실측 데이터가 아니다.
환자 1,000명 중 암 환자가 20명뿐인 데이터로 모델을 만들었는데 정확도가 98%라면 훌륭한 모델일까? 안타깝게도 "모두…
코드를 고칠 때 한 군데만 바꿨는데 엉뚱한 곳이 줄줄이 깨진 경험이 있다면, 그것이 결합도가 높은…
사내 시스템에 한 번 로그인했는데 파일 서버, 메일, 인트라넷이 비밀번호를 다시 묻지 않는다면 뒤에서 커버로스(Kerberos)가…
"인덱스를 만들었는데 왜 안 타요?" SQL 튜닝에서 가장 자주 나오는 질문이다. 답을 알려면 인덱스가 어떤…
11월에 일정이 있는 금융 DT 테스트 시험을 정리했습니다. 접수, 시험, 합격 발표 날짜를 한 번에…