critical section 문제를 하드웨어 기반으로 해결하기엔 복잡할 뿐만 아니라 응용 프로그래머는 사용할 수가 없다. 그렇기에 운영체제 설계자들은 임계 영역 문제를 해결하기 위한 상위 수준 소프트웨어 도구들을 개발하였고 그 중 하나가 mutex locks이다.
간단하게 프로세스는 임계영역에 들어갈때 반드시 락을 획득하고 빠져나올때 락을 반환해야한다.
락을 획득하는 함수이다. available이라는 불린 변수는 락의 가용 상태를 표시한다. available==true
면 락을 얻을 수 있는 상태이며 false
면 락을 얻을 수 없는 상태이다.
이 함수는 원자적으로 수행되어야한다.
acquire(){
while(!available); // busy wait
avilable = false;
}
락을 반납하는 함수이다. 이 함수는 원자적으로 수행되어야한다.
release(){
avilable = true;
}
while(true){
acquire lock;
critical section
release lock;
remainder section
}
뮤텍스 락의 단점은 임계영역에 진입하기 위해 항상 바쁜 대기(busy waiting)를 해야한다. 이러한 무한 루프 실행은 병렬 처리 시스템에서는 문제가 발생한다. 바쁜 대기 중에는 CPU에 다른 프로세스가 할당받지 못하기에 CPU 주기가 낭비될 수 있다.
mutex lock과 같은 유형을 스핀락
이라고 한다. 락을 사용할 수 있을때까지 프로세스가 회전을 하기 때문이다. 스핀락
에서는 문맥 교환을 하지 않기 때문에 문맥 교환 비용이 클때는 장점이 되기도 한다. 다중 코어 시스템에서는 특정 상황에서는 스핀락
이 선호 된다. 하나의 코어는 임계 영역을 수행하고 다른 하나의 코어는 문맥 교환없이 스핀만 하게 된다.