동기화를 공부하다 보면 뮤텍스락(Mutex), 세마포어(Semaphore) 를 이해한 뒤에도 “실행 순서를 제어해야 하는 더 복잡한 상황”에서 막히는 경우가 많다.
오늘은 이 문제를 해결하는 도구들인 조건 변수(Condition Variable) 와 모니터(Monitor) 를 이미지 기반으로 정리해본다.
1. 조건 변수(Condition Variable)란
조건 변수는 쉽게 말하면 “특정 조건이 충족될 때까지 프로세스/스레드의 실행을 잠시 멈추게 하는 도구” 이다.
✔ 왜 필요한가?
뮤텍스락과 세마포어는 동시 접근을 막는 역할은 뛰어나지만,
“어떤 작업이 먼저 실행되어야 한다” 같은 실행 순서 제어는 어렵다.
예를 들어:
- ❌ B는 반드시 A가 끝난 뒤 실행되어야 한다.
- ❌ 버퍼가 비었으면 소비자는 기다려야 한다.
- ❌ 버퍼가 꽉 찼으면 생산자는 기다려야 한다.
이러한 상황을 위해 조건 변수가 등장한다.
2. 조건 변수의 핵심 기능
조건 변수에는 두 가지 함수가 있다.
1️⃣ wait()
- 현재 스레드를 즉시 대기 상태로 전환한다
- 그리고 내부적으로 사용하던 락(lock)도 자동으로 잠시 내려놓는다
- 다른 스레드가 signal()을 호출할 때까지 절대 깨어나지 않음
→ “조건이 충족될 때까지 잠깐 가 있어!”
2️⃣ signal()
- 대기 중인 스레드 중 하나를 깨운다
- “조건 충족! 이제 실행해도 돼!” 의미
3. 시각적 흐름으로 이해하기 (예시)

1️⃣ 예제 상황
P1, P2라는 두 개의 프로세스가 있다고 하자.
P1은 어떤 조건이 만족되기 전까지 진행하면 안 되고,
그 조건은 P2가 충족시켜 준다.
즉:
- P1 → “조건 아직 안 됐네… wait()”
- P2 → “조건 충족! signal() 호출”
- P1 → “오케이 이제 다시 실행”
P1 실행
→ cv.wait() 호출
→ 대기 상태로 전환
(시간 흘러…)
P2 실행 (2초 후)
→ cv.signal() 호출
P1 다시 실행 재개
이 흐름을 보면 조건 변수가 정확히 **“특정 시점을 기다리는 도구”**라는 걸 이해할 수 있다.
4. 모니터(Monitor)란?

뮤텍스락 + 조건 변수의 개념을 하나의 인터페이스로 묶은 고급 동기화 도구다.
1️⃣ 모니터의 특징
- 뮤텍스락처럼 상호 배제를 보장한다
- 조건 변수처럼 실행 순서까지 제어할 수 있다
- 프로세스/스레드는 반드시 모니터 내부로 진입해야 공유 자원에 접근할 수 있다
- 이미 내부에서 실행 중인 프로세스가 있다면 나머지는 큐에 줄 서서 기다림
즉, 모니터는 아래 두 가지가 결합된 구조다.
- 공유 자원 → 한 번에 하나만 접근 가능
- 조건 변수 → 특정 조건 충족 시만 실행 가능
이렇게 보면 모니터란 게 “고급형 락 시스템 + 실행 순서 조절 장치” 라는 걸 알 수 있다.
2️⃣ 왜 인터페이스(연산) 단위로 접근하게 할까?
→ 공유 자원을 직접 접근하게 하면 위험함
→ “반드시 정해진 함수(연산)를 통해서만 접근하도록 강제”하는 것이 모니터의 안전성
6. 조건 변수 + 모니터 조합 예시
문제 상황
프로세스 A와 B가 있는데
“반드시 A가 먼저 실행되고 그 후 B가 실행”되어야 하는 경우를 생각하자.
✔ 조건이 충족되지 않은 경우
- 만약 B가 A보다 먼저 모니터 내부로 들어가 버리면,
실행 순서가 깨진다. - 이런 경우 모니터는 B에게 cv.wait() 를 호출하게 하여
“대기실로 보내버린다”
✔ 내부 구조 흐름 (이미지 기반)
❌ B가 먼저 들어왔다
→ 'A 먼저 실행되어야 함' 조건 불충족
→ cv.wait() 호출
→ B는 대기 상태로 큐에 들어감
✔ A가 실행되고 조건 충족
→ cv.signal() 호출
→ B를 깨워서 다시 실행
즉, 모니터 + 조건 변수 조합은
실행 순서 제어를 완벽하게 보장하는 동기화 시스템이다.
정리하면
| 개념 | 역할 | 특징 |
| 뮤텍스락 | 상호 배제 | 하나의 공유 자원 보호 |
| 세마포어 | 상호 배제 + 여러 자원 관리 | 카운터를 이용 |
| 조건 변수 | 실행 순서 제어 | wait() / signal() |
| 모니터 | 자원 접근 + 실행 순서 제어 | 락 + 조건 변수 통 |
- 뮤텍스락 → “한 번에 한 명만 들어와!”
- 세마포어 → “한 번에 n명까지 들어와!”
- 조건 변수 → “조건 충족할 때까지 기다려!”
- 모니터 → “다들 줄서서 정해진 규칙대로 들어와! 필요하면 대기해!”
'컴퓨터 과학' 카테고리의 다른 글
| [운영체제] 가상 메모리 - 물리 주소와 논리 주소 & 스와핑 (0) | 2025.11.30 |
|---|---|
| [운영체제] CPU 스케줄링 - CPU 활용률 (0) | 2025.11.30 |
| [운영체제] 동기화와 교착 상태 - 세마포 (0) | 2025.11.29 |
| [운영체제] 동기화와 교착 상태 - 동기화 기법 (0) | 2025.11.29 |
| [운영체제] 동기화와 교착 상태 - 임계구역 (0) | 2025.11.29 |