운영체제(9) - 임계구역 문제
임계구역 문제
임계구역이란?
멀티플 쓰레드가 일어나면 공통 변수에 대해 여러 자원이 접근하게 되고 그 과정에서 데이터 불일치 문제가 발생할 수 있다.
- 해결 방법
– Mutual exclusion (상호배타): 오직 한 쓰레드만 진입해야 한다.
– Progress (진행): 진입 결정은 유한 시간 내 이루어져야 한다.
– Bounded waiting (유한대기): 어느 쓰레드라도 유한 시간 내에 진입할 수 있다.
프로세스/쓰레드 동기화의 목적
- 임계구역 문제 해결(틀린 답이 나오지 않게)
- 프로세스 실행 순서 제어(원하는대로)
동기화 도구
- Semaphores
- Monitors
- Misc
세마포 (Semaphores)
- 동작
– P: Proberen (test) → acquire() ex.스레드를 감옥에 가둔다.
– V: Verhogen (increment) → release() ex.스레드를 감옥에서 풀어준다.
void acquire() {
value--;
if (value < 0) {
add this process/thread to list;
block;
}
}
void release() {
value++;
if (value <= 0) {
remove a process P from list;
wakeup P;
}
}
세마포의 일반적인 사용
- Mutual exclusion
sem.value = 1이라고 해보자. 어떠한 프로세스가 실행되면 sem.acquire()가 실행되고 value는 0이 된다. 하지만 0 미만은 아니기 때문에 false로 Critical-Section으로 들어가게 된다.
다음 두번째 프로세스가 실행되면 또 다시 sem.acquire()가 실행되고 value는 -1이 된다. 이번에는 값이 0 미만이므로 sem.release()이 실행되고 두 번째 프로세스는 큐에 세미포 큐에 갇히게 되면서 Critical-Section에 프로세스가 하나만 실행될 수 있도록 한다.
- Ordering
내가 원하는 순서대로 프로세스를 실행하고 싶다면 먼저 수행하고 위와 같이 세마포를 배치한다. 만약 P1의 S1을 먼저 실행시키고 싶다면 P2가 시작할 때 sem.acquire()를 실행시키고 P2가 멈추면 컨텍스 스위칭이 일어나면서 P1을 실행시킨다. 그리고 P1이 다 끝나면 sem.release()을 통해 P2 프로세스를 다시 릴리즈 시킨다.
Leave a comment