두 개 이상의 프로세스가 shared data에 동시 접근하면 data inconsistency가 발생할 수 있기 때문에 data consistency를 유지하기 위한 매커니즘을 프로세스 동기화라 한다.
경쟁 상황(race condition)
- 커널 수행 중 인터럽트 발생 시, 커널 수행 중 context switching 발생 시, 멀티 프로세서에서 커널 내부 shared data 동시 접근하는 경우
임계 구역(The Critical-Section)
- 멀티 프로세서애서 race condition을 해결하기 위해 하나 씩 들어갈 수 있도록 임계 구역으로 해결
- 하나의 프로세스가 critical section에 있을 때 다른 프로세서가 못 들어오게 해야 함
상호 배제(Mutex : Mutual Exclusion)
- critical section을 가진 스레드의 런타임이 겹치지 않게 하는 것
- locking, unlocking 사용
데커(Dekker) 알고리즘
- flag : 프로세스 중 어떤 것이 임계 구역에 들어갈지
- turn : 어떤 것이 임계 구역 사용 중인지
피터슨(Peterson) 알고리즘
- 데커와 유사하지만 상대 프로세스에 진입 기회 양보
제과점(Bakery) 알고리즘
세마포어(Semaphore)
- 세마포어는 복수개의 스레드가 임계 구역 접근 가능
- wait, signal로 구현
- wait이 먼저 호출되어 임계 구역에 들어갈 수 있는지, 우선적으로 실행되어야 할 스레드가 실행되는지 확인
- 세마포어는 뮤텍스가 될 수 있지만 그 반대는 안됨
모니터(Monitor)
- 하나의 프로세스 내 다른 스레드 간의 동기화에 사용
- 라이브러리 혹은 프레임워크가 제공 (Java에 존재)
- syncronized, wait(), notify() 등의 키워드로 편하게 동기화 가능