process를 동기화하기 위해서는 아래 도구들을 사용한다.
mutex lock은 critical section에 진입하는 process가 자신이 있음을 알리기 위해 lock을 걸도록 하는 도구이다.
이를 통해 다른 process는 critical section이 잠겨 있다면 기다리고 그렇지 않다면 접근할 수 있도록 한다.
mutex lock의 가장 간단한 구조는 아래와 같다.
위 상황에서 lock을 획득할 수 없다면 무작정 기다리고, 획득 가능하다면 locking 후 critical section에서 작업을 시작하도록 하며 critical section에서 빠져나올때는 다시 locking을 해제함으로써 critical section을 보호한다.
acquire 함수에서는 critical section이 잠겨있는지 반복적으로 lock을 확인하는데 이를 busy wait이라 한다.
공유 자원이 여러 개 있는 경우 여러 개의 process가 각각 자원에 접근할 수 있어야한다.
mutex lock과 형태 자체는 유사한데, binary semaphore같은 경우는 mutex lock과 아주 비슷하고 counting semaphore는 mutex lock을 여러 자원에 활용할 수 있도록 하는 것이다.
semaphore에 비해서 더 사용자 친화적인 도구이다.
monitor는 공유 자원과 공유 자원에 접근하기 위한 interface를 묶어 관리하고 process는 반드시 interface를 통해 공유 자원에 접근하도록 한다.
이를 위해 monitor를 통해서 공유 자원에 접근하고자 하는 process를 queue에 삽입하고 queue에 삽입된 순서대로 하나씩 공유 자원을 이용하도록 한다.
이 밖에도 monitor는 semaphore와 마찬가지로 실행 순서 제어를 위한 동기화도 제공한다.
특정 조건을 바탕으로 process를 실행하고 일시 중단하기 위해 monitor는 condition variable을 사용하여 process나 thread의 실행 순서를 제어한다.