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 에서 락을 반환 해야한다.