본문 바로가기
Computer Science/Operating System

Synchronization Problems

by Gofo 2021. 6. 20.

Classical Synchronization Problems

여러 전통적인 synchronization 문제가 있다.

 

Semaphore와 mutex는 단지 primitive로, 실제 프로그래밍을 할 때 발생하는 문제에 대해서는 단순히 이용해서는 안되고 응용해야 한다.

  • readers and writers problem
  • dining-philosopher problem

 


Readers and Writers Problem

Critical section에 접근하는 프로세스가 2종류인 상황을 의미한다.

  • reader : critical section에 읽기만 가능하다.
  • writer : critical section에 쓰기만 가능하다.

 

Race condition은 여러 프로세스가 동시에 한 shared resource에 write 할 때 일어난다.

따라서 reader 들은 동시에 수행을 해도 문제를 발생하지 않으므로 block 하지 않는다.

 

  • strict mutual exclusion
    • reader와 writer의 구분 없이 엄격하게 통제하는 것을 말한다.
    • 동시에 여러 read 작업은 할 수 있음에도 막기 때문에 성능이 떨어진다.
  • weak mutual exclusion
    • correctness 관점보다는 performance 관점에서 개선된 것이다.
    • 동시에 진행되는 여러 read 작업은 허용한다.

 

해결방법

  • first readers-writers problem
    • reader에게 우선순위를 준다.
    • 어떤 reader도 critical section에 들어가있지 않다면 writer가 들어갈 수 있다.
    • writer가 starvation 될 수 있다.
  • second readers-writers problem
    • writer에게 우선순위를 준다.
    • writer가 critical section에 들어가기를 기다리고 있으면 reader는 들어갈 수 없다.
    • reader가 starvation 될 수 있다.
    • reader가 많고 writer가 적다면 write의 starvation을 피하기 위해서 second가 더 적합한 방법이다.
  • third reader-writer problem
    • reader/writer에게 우선순위를 주지 않는다.
    • 각 작업들이 들어온 순서대로 실행한다.
    • starvation을 겪지 않는다.
    • strict mutual exclusion과 유사하지만, 동시에 reader들이 여러개 들어갈 수 있다.

 

First Readers-Writers Problem

reader에게 우선순위를 주는 것이다.

writer는 unbounded waiting 되고, starvation 되는 문제가 있다.

 

총 3개의 변수가 필요하다.

  • 두 개의 semaphore 변수
    • <pre>semaphore S, wrt</pre>
    • 초기값 : S = 1, wrt = 1
  • 하나의 int 변수
    • <pre>int readcount</pre> 
    • 초기값 : readcount = 0

 

readcount는 여러 reader가 동시에 critical section에 들어가도록 허락하기 위해 사용한다.

 

semaphore S는 readcount를 보호하기 위한 semaphore이다.

readcount에 대한 race condition을 방지한다.

 

 

Second Reader-Writer Problem

Writer에게 우선순위를 부여한다.

 

Critical section에 들어가기 위해 기다리는 writer가 있으면 reader는 작업하지 못한다.

먼저 들어간 reader가 있다면 그 작업이 끝난 후에 writer를 실행한다.

따라서 reader는 unbounded waiting 되고, starvation을 겪을 수 있다.

 

5개의 semaphore와 2개의 int 변수를 사용한다.

  • <pre>Semaphore S1, S2, wrt, rd, wrtpending</pre>
    • 초기값은 모두 1이다.
  • <pre>int readcount, writecount</pre>
    • 초기값은 모두 0 이다.

 


Dining-Philosopher Problem

각 자리의 왼쪽과 오른쪽에 젓가락이 1개씩 놓여있다.

한 번에 하나의 젓가락만 잡을 수 있다.

두 젓가락을 모두 잡아야만 식사를 할 수 있다.

5자리가 있다면 동시에 밥을 먹을 수 있는 최대 인원은 2명이다.

 

마찬가지로 여러 개의 shared resource가 존재하고, 여러 개의 process 가 존재할 때 위의 문제처럼 생각할 수 있다.

 

Deadlock

간단한 해결방법은 다음과 같다.

그러나 이는 모든 사람이 동시에 오른쪽 젓가락을 들거나 동시에 왼쪽 젓가락을 들었을 때 deadlock에 빠져버린다.

do {
	// entry section
	wait(chopstick[i]);			// 오른쪽 젓가락 잡기
    wait(chopstic[(i+1) % 5]);	// 왼쪽 젓가락 잡기

	// critical section
    ...
    
    // exit section
    signal(chopstic[i]);		// 오른쪽 젓가락 내려놓기
    signal(chopstic[(i+1)%5]);	// 왼쪽 젓가락 내려놓기
    
    ...
} while(1);

 

해결방법

deadlock과 starvation을 피하기 위해서 아래와 같이 할 수 있다.

  • 5개의 자리에 4명의 사람만 앉힌다.
    • deadlock을 해결할 수 있다.
    • 그러나 의자 한개를 활용하지 못한다.
  • 양쪽 젓가락을 확보할 수 있을 때만 잡기
    • mutex_lock과 mutex_trylock을 이용한다.
    • 한쪽은 잡고 있되, 다른 한쪽은 block을 하지 않고 다른 작업을 함으로써 deadlock을 피할 수 있다.
  • asymmetric solution 사용
    • 비대칭 성질을 이용한다.
    • 홀수번자리 사람은 왼쪽부터, 짝수번자리 사람은 오른쪽부터 잡기를 시도한다.
    • 동시에 한쪽 방향을 잡는 것을 방지할 수 있다.

 

'Computer Science > Operating System' 카테고리의 다른 글

Deadlock Handling  (0) 2021.06.20
Deadlock  (0) 2021.06.20
Synchronization with OS Support : Mutex  (0) 2021.06.20
Synchronization with OS Support : Semaphore  (0) 2021.06.20
Synchronization with Hardware Support  (0) 2021.06.19

댓글