동기화 기법: 세마포어·뮤텍스·모니터
동기화는 여러 실행 흐름이 같은 자원을 동시에 고치지 못하게 막는 기법이다. 세마포어는 정수 카운터, 뮤텍스는 한 번에 한 주체만 들어가는 상호 배제 객체다. 이 둘과 모니터를 차례로 비교하며 헷갈리는 지점을 짚어 본다. 여러 실행 흐름이 같은 자원을 동시에 고치면…
주요 장면
대본
동기화 기법 개요
동기화는 여러 실행 흐름이 같은 자원을 동시에 고치지 못하게 막는 기법이다.
세마포어는 정수 카운터, 뮤텍스는 한 번에 한 주체만 들어가는 상호 배제 객체다.
이 둘과 모니터를 차례로 비교하며 헷갈리는 지점을 짚어 본다.
경쟁 상태와 임계 구역
여러 실행 흐름이 같은 자원을 동시에 고치면 결과가 실행 순서에 따라 달라진다.
이를 막으려면 자원 앞에 출입 장치를 두는 것이 동기화다.
출입 장치가 곧 임계 구역을 지키는 동기화 도구다.
뮤텍스와 세마포어 비교
뮤텍스와 세마포어는 둘 다 공유 자원의 상호 배제에 쓰이지만 차이가 있다.
값은 뮤텍스가 잠금과 해제 두 상태, 세마포어가 정수 카운터 S다.
허용 수는 뮤텍스가 한 번에 한 스레드, 세마포어는 최대 N개다.
가장 자주 틀리는 것은 소유자 개념이다. 뮤텍스만 잠근 스레드가 해제할 수 있다.
모니터의 구조
모니터는 공유 데이터와 그 데이터를 다루는 프로시저를 한 덩어리로 묶은 추상 자료형이다.
모니터 경계에서 상호 배제가 자동으로 시행되어, 한 순간에 한 프로세스만 활동한다.
기다림은 조건 변수의 wait와 signal로 처리하며, Java의 synchronized와 wait(), notify()가 이 방식을 따른다.
모니터는 내부적으로 세마포어로 구현할 수 있으며, 세마포어는 더 저수준의 도구다.
세마포어 계산 예제
프린터가 3대인 시스템에서 요청 프로세스 5개가 차례로 wait를 호출한다고 하자.
S는 3에서 2, 1, 0으로 줄어들어 P1~P3가 진입한다. 값이 0 이상이기 때문이다.
P4와 P5는 S가 음수가 되어 대기 큐에 들어간다. 음수 값의 크기가 대기자 수다.
정답 확인과 헷갈리는 점
앞의 문제 정답은 -2다. 3에서 wait 호출 5회를 뺀 값이다.
헷갈리는 점은 세 가지다. 첫째, 뮤텍스만 소유자가 있다.
둘째, 이진 세마포어는 0과 1만 가지며 뮤텍스를 정수 카운터로 쓰면 틀린다.
셋째, wait와 signal의 순서가 바뀌면 상호 배제가 깨지고, 빠뜨리면 교착 상태가 생긴다.
정리
정리하면, 뮤텍스는 소유자가 있는 잠금이고 세마포어는 정수 카운터다.
모니터는 같은 목적을 언어 수준에서 감싼 고수준 구조다.
답안은 정의, 뮤텍스와 세마포어, 차이 순으로 쓰면 된다.