운영체제_10
10번째 수업
Synchronization 에 관련된 문제 3가지
- Bounded-buffer Problem (Producer-Consumer Problem)
- Readers and Writers Problem
- Dining-Philosophers Problem
Bounded-buffer Problem
유한한 버퍼의 크기
Producer
- 공유데이터에 만들어서 버퍼에 집어 넣음 (빈 버퍼가 있으면)
- 공유버퍼 전체에 lock
- 빈 버퍼에 데이터 입력, 빈 버퍼 위치 변경
- lock 해제
Consumer
Consumer는 Producer 프로세스와 정반대.
유한한 크기때문에 생기는 문제
- 생산자 입장
- 한꺼번에 도착해 공유버퍼가 다 채워져 있는 경우, Consumer가 아닌 Producer가 또 오면, 생산자 입장에서는 사용할 수 있는 자원이 없다. 즉, 버퍼가 비어질 때까지 기다려야 할 수 밖에 없다.
- 소비자 입장
- 꺼내갈 데이터(내용이 들어있는)가 없는 경우 생산자가 내용을 만들어 넣을때까지 기달리 수 밖에 없다.
synchronization 변수들
- mutual exclusion -> lock여부를 위한 binary samphore
- Resource count -> 자원의 수를 세기 위한 integer semaphore
Semaphore full = 0 , empty = n, mutex = 1(하나의 프로세스만 접근하도록 lock을 위한 변수);
Reader-Writers Problem
: procss가 DB(공유데이터)에 write중일때 다른 process가 접근하면 안됨 (lock)
read는 동시에 여럿이 가능
Solution
- writer가 DB에 접근 허가를 아직 얻지 못한상태면 모든 대기중인 Reader들을 다 DB에 접근하게 해준다.
- Writer는 대기중인 Reader가 하나도 없을 때 DB접근이 허용된다.
- 일단 Writer가 DB에 접근중이면 Reader들은 접근금지
- Writer가 DB에서 빠져나가야먄 Reader의 접근 허용된다.
동시에 같이 들어온다면
먼저 Reader쪽에서 쭉 읽고 그동안 Writer는 다 읽을 동안 기다린다.
10000개가 들어와 readCount가 1이 된 순간 다시 1000개가 들어온다면 또 Writer는 기다려야한다
--> Starvation문제 발생
어느정도 일정량이 지나면 Writer에게 권한을 넘겨주는 식으로 해결한다.
Dining-Philosopher Problem
문제점
Deadlock : 모든 철학자가 동시에 배가 고파져 왼쪽젓가락을 든 경우
해결책
- 4명의 철학자만 인원제한
- 젓가락을 두 개 모두 집을 수 있을때에만 젓가락을 잡을 수 있는 권한
- 비대칭 : 짝수 철학자는 왼쪽, 홀수 철학자는 오른쪽부터 잡도록 한다.
Monitor
semaphore의 문제점
-
코딩하기 어려움
-
정확성입증이 어렵다
-
자발적 협력이 필요하다
-
한번의 실수가 모든 시스템에 치명적인 영향을 끼친다.
-
예)
V(mutex)
Critical Section
P(mutex)Mutual Exclution 깨짐
-
예2)
P(mutex)
Critical Section
P(mutex)
Deadlock
-
High-level synchronization construct
객체 중심으로 모니터 안에 접근하는 프로시저를 정의해놓고 제한적으로 접근하도록 함
--> lock을 걸 필요가 없어짐
monitor monitor-name{
// 공유변수 선언
procedure body P1(..){
...
}
procedure body P2(..){
...
}
procedure body P3(..){
...
}
{
initialization code
}
}
Condition variable
Condition x, y;
x.wait()
x가 여분이 있으면 바로 접근 허용, 없으면 줄서서 기다리는 함수를 정의.
x.signal()
빠져나가는 기능
monitor bounded_buffer {
int buffer[N];
condition full, empty ;
void prodduce(int x){
empty.wait(); // 빈 버퍼가 없을 경우
full.signal(); // x가 버퍼에 추가되는 경우
}
void consume(int *x){
full.wait(); // full버퍼가 없을 경우
empty.signal(); // 버퍼에서 데이터를 지우고 저장
}
}
Author And Source
이 문제에 관하여(운영체제_10), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@aksel26/운영체제10저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)