2 분 소요

조건 변수(Condition Variable)

다중 프로세스 or 스레드 환경에서 사용하는
‘동기화 도구’ 중 하나

특정한 조건이 만족될 때까지의 스레드를 대기시키는 용도이다
(일종의 ‘큐’ 자료구조로 이해하는 것이 좋다)

조건 변수는 일반적으로 ‘락’ 혹은 ‘모니터’와 함께 사용되며,
공유 자원에 대한 접근을 조절하고, 조건의 ‘충족’을 감지한다

조건 변수의 주요 기능은

  • 대기 : 스레드가 특정 조건이 충족될 때까지 대기하도록 함
  • 신호 전송(signal) : 조건이 충족되면, 다른 스레드에 신호를 보내 대기 상태에서 벗어나게 한다 => 공유 자원에 대한 접근을 조절함으로서, ‘동기화’의 목적을 달성한다

조건 변수의 작동 방식은

  • 대기 : 스레드가 조건 변수를 ‘기다리며’ 대기할 때, ‘락’을 획득(mutex를 잠근다는 의미와 동일)한 상태에서 대기한다
  • 신호 전송 : 조건이 충족되면 락을 획득하여, 조건 변수의 대기 중인 스레드에게 신호를 보내고,
    작업을 시작하도록 함

기본적으로 ‘락(mutex)’ 이나 ‘세마포어(semaphore)’의 경우
‘상호 배제’에 대한 기능을 제공하여 ‘임계 영역(critical section)’에 대한
접근을 제어하는 것이 주요한 목적이나

조건 변수의 경우 ‘특정 조건’이 만족될 때까지
‘대기’시키는 목적이 주요하다
(이에 따라서, 서로 다른 스레드의 순서 여부 및
특정 조건의 만족 여부를 동기화할 수 있음)

이러한 목적으로 인해, 복잡한 동기화 문제를 해결하는데 도움을 준다
(spin lock(전역 변수를 이용한 busy waiting 방식)으로도 동기화가 가능하지만,
CPU의 자원을 너무 많이 잡아먹는다)

POSIX 환경에서의 cond 함수들
pthread_cond_init : 조건 변수 초기화
pthread_cond_wait : 조건 변수를 기다림,
처음 호출 시, 락을 획득하고 스레드를 대기 상태로 전환, 그리고 다시 락을 해제
이후에 signal을 받은 경우, 다시 락을 획득한다 pthread_cond_signal : 대기 중인 스레드 중 하나를 깨운다
pthread_cond_broadcast : 대기 중인 모든 스레드를 깨운다

사용 예시(C)

pthread_mutex_lock(&m);

while (!condition_is_met) {
    pthread_cond_wait(&c, &m);
}

// 조건이 충족되면 락을 획득하여 작업 수행

pthread_mutex_unlock(&m);

현재 스레드가 lock 획득(m)

조건이 맞는 경우, 바로 작업을 수행하고 unlock 한다

조건이 맞지 않는 경우,
cond_wait가 호출된다
(처음 구문 진입 시 락을 획득하는 부분은 무시됨) 스레드는 대기 상태로 전환되고, 락이 해제된다
signal로 깨어났을 때, 락을 다시 획득하며
조건이 맞지 않는 경우, while에서 계속 대기한다

이후 조건이 만족되었다면, while문에서 빠져나온다
이 때 lock을 획득한 상태이기에
unlock으로 lock이 해제된다

Monitor

상호 배제와 ‘조건 변수’를 함께 제공하는 도구

한 번에 하나의 스레드만,
모니터 내부의 ‘임계 영역’에 접근이 가능
(상호 배제)

Hoare 가 제안한 시그널 기반 모니터에 대하여

  • 지역 변수는 모니터의 프로시저를 통해 접근 가능(외부에서 변수로의 직접 접근 허용 x)
  • 프로세스는 모니터의 프로시저 중 하나를 호출함으로 모니터로 들어감
  • 한 순간에 오직 하나의 프로세스(or 스레드) 만이 모니터 내에 존재
    (상호 배제)
  • 각 프로세스의 동기화를 위하여 ‘조건 변수’를 제공
    이는 모니터 내부에 포함되며, 모니터 내부에서만 접근 가능

monitor를 정말 간략하게 설명하자면,
‘특정 시점에 혼자서 공유 자원의 어떤 상태를 처리하며 진행’ 한다는 의미와도 같다
(굳이 비유하자면, 움직이는 블록이 다가오길 기다리는 마리오 같다고 해야 하나)

‘특정 시점에 혼자’ 를 말하는 부분이 ‘상호 배제’(mutex) 이며,
‘공유 자원의 어떠한 상태’를 말하는 부분이 ‘조건 변수’이다

그리고 그러한 과정을 처리하도록 하는 매커니즘이 바로 ‘모니터’이다

댓글남기기