공유 자원을 접근하는 코드 영역
임계 영역은 동기화를 통해 공유 자원의 일관성을 보장해야하는데 이를 하지 못하는 경우 발생하는 문제를 의미한다.
여러개의 프로세스/쓰레드가 동시에 접근할 때 가장 나중에 실행되는 프로세스/스레드에 의해 최종값이 결정되어 data inconsistency가 발생하는 상태를 의미한다.
상호 배제(Mutual Exclusion)
오로지 하나의 프로세스만이 임계 구역에서 실행되어야 한다.
진행(Process)
임계 구역에서 실행되고 있는 프로세스가 없고 별도의 동작이 없는 프로세스들만 임계영역에 들어갈 수 있는 대상이 된다.
한정 대기(Bounded Waiting)
다른 프로세스의 기아를 방지하기 위해, 임계 구역에 한 번 접근했던 프로세스는 다음에 접근할 때 제한을 주어야 한다.
뮤텍스(Mutex, 상호배제, 이진 세마포어)
두 프로세스(스레드)가 공유 자원에 동시에 접근하는 것을 막는 것
임계 구역을 가진 두 프로세스(스레드)의 running time이 서로 겹치지 안도록 각각 단독으로 실행하게하는 기술
리소스에 대한 접근을 조율하기 위해서 lock을 사용
프로세스(스레드)가 임계영역에 들어갈 때 lock을 하고 나올 때 unlock을 한다. 임계 영역에 lock이 걸리면 다른 프로세스(스레드)는 들어올 수 없다.
데커 알고리즘 & 피터슨 알고리즘
flag와 turn 변수를 통해 임계 구역에 들어갈 프로세스(스레드)를 결정하는 방식
❑ flag: 프로세스 중 누가 임계영역에 진입할 것인지 나타내는 변수
❑ turn: 누가 임계 구역에 들어갈 차례인지 나타내는 변수
❑ 피터슨 알고리즘은 상대방 프로세스(스레드)에 임계영역 진입 기회를 양보한다.
제과점(Bakery) 알고리즘
여러 프로세스(스레드)에 대한 처리가 가능한 알고리즘. 번호표를 배부하여 가장 작은 수의 번호표를 가지고 있는 프로세스(스레드)가 임계 구역에 진입한다
wait(S) {
while(S <= 0); // 대기
S—;
}
signal(S) {
S++;
}