운영체제(6) - Process Syncronization(2)
‘운영체제’를 공부하여 정리한 내용입니다.
5. Semaphores
사용법
- Binary Semaphore
- 초기화는 1로 된다.
- Critical Section 접근에 대한 Mutual Exclusion을 제공하기 위해서 사용한다.
- Mutex Lock이라고도 표현한다.
- Counting Semaphore
- 초기화를 하면 2 이상의 값을 가진다.
- 이 경우는 mutex가 아닌, 유한한 개수를 가진 자원에 대한 접근을 제어하는 데 사용한다.
구현
-
wait()에서 Semaphore가 음수인 것을 발견했을 때 어떻게 해야하는가? (정의 상으로는 Semaphore는 음수가 될 수 없다. 따라서 프로세스는 기다려야 한다.)
- Busy Wait을 할 수 있다.
- 이는 프로세스가 Lock이 풀리는 것을 기다리는 동안 While(true);를 돌리는 것처럼 계속 돌아간다.
- 오랫동안 기다리게 되는 경우는, CPU 타임을 쓸데없이 낭비하는 상황이 발생한다.
- 오랫동안 기다리지 않는 것이 보장될 경우는 괜찮은 방법이다.
- block(봉쇄) 연산
- 이는 프로세스를 Semaphore의 프로세스 리스트에 추가하고 Block()을 부르는 식이다.
- Semaphore와 연관된 ready queue에 넣는 것과 같다.
- 이러면 프로세스가 Waiting으로 넘어가게 된다.
- 그리고 다시 signal() (C의 경우 sem_post())로 다른 프로세스를 요청할 경우는 이 리스트에서 꺼내주어 프로세스가 돌 수 있도록 한다.
- 이 경우는 CPU 타임을 낭비하는 것을 막을 수 있다.
- Busy Wait을 할 수 있다.
-
Semaphore 연산은 원자적으로 실행되어야한다.
- SingleProcessing에서는 단순하게 인터럽트를 금지시키면, 원자적인 실행을 보장하는 것이 가능하다.
- multipleprocessing에서는 모든 Processor에서 인터럽트를 금지해야 한다. 그렇지 않으면 Semaphore의 동작 부분이 또다른 Critical Section이 되어 올바른 동작을 보장할 수 없게될 수 있다.
DeadLock and Starvation
- (추후 업데이트)
Priority Inversion
-
상황을 가정하자.
- 우선 순위는 다음과 같다. P3 < P2 < P1
- 그런데 이 때, P3라는 프로세스가 사용하는 커널 데이터 R에 P1이 접근해야 하는 상황이 발생했다.
- 하지만 통상적으로 커널 데이터는 Lock에 의해 보호되기 때문에 P3 프로세스가 자원의 사용을 마칠 때까지 P1은 기다려야 한다.
- 이 때, P2가 사용가능해지고, P3를 Preemption하게 되면 P3보다 우선순위가 낮은 P2 프로세스가 P3의 스케쥴 작업에 영향을 주는 역설적인 상황이 발생한다.
-
우리는 이 문제를 Priority Inversion이라고 한다.
- 만약 Priority 종류가 2가지라면 일어나지 않는다. 하지만 이는 OS에서 사용하기에는 적은 양이다.
- 그래서 대부분의 OS에서는 Priority-inheritance Protocol이라는 것을 구현한다.
6. Classic Problem of Synchronization
The Bounded-Buffer Problem
- 프로젝트에서 많이 사용하기는 했다.
- (추후 업데이트)
The Reader-Writes Problem
- (추후 업데이트)
The Dining-Philosophers Problem
- (추후 업데이트)
7. Monitors
- (추후 업데이트)
Leave a Comment