임계영역은 여러 프로세스가 공유 자원에 접근할 때 오직 하나의 프로세스만 접근하도록
보장하는 코드 영역입니다
임계영역을 잘못 처리하면 Race Condition이 발생해서 데이터 무결성이 깨질 수 있습니다
두 개 이상의 프로세스가 동시에 하나의 공유 데이터에 접근해 연산 결과가 달리자는 상태를 의미합니다
임계영역을 다룰 때는 반드시 다음 4가지 조건을 만족해야합니다
한번에 하나의 프로세스만 임계영역에 진입할 수 있습니다
임계 영역에 진입한 프로세스가 없으면 진입 대기중인 프로세스가 들어갈 수 있어야 합니다
프로세스가 무한히 기다리지 않고, 진입을 보장받아야 합니다
임계 영역 바깥 프로세스가 내부의 프로세스 수행을 방해해서 안됩니다
do {
flag[i] = true; turn = j;
while(flag[j] && turn == j);
// critical section
flag[i] = false;
// remainder section
}while(true)
boolean testAndSet(boolean *target){
boolean rv = *target;
*target = TRUE;
return rv;
}
do {
while(testAndSet(&lock)){
CRITICAL SECTION
lock = FALSE;
REMAINDER SECTION
}
}
정수형 변수와 두가지 원자적 연산(wait, signal)을 이용한 동기화 메커니즘입니다
이진 세마포어(0과 1만 가능)의 특별한 형태로 임계 영역 보호에 최적화되어있습니다
고급언어 차원에서 제공하는 동기화 구조로, 자동적으로 상호배제를 보장합니다
Java의 synchronized블록이나 메소드가 대표적입니다