Process Synchronization
Initial Attempts to Solve Problem
- software적 해결방법(알고리즘)
- Peterson's Algorithm은 매우 좋은 해결방법이었지만 busy-waiting(spin-lock)이 발생
- hardware적으로 락을 설정하여 이 문제를 해결(testAndSet)
- 하지만 이는 프로그래머가 매번 사용하기에 부적절함
- 위의 방식들을 추상화 시킨 Semaphores의 등장
Semaphores
- 추상 자료형, 정수형을 가질 수 있음(자원의 개수를 표현)
- 자원의 개수가 1개인 경우 이를 가져가면(P연산) Lock이 됨
- 2가지의 atomic 연산
- P(S): Semaphores 변수값(공유 데이터)획득, 자원이 없으면 while, 있으면 S--
- V(S): 반환, S++
- 구현 방식
- busy-wait: 효율적이지 못함(=spin lock)
- Block & Wakeup: (=sleep lock)
Block & Wakeup Implementation


Deadlock & Starvation
- Deadlock: 둘 이상의 프로세스가 서로 상대방에 의해 충족될 수 있는 event를 무한히 기다리는 현상
- Starvation(Indefinite blocking): 특정 프로세스가 자원을 받지못하는 현상
Classical Problems of Syncronization
- Bounded-Buffer Problem
- Readers-Writers Problem
- Dining-Philosophers Problem
Semaphore를 이용하여 위의 문제들을 해결할 수 있다.
Semaphore는 코딩하기 어렵고, 정확성의 입증이 어려우며, 자발적 협력이 필요하다.
또한 한번의 실수가 모든 시스템에 치명적으로 작용하기 때문에 모니터가 도입되었다.
모니터
Semaphore와 다르게 Monitor는 자체적으로 하나의 프로세스만 접근이 가능하기 때문에 Lock이 필요없다.
모니터란?
모니터는 concurrent programming에서 쓰레드가
1. mutual exclusion을 보장
2. 조건에 따라 대기(wait) 상태로 전환(block)
기능을 가질 수 있게 해주는 프로그래밍 언어차원에서의 기능이다.
모니터 사용 시기
- 한번에 하나의 쓰레드만 실행되어야 할 때
- 여러 쓰레드와 협업(cooperation)이 필요할 때
모니터의 구성 요소
모니터 사용 예시
acquire(m);
while (!p) {
wait(m, cv);
}
signal(cv2);
release(m);
모니터의 큐(queue)
- entry queue: critical section에 진입을 기다리는 큐
- wating queue: 조건이 충족되길 기다리는 큐
bounded producer/ consumer problem
- buffer가 가득차서 producer가 이를 계속 확인해야하는 문제
- buffer가 비어서 consumer가 이를 계속 확인해야하는 문제

이를 모니터를 이용하여 해결할 수 있음
자바에서의 모니터

-
자바에서는 모든 객체는 내부적으로 모니터를 가진다.
-
synchronized 키워드를 이용하여 모니터의 mutual exclusion 기능을 이용할 수 있다.
-
자바의 모니터는 condition variable를 하나만 가짐
- wait
- notify(signal)
- notifyAll(broadcast)
크로스오버 표
