2020-11-8 운영체제 기초(7) 세마포어
Semaphores(세마포어)
-
세마포어를 통해 lock을 걸고 푸는걸 간단하게 할 수 있다
-
공유자원을 획득하고 반납하는 과정을 세마포어가 처리할 수 있다.
-
이전에 critical section 해결하는 알고리즘을 추상화를 했다.
-
세마포어에는 P연산, V연산이 있다. P연산은 공유데이터를 획득하는 과정, V연산은 공유데이터를 반환하는 과정
-
Semaphore 변수 S가 있다. 변수값의 자원의 갯수를 의미.
-
integer형 변수
-
만약에 Semaphore변수 S=5이면 공유자원이 5개가 존재. 이때 P연산을 하면 공유자원을 가져가므로 S=4가 된다. V연산을 하면 다시 S=5가 된다.
-
P연산을 하면 lock을 걸고, V연산을 하면 lock을 푼다.
-
아래 2가지 atomic 연산에 의해서만 접근 가능
-
P(s) while (S <= 0) do no-op s--
-
V(s) s++
-
-
세마포어를 n개의 프로세스에 적용하기
-
semaphore mutex; // 초기값 1 // Process PI do { P(mutex); // if mutex > 0, semaphore decrement critical section V(mutex); // semaphore increment } while (1);
- busy-wait방식(=spin lock) => 비효율
-
Block/ Wakeup 방식
-
세마포어를 아래와 같이 정의
-
typedef struct { int value; // 세마포어 struct process *L // process wait queue, 프로세스를 연결하는 리스트 } semaphore // P연산 P(s) S.value--; if (S.value < 0) { // 공유자원이 없다. add this process to S.L; // 구조체 변수 L에다가 이 프로세스를 연결하고 blocked한다. block(); } // V(S) S.value++ if (S.value <= 0) { // 잠들어 있는 프로세스가 있으면 깨워라 // remove a process P from S.L; wakeup(P); }
-
-
block과 wakeup을 다음과 같이 가정
- block : 커널은 block을 호출한 프로세스를 suspend 시킨다. 이 프로세스의 PCB를 semaphore에 대한 wait queue에 넣는다.
- wakeup(P) : block된 프로세스 P를 wakeup시킨다. 이 프로세스의 PCB를 ready queue로 옮긴다.
- v(s)에서 세마포어 변수가 음수이면 잠들어 있는 프로세스가 있는거다.
Busy-wait vs Block-wakeup
- 보통은 Block-wakeup이 더 효율적이다.
- Block-wakeup overhead vs Critical Section의 길이
- critical section의 길이가 긴 경우 blcok-wakeup이 적당
- critical section이 매우 짧으면 block-wakeup이 오버헤드가 busy-wait 오버헤드보다 클 수 있다.
세마포어의 2가지 타입
- counting semaphore : 도메인이 0이상인 임의의 정수값, 주로 자원 카운팅에서 사용
- Binary semaphore(=mutex) : 0, 1만 가질 수 있다. 주로 mutual exclusion(lock/unlock)에 사용
Deadlock and Starvation
-
데드락 : 둘 이상의 프로세스가 서로 상대방에 의해 충족될 수 있는 이벤트를 무한히 기다리는 현상
-
S, Q가 1로 초기화된 세마포어라 하자.
-
//P0 P(S); P(Q); ... V(S); V(Q); //P1 P(Q); P(S); ... V(Q); V(S);
- 프로세스 P0과 P1가 각각 S,Q를 접근하고, Q,S를 획득 요청을 하면 Starvation이 발생한다.
- Starvation : indefinite blocking, 프로세스가 suspend된 이유에 해당하는 세마포어 큐에서 빠져나올 수 없는 현상
Reference
- https://1.bp.blogspot.com/-8CZTgMmmpuo/Xox1HhX4a8I/AAAAAAAAAsY/IA9LNC-r-QM-Z_aJmaINK9RqJc66zYoQwCLcBGAsYHQ/s640/highest-priority.webp => Multilevel Queue
- https://jhi93.github.io/category/os/2019-12-14-operatingsystem-06-1/ => execution-box
- http://denninginstitute.com/modules/ipc/pink/semaph2.gif => block and wake up
Written on November 8, 2020