- 아래의 두 개 방식을 이용하여 해결방안 선정 ($P_1$, $P_0$)
int turn; //임계구역에 진입 가능한 순번을 나타내는 것
boolean flag[2] //임계구역에 집입 준비가 됐는지를 알려주는 배열
while(true) {
flag[i] == true;
turn == j
while(falg[j] && turn==j){
/* critical section */
flag[j] == false;
/* remainder section */
}
}
- 임계구역 문제 해결방안 조건 수행
- 상호 배제 : 반드시 $P_j$가 수행되기 위해선 flag[i] == true, turn == j 가 되어야하는데 이는 $i,j$ 모두
임계구역이 사용가능한 상태돼 하나가 자기의 임계구역에 들어갈 때 다른 것들은 못 들어가게
turn이 막고 있는 형상
- 진행 : while 문 안에서 보면 flag[j]를 false 로 바꾸는 것에서 준비 완료된 상태가 아니고 remainder secition인 경우에는 임계구역에서 못들어 가는 것을 볼 수 있다. ⇒ remainder 상태일 때 임계구역 접근 권한 요청 박탈
- 무기한 대기 방지 : 진행과 마찬가지로 flag[j] = false에서 무기한 대기를 방지하기 위해 끊어주는 것을 볼 수 있다.
- 최신 컴퓨터 아키텍쳐에서는 사용이 불가능
- 효율을 위해 최신 컴퓨터의 컴파일러 또는 프로세서는 호율을 위해서 종속성 없는 데이터를 다중 스레드 응용프로그램으로 처리하기에 재정렬이 필요한데, 기존 단일 스레드 응용 프로그램에 맞춰진 Peterson의 해결책은 해결이 불가능 하다
- 이유로는 단일 스레드 응용 프로그램은 순서가 바뀌어도 예상된 결과가 나오지만(재정렬 의미 x),
다중 스레드 응용프로그램은 명령 순서가 바뀌게 되면 데이터의 일관성이 깨지기 때문이다.
- 아래의 그림을 보듯 단일 스레드 응용프로그램의 경우에는 예상된 결과(while(flag[j]&&turn==j 에서만 임계 구역이 실행되어, 조건이 만족하지 않는 다면 실행 x)가 나오기에 재정렬의 의미가 크게 없다.
