May 20, 2020
참고도서: Operating System Concepts (10/E) Abraham Silberschatz, Peter B. Galvin, Greg Gagne
뮤텍스(Mutex Lock) 소프트웨어적으로 임계구역 문제를 해결하기 위한 방법 중 하나이다. 임계구역문제를 소프트웨어 단에서 해결하기 위해서는 운영체제를 설계하는 개발자가 알고리즘을 잘 만들어 두어야 하는데, 뮤텍스는 가장 간단하고 단순한 접근방법이다.
뮤텍스는 임계구역 전후로 두 가지 연산을 수행하는 것으로 임계구역 문제를 해결한다.
acquire : 임계 구역 내 활동을 요청release : 임계 구역 내 활동을 종료쉽게 말해서 어떤 프로세스가 임계 구역 내에서 활동중이라면, 해당 프로세스가 다른 프로세스에게 자신이 임계 구역 내에 있다는 것을 알리는 것이다. 따라서 만약에 다른 프로세스가 임계구역에 진입하려고 할때, 어떤 프로세스가 임계구역 안에 있다면 진입하지 않고 멈추게 되는 것이다.
acquire(){
while (!available); /* busy waiting */
available = false;
}acquire 연산의 구조는 매우 단순하다. 가장 먼저 공유변수는 available 의 상태를 확인한다. 만약 available == false 라면, 누군가가 임계 구역안에서 작업을 수행중인 것이다. 따라서 while의 조건이 true 가 되어 무한루프에 빠지게 된다.
반대로 생각해보자, 만약 available == true 로 확인되었다면, while문을 곧바로 빠져나와 available을 false로 만들고 acquire 함수를 빠져나간다. 이때 다른 프로세스가 임계구역 진입을 위해서 acquire를 수행한다면, 해당 프로세스는 available==false 를 확인하게되고, acquire 함수 안에서 무한루프를 돌게 된다.
release(){
available = true;
}relase 연산의 내부에는 공용변수는 available 을 true 로 만드는 기능 밖에 없다. 어떤 프로세스가 임계구역에서 작업을 바치고 빠져나올 때, available 변수를 true 로 만든다면, 입계구역에 진입하지 못하고 acquire 의 while 문에서 계속 무한루프에 있던 프로세스가 무한루프를 빠져나와 임계구역에 진입하게 된다.
do{
acquire() // 나 들어갈거니까 아무도 들어오지마!
/* Critical Section */
release() // 나 끝났어! 준비됐으면 들어가~~
}while(true);위 두 연산을 임계구역의 시작과 끝에 위치시키면, 한번에 하나의 프로세스만 임계구역에 진입하는 것을 보장할 수 있게 된다.
Mutex Lock은 매우 단순하게 임계구역 문제를 해결할 수 있는 기법이지만, 가장 큰 문제는 acquire 내부에서 사용하는 while(!available) 에 있다. 임계구역 진입을 원하는 프로세스는 다른 프로세스가 임계구역에 있다면, 이곳에서 계속해서 무한회전을 하게되는데, 아무 작업을 하지 않지만 계속 회전하기 때문에 CPU 사이클이 낭비된다는 것이다. 이렇게 아무것도 하지않고 계속 루프를 회전하는 것을 Busy Waiting이라고 한다.