CS지식/운영체제

TIL 정리_94(동기화 관련문제)

ran4 2022. 5. 21. 18:01

http://www.kocw.net/home/m/search/kemView.do?kemId=1046323

운영체제 강의를 듣고 정리한 내용입니다

 

 

동기화와 관련된 문제

동기화와 관련된 고전적인 문제가 3가지 있다

  1. Bounded-Buffer-Problem
  2. Readers-Writers Problem
  3. Dining-Philosophers Problem

 

1. Bounded-Buffer-Problem

버퍼의 크기는 유한하다

-> 생산자 & 소비자 문제가 발생한다

프로세스가 Producer/Consumer로 여럿 존재한다

 

Producer(생산자)

  1. Empty 버퍼가 있는지 확인한다(없으면 기다린다)
  2. 공유 데이터에 lock을 건다
  3. Empty Buffer에 데이터 입력 및 버퍼를 조작한다
  4. lock을 푼다
  5. Full buffer의 개수를 하나 증가시킨다

 

Comsumer(소비자)

  1. full 버퍼가 있는지 확인한다(없으면 기다린다)
  2. 공유 데이터에 lock을 건다
  3. Full buffer에 데이터 입력 및 버퍼를 조작한다
  4. lock을 푼다
  5. empty buffer를 하나 증가시킨다.

 

**bounded 버퍼는 유한하기 때문에

생산자와 소비자가 동시에 도착하여 비어있는 버퍼를 할당하면 문제가 발생한다

 

> lock을 걸고, 자원의 개수를 세는데에 semaphore 변수가 필요하다

 

 

Bounded-Buffer-Problem 코드 

Synchronization variables
semaphore full = 0, empty = n, mutex = 1;

Producer
do { 
...

//아이템 x를 할당 코드 생략
...
P(empty);
P(mutex);
...
//x라는 데이터를 버퍼에 추가 코드는 생략된다
...
V(mutex)
V(full)
} while(1)

Comsumer
do {
P(full); //내용이 들어있는 버퍼를 확인
P(mutex);
...
//버퍼에 있는 데이터 y를 삭제한다 코드 생략
...
V(mutex)
V(empty)
...
//y를 consume 한다
...
} while(1)

 

 

2. Readers-Writers Problem

하나의 프로세스가 DBwrite 중일 때 다른 프로세스가 접근하면 안된다

read는 동시에 여럿이 접근해도 된다

 

해결법

  • Writer가 DB에(공유 데이터) 접근 허가를 아직 얻지 못한 상태에서는 모든 대기중인 Reader들을 다 DB에 접근하게 만든다
  • Writer는 대기중인 Reader가 하나도 없을 때 DB접근이 허용된다
  • Writer가 DB에 접근중이면 Reader들은 접근이 금지된다
  • Wrier가 DB에서 빠져나가야만 Reader의 접근이 허용된다

 

Shared data

DB 자체를 의미한다 

현재 DB에 접근중인 Reader의 수 : readcount

 

Synchronization variables

mutex : 공유변수 readcount를 접근하는 코드(critical section)

mutual exclutsion 보장을 위해 사용한다

db : ReaderWriter가 공유 DB 자체를 올바르게 접근하게 하는 역할을 한다

 

 

readers-writers problem 코드

Shared data
int readcount = 0;
DB 자체;

Synchronization variables
semaphore mutex = 1, db = 1;

Writer
P(db);
...
//DB를 writing
...
V(db)
**Starvation이 발생할 수 있다!!

Reader
P(mutex);
readcount++;
if(readcount == 1) P(db); //writer를 block
V(mutex);
...
DB를 reading
...
P(mutex);
readcount--;
if(readcount == 0) V(db); //writer를 사용가능하게 한다
V(mutex);

 

'CS지식 > 운영체제' 카테고리의 다른 글

TIL 정리_96(Monitor, Deadlock)  (0) 2022.05.23
TIL 정리_95(동기화 관련 문제(2))  (0) 2022.05.22
TIL 정리_86  (0) 2022.05.13
TIL 정리_85  (0) 2022.05.12
TIL 정리_84  (0) 2022.05.11