하드웨어 기반 해결책은 너무 복잡하다.
그래서 임계구역 문제의 3번째 해결책인 뮤택스 락을 알아보자.
개요 : 뮤택스 락
💡 mutex (뮤택스) = mutual exclusion = 상호배제
임계구역을 보호하고 경쟁조건을 방지하기 위한 소프트웨어 도구.
뮤택스 락 : 구조
available이라는 변수로 락의 가용 여부를 표시.
프로세스는 다음과 같은 순서를 거친다.
1. 프로세스 락 획득 -> acquire()로 진행함.
2. 임계구역 들어가기
3. (행동)
4. 프로세스 락 반환 -> release()로 진행함.
acquire()과 release()는 CAS를 사용하여 호출.
- 원자적으로 수행되어야 하기 때문.
특징
바쁜 대기를 해야 한다.
- 임계구역에 들어갈 프로세스들은 계속 acquire() 함수를 호출하는 반복문을 실행해야 한다.
- 하나의 CPU 코어가 여러 프로세스에서 공유되는 실제 멀티 프로그래밍에서 분명히 문제가 됨.
- 따라서 바쁜 대기는 CPU 주기를 낭비함.
이러한 뮤택스 유형을 스핀락이라고도 한다.
- 락을 사용할 때까지 프로세스가 회전하기 때문.
- 프로세스가 락을 기다려야 하고 문맥 교환에 상당한 시간이 소요될 때 문맥 교환이 필요하지 않다는 장점이 있다.
- 멀티코어 ⇒ 실제로 스핀락을 선호한다.
- 잠깐 동안 락을 유지해야 하는 경우, 다른 쓰레드가 하나의 코어에서 임계구역을 실행하는 동안 쓰레드는 다른 처리 코어에서 spin하고 있을 수 있다.
- 최신 운영체제에서 널리 사용.