bool flag[]; // 임계영역 진입 상태를 저장한다.
int turn; // 임계 영역을 실행할 프로세스의 순서를 저장한다.
//process 1, process 2 모두 자신의 순서를 원하더라도 오직 한 배정만 가능하다.
while(true){
flag[i] = true; // 해당 번호의 프로세스가 임계구역에서 실행 준비 완료를 나타낸다.
turn = j; // 임계 구역에 진입할 차례의 프로세스 번호
while(flag[j] && turn == j){}; // 이 조건을 만족한다면 다른 프로세스가 임계구역에서 나오기 전까지 spinlock상태로 busywaiting한다.
/* critical section */
flag[i] = false; // 임계영역에서 요청을 수행하고 나왔으니 다음 프로세스가 임계구역에 들어갈 수 있게 자신의 상태를 false로 바꾸어준다.
/* remainder section */
}
flag[0],flag[1]
이 모두 true
이어도 turn
에 따라 한 프로세스는 실행되고 다른 프로세스는 while문
에서 spinlock
상태이므로 상호 배제적으로 실행된다.flag[i] = false;
를 통해 자신의 상태를 바꾸어주면서 다른 프로세스가 임계구역에 들어 갈 수 있도록 하여 Progress와 BoundWaiting을 지킨다.boolean test_and_set(boolean *target){
boolean rv = *target;
*target = true;
return rv;
}
true
로 set된다.do{
while(test_and_set(&lock));
/* critical section */
lock = false;
/* remainder section */
}while(true);
false
일 때만 Critical Section에 접근이 가능하다. lock은 전역변수로 어떤 프로세스가 임계구역에서 요청 수행후 다시 전역 변수 lock값을 false로 바꿔주어(lock = false;
) 다음 프로세스가 임계구역에 접근이 가능하다.int compare_and_swap(int *value, int expected, int newvalue){
int temp = *value;
if(expected==*value)
*value = newvalue;
return temp
}
*value
이다.expected
와 *value
가 같다면 *value
값은 newvalue
로 바뀐다.do{
while(compare_and_swap(&lock,0,1)!=0);
//critical section
lock = 0;
//remainder section
}while(true);
lock
가 0인 경우 아래의 임계 영역이 실행된다. 실행 중일 때는 lock==expected(두 번째 매개변수)
이므로 lock은 1(newvalue)
로 바뀌어 다른 프로세스는 임계구역에 들어오지 못한다.Critical Section에 대한 하드웨어적 접근은 복잡하여 응용프로그래머가 사용하기 힘들다.
Mutual exclusion의 축약 형태인 Mutex는 OS설계자들이 임계구역 문제를 해결하고자 만든 소프트웨어 툴이다.
Mutex Locks
// acquire 함수의 정의
acquire(){
while(!available); // busywaitng(aka.spinlock)
available = false;
}
//release 함수의 정의
release(){
available = true;
}
available
변수를 가지는데, 이 변수는 락이 가용가능한지에 대한 변수이다. available
이 true
인 경우 busywaiting
하고 false
인 경우 acquire lock
함수는 락을 획득한다. 그리고 Critical section을 진입하여 요청사항을 수행한다.release lock
에서 락을 반환 해야한다.