💡7장 목표
- 동기화 문제의 3가지 모델
- 여러 OS의 동기화 툴
- POSIX와 JAVA
Synchronization schemes
- Bounded-Buffer problem (=producer-consumer)
- Readers and Writer problem
- Dining-Philosopher problem
강노 참고~
Kernel Synchronization
커널에서 제공하는 동기화 기능
Window
- Interrupt masks: 하드웨어적으로 CS를 보호하기 위해 interrupt disable하는 등의 기능 → single CPU에서 유용(multi면 disable 다 해줘야하고 확장성 부족)
- Spinlock: 독점권을 얻기 위해 CPU를 놓지 않고(wait상태가 되지 않고) 반복문에 들어가서 기다리기 → 기다리는 시간이 짧은 경우 유용
- Dispatcher objects: mutexes, semaphores, events, timers 등 기능 제공 → 자원 사용 가능한 signaled-state 또는 사용 불가능으로 기다려야하는 non-signaled-state이다.
Linux
- 2.6버전 이전에는 short critical section에 대해 disanle interrupts기능 사용
- 2.6버전 이후로는 모두 선점형으로 바뀜 (비선점은 race condition을 발생시키지 않지만 높은 우선순위가 오래 기다리는 문제)
- Semaphores
- atomic intergers
- spinlocks → single CPU에서는 enabling and disabling kernel preemption(선점)
- reader-writer version of both
POSIX Synchronization
POSIX는 API 표준이다. POSIX를 따르는 OS는 UNIX, Linux, macOS가 있으며 이들끼리는 호환성을 가진다.
POSIX API가 제공하는 동기화 기능은 아래와 같다. (코드 강노 참고)
- Mutex lock
- Semaphores → named와 unnamed 프로세스 둘 다 사용 가능 (named는 상관관계가 없는 프로세스)
- Condition Variable
Java Synchronization
코드 강노 참고
- Java monitors
- synchronized로 함수 선언
- 기존 monitor와 동일한 구조
- object에 한 스레드만 들어갈 수 있음
- object에 들어가기를(사용권한을) 기다리는 스레드들이 모여있는 entry set
- object 내에서 기다리는 wait set (object 내 코드를 수행하다가 wait() condition 발생하여 기다리는 스레드들)
- signal()대신 notify()가 wait()를 깨움
- Reentrant locks (mutex와 유사)
- Semaphores
- Condition variables
Alternative Approaches
미들웨어에서 제공하는 다양한 동기화 기능
코드 강노 참고
- Transactional Memory
- transaction은 쪼갤 수 없는 한 덩어리를 의미 → atomic하게 처리
- 기존 mutex나 semaphor사용하는 것보다 간단
- OpenMP
- #pragma omp critical하면 안에 있는거를 critical section으로 보호해줌
- #pragma omp pararrel하면 코어 수만큼 스레드를 만들어 자동으로 병렬처리 해줌
- Functional Programming Languages
- 재귀 기반 프로그래밍
- 공유 데이터 없음 → critical section이 자동으로 보호됨