-> 따라서 Critical Section에 대한 Race Condition을 없애기 위해 Mutex와 Semaphore라는 동기화 메커니즘을 통해 문제 해결!!
두개의 프로세스에 대한 Mutex Algorithm(현재는 일반화되어서 2개 이상의 프로세스 사이에서도 사용 가능)
Peterson's Algorithm Code
do {
flag[i] = true; //프로세스 i가 임계영역에 진입시도
turn = j; // 다른 프로세스에게 진입 양보
while (flag[j] && turn == j); // 다른 프로세스가 진입시도하면 대기
// Critical section
flag[i] = false; //
// Remainder section
} while(true);
"while (flag[j] && turn == j);"
이부분을 통해 Mutual Exclution과 Progress를 만족한다.
-> 여러 프로세스가 대기중일 때 내 순서가 아니면 접근 X, 내 순서가 아니더라도 대기중인 프로세스가 없을 경우 내가 사용 가능.
"turn = j;"
이부분을 통해 Bounded Waiting을 만족한다.
-> 순서를 양보함으로써 내가 계속 사용할 수 없게 제한을 걸어둔다.
"Busy - Wait" 코드
P(s){
while(s <= 0) do wait
s--;
}
///임계영역///
V(s){
s++;
}
s(자원)가 없을 때는 대기상태, s가 있을 때는 임계영역 진입, 임계영역을 빠져나올 때 s반납.
P(S){
S.value--;
if(S.value < 0){
// add this precess to S.queue;
block();
}
}
V(S){
S.value++;
if(S.value <= 0){
// remove a process P from S.queue;
wakeup(P);
}
}
s가 0보다 작은 경우 : 현재 자원을 기다리는 프로세스가 존재한다는 뜻. 따라서 Queue에서 프로세스를 꺼내 실행시킨다.