아래 내용들은 양희재 교수님의 운영체제 강의를 듣고 정리한 내용입니다.
임계구역 문제
- The Critical-Section Problem
Critical section(임계구역) 이란?
- A system consisting of multiple threads
- 여러개의 쓰레드로 이루어진 시스템에서
- Each thread has a segment of code, called critical section, in
which the thread may be changing common variables,
updating a table, writing a file, and so on.
- 각각의 쓰레드는 코드영역을 가지고 있는데, 이 쓰레드들이 함께 사용하는 변수 테이블들을 바꾸거나 업데이트 하는 공간을 임계구역이라고 한다.
이 임계구역을 수정하다가 다른 쓰레드로 넘어가서 수정하고 있는 데이터를 다시 건드리면 문제가 발생할 수 있다.
Solution
아래 세가지를 모두 만족해야함.
- Mutual exclusion (상호배타): 오직 한 쓰레드만 진입(다른 하나가 임계구역에 들어가면 다른것들은 못들어가게함.)
- Progress (진행): 진입 결정은 유한 시간 내 (임계구역에 들어갈수 있는것들중에 어떤게 먼저 들어갈지 정함.)
- Bounded waiting (유한대기): 어느 쓰레드라도 유한 시간 내 (어느 스레드든 기다리면 임계구역에 진입 가능)
이러한 임계구역 문제를 해결하기 위해 사용하는 동기화 도구라는게 있다.
- Semaphores
- Monitors
- Misc.
Semaphores (세마포)
- n. (철도의) 까치발 신호기, 시그널; U (군대의) 수기(手旗) 신호 (역에서 직원이 깃발 들고 내리며 가도 되는것과 안되는것을 판단하는것과 비슷함.)
- 동기화 문제 해결을 위한 소프트웨어 도구
- 구조: 정수형 변수 + 두 개의 동작 (P, V)
세마포의 구조
- 세마포의 구조는 int 형 변수 value와 value를 증가시키는 release, value를 감소시키는 acquire로 구성되어 있다.
class Semaphore {
int value; // number of permits
Semaphore(int value) {
... }
void acquire() {
... }
void release() {
... }
}
세마포 세부구성
- acquire안에는 value를 감소시키고, 추가적으로 value값이 음수일떄는 더이상 쓰레드가 진행안되고 block시켜준다.
- 반대로 realese는 value를 증가시키고, queue가 비워져있지 안흐면 하나를 큐에서 없앰.
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;
}
}