컴퓨터 과학

[운영체제] 동기화와 교착 상태 - 조건 변수와 모니터

Data Jun 2025. 11. 29. 22:58

동기화를 공부하다 보면 뮤텍스락(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명까지 들어와!”
  • 조건 변수 → “조건 충족할 때까지 기다려!”
  • 모니터 → “다들 줄서서 정해진 규칙대로 들어와! 필요하면 대기해!”