P
: 임계 구역에 들어가기 전 수행V
: 임계 구역에서 나올 ㄸ 수행뮤텍스: 임계 구역을 가진 스레드들의 실행시간이 서로 겹치지 않고 각각 단독으로 실행되게 하는 기술
lock: 현재 임계 구역에 들어갈 권한을 얻음
unlock: 현재 임계 구역을 모두 사용했음을 알림
데커 알고리즘: flag와 turn변수를 통해 임계 구역에 들어갈 프로세스/스레드를 결정하는 방식
while(true)
{
flag[i] = true; //프로세스 i가 임계 구역 진입 시도
while(flag[j]) //프로세스 j가 현재 임계 구역에 있는지 확인
{
if(turn == j) //j가 임계 구역 사용 중이면
{
flag[i] == false; //프로세스 i 진입 취소
while(turn == j); //turn이 j에서 변경될 때까지 대기
flag[i] = true; //j turn이 끝나면 다시 진입 시도
}
}
}
// --------- 임계 구역 -----------
turn = j; //임계 구역 사용이 끝나면 turn을 넘김
flag[i] = false; //flag값을 false로 바꿔 임계 구역 사용 완료를 알림
피터슨 알고리즘: 데커와 유사하지만, 상대방 프로세스/스레드에게 진입 기회를 양보하는 것에 차이가 있음
while(true) {
flag[i] = true; // 프로세스 i가 임계 구역 진입 시도
turn = j; // 다른 프로세스에게 진입 기회 양보
while(flag[j] && turn == j) { // 다른 프로세스가 진입 시도하면 대기
}
}
// ------- 임계 구역 ---------
flag[i] = false; // flag 값을 false로 바꿔 임계 구역 사용 완료를 알림
제과점 알고리즘: 여러 프로세스/스레드에 대한 처리가 가능한 알고리즘
while(true) {
isReady[i] = true; // 번호표 받을 준비
number[i] = max(number[0~n-1]) + 1; // 현재 실행 중인 프로세스 중에 가장 큰 번호 배정
isReady[i] = false; // 번호표 수령 완료
for(j = 0; j < n; j++) { // 모든 프로세스 번호표 비교
while(isReady[j]); // 비교 프로세스가 번호표 받을 때까지 대기
while(number[j] && number[j] < number[i] && j < i);
// 프로세스 j가 번호표 가지고 있어야 함
// 프로세스 j의 번호표 < 프로세스 i의 번호표
}
}
// ------- 임계 구역 ---------
number[i] = 0; // 임계 구역 사용 종료