임계영역 문제를 해결하기 위한 좀 더 높은 수준(higher-level)의 소프트웨어 전략으로 Mutex Locks, Semaphore, Monitor, Liveness가 있다.
임계영역에 진입하기 전에 락(열쇠)을 획득해야 한다.
임계영역을 빠져나온 후에는 락을 반납해야 한다.
💡 acquire(), release() 과정 모두 compare_and_swap 하드웨어 레벨의 연산을 사용하여 atomically 실행된다.
Busy Waiting(락을 획득하려고 무한 대기하는 것)을 사용하는 Mutex Lock
무한루프를 돌며 락의 상태를 확인하기 때문에 CPU를 낭비한다는 단점이 있다.
그러나 다음과 같은 일부 상황에서는 효율적이다.
시그널 메커니즘을 가진, 하나 이상의 프로세스/스레드가 임계영역에 접근 가능하도록 하는 장치
획득할 수 있는 락의 갯수를 가진 정수형 변수이다.
락이 전부 할당 되었을 때 (S <= 0) 해당 프로세스/스레드를 대기큐에서 대기하도록 하는 연산자이다.
S <= 0 즉, 획득할 수 있는 락이 남아있지 않은 경우 대기한다. 락이 반납되어 대기를 빠져나오면 락을 획득한 것이므로 S 변수의 값을 감소시킨다.
임계영역을 빠져나왔을 때 락을 반납하기 위해 사용하는 연산자이다.
락이 반납되었으므로 S 변수의 값이 증가한다.
S 값이 1인 세마포어, 1과 0의 상태밖에 없기 때문에 바이너리 세마포어라고 한다. 뮤텍스와 유사하다.
S 값이 N(1개 초과)인 세마포어, 복수개의 락을 관리한다. 여러 개의 인스턴스를 가진 자원에 사용할 수 있다.