스물두줄

컴퓨터시스템응용기술사 · 개념서 · 컴퓨터 구조 및 운영체제

동기화 기법

설명 영상 동기화 기법: 세마포어·뮤텍스·모니터 · 2:42

왜 배우는가: 세마포어와 뮤텍스, 모니터는 공유 자원 동기화의 기본 도구로, 운영체제와 멀티스레드 프로그래밍 전반에서 쓰인다. 두 문항은 용어 비교와 상호관계를 묻는 형태로 반복 출제되므로 정의와 차이를 정확히 구분해 두어야 한다.

출제 이력: 제120회 1교시 12번, 제98회 1교시 11번

1. 한 줄 정의와 핵심 키워드

답안 첫 줄 정의: 세마포어는 정수 카운터로 공유 자원 접근 수를 제어하고, 뮤텍스는 한 번에 한 주체만 임계 구역에 들어가게 하는 상호 배제 객체다.

핵심 키워드

  • 상호 배제(Mutual Exclusion)
  • 임계 구역(Critical Section)
  • 경쟁 상태(Race Condition)
  • 세마포어(Semaphore)
  • 뮤텍스(Mutex)
  • P 연산(wait)과 V 연산(signal)
  • 모니터(Monitor)

2. 개념 풀이

쉬운 말로 하면, 여러 실행 흐름이 같은 자원을 동시에 고치면 결과가 실행 순서에 따라 달라진다. 이를 막기 위해 자원 앞에 출입 장치를 두는 것이 동기화다.

뮤텍스는 화장실 칸이 하나뿐인 경우와 같다. 한 사람이 들어가면 나올 때까지 다른 사람은 기다린다. 뮤텍스는 잠금(Lock)과 해제(Unlock) 두 상태를 가지며, 잠근 주체가 스스로 해제하는 소유자(Ownership) 개념이 있다. 이진 상태이므로 흔히 이진 세마포어와 비슷하게 동작하지만, 잠금 메커니즘이라는 점이 다르다.

세마포어는 정수값 S를 가진 카운터다. S는 동시에 접근할 수 있는 주체 수의 상한을 나타낸다. 화장실 칸이 세 개면 세 사람이 동시에 들어갈 수 있고, 한 명이 나올 때 다음 사람이 들어간다. 세마포어는 Dijkstra가 제안했으며, P 연산(wait)으로 S를 1 줄이고 V 연산(signal)으로 S를 1 늘린다. 세마포어에는 소유자 개념이 없으므로 다른 주체가 signal을 호출해도 된다.

모니터는 공유 자원의 데이터와 그 데이터를 다루는 프로시저를 한 덩어리로 묶은 추상 자료형(ADT)이다. 모니터 경계에서 상호 배제가 자동으로 적용되며, 한 순간에 한 프로세스만 진입한다. 기다림은 조건 변수(Condition Variable)의 wait/signal로 처리한다. Java의 synchronized와 wait(), notify()가 이 방식을 따른다.

3. 등장 배경과 필요성

초기 동기화는 단순 플래그 변수로 시도되었으나, 플래그 검사와 설정 사이에 다른 주체가 끼어들 수 있어 상호 배제가 깨졌다. 이를 해결하려고 검사와 변경을 원자적으로 수행하는 연산이 필요해졌다. 세마포어는 이 요구에 맞춰 P와 V 두 연산으로 정의되었다.

그러나 세마포어는 연산 순서를 잘못 쓰면 쉽게 오류가 난다. wait와 signal의 순서가 바뀌면 상호 배제가 깨지고, signal 대신 wait를 쓰면 교착 상태가 생긴다. 프로그래머가 모든 연산 쌍을 직접 맞춰야 하는 부담이 컸다.

이 문제를 줄이기 위해 모니터가 등장했다. 자료 추상화와 정보 은폐를 바탕으로 상호 배제를 언어 수준에서 보장하므로, 개발자는 카운터 값을 직접 다루지 않아도 된다. 다만 모니터는 구현하는 언어와 런타임의 지원이 필요하다. C에서는 기본 기능으로 제공되지 않아 라이브러리로 구현하는 경우가 많다.

이어지는 내용

로그인하면 하루 5페이지까지 무료로 전체를 읽을 수 있습니다.

앱에서 이 단원 읽기