Chapter7. 동기화 예제
6장에서는 임계 구역 문제를 제시하고 여러 병행 프로세스가 데이터를 공유할 때 어떻게 조경쟁조건이 발생할 수 있는 지에 중점을 두었다. 계속해서 경쟁조건이 발생하지 않도록 하여 임계구역 문제를 해결하는 몇가지 도구를 검토하였다.
이러한 도구는 메모리 장벽 및 compare_and_swap 연산과 같은 저수준 하드웨어 해결책에서 점점 더 높은 수준의 도구(mutex락에서 세마포, 모니터까지)에 이르기까지 다양하였다.
7.1 고전적인 동기화 문제들
본 절에서는 많은 클래스의 병행 제어 문제에 대한 예로서 중요한 여러가지 다른 동기화 문제들을 제시한다.
7.1.1 유한버퍼문제
유한버퍼문제는 6.1절에서 소개하였다. 생산자 소비자 문제 (n개의 버퍼로 구성된 pool이 존재)
7.1.2 Readers-Writers 문제
데이터 베이스의 내용을 읽기만 원하는 프로세스를 readers, 갱신(즉, 읽고 쓰기)를 하기를 원하는 프로세스를 writers라고 부르며 두가지 유형의 프로세스들을 구별한다.
- 두 reader가 동시에 공유 데이터에 접근하더라도, 불행한 결과가 발생하지는 않는다.
- 그러나 하나의 writer와 어떤 다른 스레드가 동시에 데이터베이스에 접근하면, 혼란이 야기될 수 있다.
⇒ 이러한 문제점이 발생하지 않도록 하기 위해, 우리는 writer가 쓰기 작업동안에 공유 데이터 베이스에 대해 배타적 접근 권한을 가지게 할 필요가 있다. 이 동기화 문제를 readers-writers 문제라고한다.
- 첫번째 readers-writers 문제: writer가 공유객체 사용허가를 얻지 못했다면, 어느 reader도 기다리게 해서는 안된다.
- 두번째 readers-writers 문제: writer가 객체에 접근하려고 기다리고 있다면, 새로운 reader들은 읽기를 하지 못한다.
⇒ 이들 문제에 대한 해결안이 기아 상태에 따질 수 있다. 첫번째 경우 , writer가 기아상태에 빠질 수 있으며 두번째 경우는 reader가 기아상태에 빠질 수 있다.
이 책에서는 첫 번째 readers-writers 문제에 대한 해결안을 제공한다. (p.322 참고)
Reader-writer 락은 다음과 같은 상황에서 가장 유용하다.
- 공유 데이터를 읽기만 하는 프로세스와 쓰기만 하는 스레드를 식별하기쉬운 응용
- Writer보다 reader의 개수가 많은 응용. 일반적으로 reader-writer 락을 설정하는 데 드는 오버헤드가 세마포나 상호배제 락을 설정할 때보다 크다. 이 오버헤드는 동시에 여러 reader가 읽게 하여 병행성을 높임으로써 상쇄할 수 있다.
7.1.3 식사하는 철학자들 문제
식사하는 철학자들은 고전적인 동기화 문제다. 교착상태와 기아를 발생시키지 않고 여러 스레드에게 여러자원을 할당해야할 필요를 단순하게 표현한 것이다.

7.1.3.1 세마포 해결안
7.1.3.2 모니터 해결안
- 프로세스 동기화의 고전적 문제에는 유한 버퍼 , reader-writer 및 식사하는 철학자 문제가 포함된다. 이러한 문제에 대한 해결안은 mutex 락, 세마포어, 모니터 및 조건 변수를 포함하여 6장에서 제공된 도구를 사용하여 개발할 수 있다.
7.2 커널 안에서의 동기화
우리는 Windows, Linux 운영체제에서 제공되는 동기화 기법을 설명한다.
- Windows는 dispatcher 객체와 event를 사용하여 프로세스 동기화 도구를 구현한다.
- Linux는 원자적 변수, 스핀락 및 mutex락을 포함한 경쟁 조건을 방지하기 위해 다양한 접근방식을 사용한다.
7.3 POSIX 동기화
- POSIX API는 mutex락, 세마포 및 조건 변수를 제공한다. POSIX는 두가지 형태의 세마포(기명과 무명)를 제공한다. 관련이 없는 여러 프로세스가 단순히 이름을 참조하여 동일한 이름의 세마포에 쉽게 액세스 할 수 있다. 무명 세마포는 쉽게 공유할 수 없으며 공유 메모리 영역에 세마포를 배치해야한다.
7.4 Java에서의 동기화
- Java에는 동기화를 위한 풍부한 라이브러리와 API가 있다. 사용가능한 도구에는 모니터(언어레벨로 제공됨)와 재진입락, 세마포어 및 조건 변수(API에서 지원)가 포함된다.
7.5 대체 방안들
- 임계구역 문제를 해결하기 위한 대안으로는 트랜잭션 메모리, OpenMP 및 함수형 언어가 있다. 함수형 언어는 절차적 언어와 다른 프로그래밍 패러다임을 제공하므로 특히 흥미롭다. 절차형 언어와 달리 함수형 언어는 상태를 유지하지 않으므로 일반적으로 경쟁 조건 및 임계구역의 영향을 받지 않는다.