동기화?
- 한정적인 시스템 자원에 여러 스레드가 동시에 접근해서 사용하면 문제 발생 가능
- 이 문제를 방지하기 위해 여러 스레드에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정하는 기법
동기화를 하지 않으면?
Synchronization problem(Critical section problem)이 발생한다.
-> 두 개 이상의 concurrent한 스레드가 동기화 없이 공유 자원을 접근하는 문제 발생, 공유 자원들의 일관성이 깨질 수 있다.
- race condition
두 개 이상의 스레드 또는 프로세스가 공유 자원에 접근하는 상태. 결과가 non-deterministic(어쩔 때는 정상, 어쩔 때는 비정상)
- critical section
공유 자원을 접근하는 코드의 구간. race condition을 유발하는 코드의 구간. 이 구간에는 하나의 스레드만 들어갈 수 있도록 해야 한다.
임계구역 문제(Critical section problem) 해결책
- 상호 배제(Mutual Exclusion): 특정한 프로세스가 임계구역에서 실행되는 동안, 다른 프로세스는 접근할 수 없다.
- 진행(Progress): 임계구역을 사용하고 있지 않다면, 다른 프로세스가 접근할 수 있도록 한다.
- 한정된 대기(Bounded waiting): 임계구역 진입 횟수에 한계를 두어 같은 프로세스가 계속 독점해서 사용하지 못하게 한다. 다른 프로세스들이 기아 상태에 빠지지 않도록 한다.
위의 세 가지 조건이 만족되어야 한다.
동기화 매커니즘
- Low-level: 운영체제가 짧은 임계구역을 보호하기 위해 사용
- 소프트웨어: 복잡도가 높아 사용 X
많은 반복문을 구현하는 과정에서 속도 저하가 발생하게 되고, 구현이 복잡하다. 또한 interrupt를 억제함으로써 해결할 수는 있지만 그만큼 overhead가 발생한다. 가장 큰 문제점으로는 원하는 자원을 얻기 위한 권한을 얻을 때까지 반복해서 확인해야만 하는 Busy waiting 현상이 발생하게 됨.
- 하드웨어:
single CPU: interrupt disable, enable 사용
multiple CPU: hardware atomic instruction(test and set), lock
HW solution도 마찬가지로 Busy waiting 현상이 존재한다.
- High-level: 애플리케이션 프로세스나 스레드가 사용하는 방법
- Semaphore: 공유 자원의 개수를 표현하는 integer 변수, wait, signal(들어갈 때, 나갈 때)
- Critical Region: 프로그래밍 언어 차원에서 보장. 보장해주는 역할 compiler
- Monitor: 공유 데이터를 접근하기 위해서는 모니터의 내부 Procedure를 통해서만 가능
- Mutex + Condition variables