Conditional Variable

유석현(SeokHyun Yu)·2023년 6월 14일
0

운영체제

목록 보기
14/22
post-thumbnail

1. 개요

락 이외에도 병행 프로그램을 제작할 수 있는 다른 기법들이 존재한다.


2. 컨디션 변수의 개념과 관련 루틴

스레드 실행시, 특정 조건이 만족될 때까지의 대기를 위해 컨디션 변수(conditional variable)라고 불리는 개념을 사용할 수 있다.

컨디션 변수는 일종의 자료 구조이다.

컨디션 변수는 스레드 실행에서 어떤 상태가 원하는 것과 다를 때 조건이 만족되기를 대기하는 큐이다.

컨디션 변수에는 wait()와 signal()이라는 두 개의 연산이 있다.

wait()은 스레드가 스스로를 잠재우기 위해서 호출하는 것이고 signal()은 조건이 만족되기를 대기하며 잠자고 있던 스레드를 깨울 때 호출한다.

wait()은 mutex를 해제하고 호출한 스레드를 재운다.

다른 스레드가 시그널을 보내어 대기중인 스레드가 슬립(sleep) 상태에서 깨어나면, wait()에서 리턴하기 전에 반드시 락을 재획득 해야 한다.

시그널을 받아서 대기상태에서 깨어났더라도 락 획득에 실패하면 다시 sleep 상태로 들어간다.

대기 전과 후에 각각 락의 반납과 획득을 강제한다.


3. 생산자/소비자(유한 버퍼) 문제

Dijkstra가 처음 제시한 생산자/소비자 문제는 유한 버퍼(bounded buffer) 문제로도 알려져 있다.

공유 변수에서 경쟁 조건이 발생한다.

두 개의 컨디션 변수를 사용하면 된다.

profile
Backend Engineer

0개의 댓글