CS/운영체제

[운영체제] process Synchronization 문제

happy_life 2022. 7. 17. 17:47

목차

1. Bounded-Buffer Problem

2. Readers-Writers Problem

3. Dining-Philosopher Problem

4. Monitor

 

 Bounded-Buffer Problem

 

Bounded-Buffer Problem

 

개념

프로세스에는 공급자와 소비자가 있다. 공급자는 Buffer의 빈공간에 데이터를 집어넣고 소비자는 Buffer의 데이터를 꺼내는 역할을 한다. 만약 공급 프로세스 여러개가 동시에 하나의 빈 공간에 데이터를 집어넣는다거나, 여러 소비 프로세스가 하나의 Buffer 데이터에 접근해 동시에 꺼내면 문제가 생긴다. 또한 Buffer가 가득차 데이터를 집어넣을 수 없는데, 공급 프로세스가 데이터를 넣기 위해 접근하거나, Buffer가 없는데, 소비 프로세스가 데이터를 가져가기 위해 접근하면 문제가 발생한다. 이러한 문제를 Bounded-Buffer Problem 이라고 한다.

 

해결

공급 프로세스가 buffer에 값을 넣는다면, 다른 공급 프로세스가 접근하지 못하게 lock을 걸어야한다. 마찬가지로 소비 프로세스가 buffer에서 값을 가져온다면, 다른 소비 프로세스가 접근하지 못하게 lock을 걸어야한다. 

또한 Empty 버퍼가 없는 경우, 공급 프로세스는 wait()할 수 있어야하고, 버퍼에 데이터가 없는 경우, 소비 프로세스가 wait()할 수 있어야 한다. 공급 프로세스는 소비 프로세스가 버퍼에서 데이터를 가져가 빈공간이 만들어지는 경우 wake()해서 다시 공유데이터에 접근할 수 있게 된다. 소비 프로세스도 마찬가지이다. 

 

 

Readers-Writers Problem

 

Readers-Writers Problem

 

한 process가 DB에 write중일 때 다른 process가 접근하면 안되지만, Read는 동시에 여럿이 해도 된다. 만약 readcount가 ==1로 처음 접근하는 경우에 Wirte에 lock을 걸어준다. 이후 Reader가 다 읽고 readcount가 0이되면 wirte의 락을 해제해 다른 writer 프로세스가 접근할 수 있게 해준다. 한편 readcount++ 또한 공유변수이므로 이 부분은 semaphores를 통해 코드를 감싸준다.

 

하지만 Reader가 계속 들어와버리면 writer는 lock을 해제 못하고 계속 기다려야하므로 starvation 문제가 발생할 수 있다. 

 

 

Dining-Philosopher Problem

 

Dining-Philosopher Problem

 

모든 철학자가 배고파서 왼쪽 젓가락을 모두 잡은 경우, 오른쪽 젓가락은 아무도 잡을 수 없는 상황이 되는데, 이는 DeadLock 상황이다.

젓가락을 모두 잡았을 수 있을 때만 가능하게 해 DeadLock을 해결한 코드

 

기존의 semaphores는 남은 자원의 개수를 체크하는 데에 활용되었지만, 이 코드에서는 그렇지 않다. 그냥 잘 동작하는지 정도만 이해하면 된다. 

예를 들어 self[3] = 1 이면 젓가락 두개를 다 잡을 권한이 있다 self[2] = 0이면 철학자 2는 젓가락 두 개를 다 잡을 권한이 없다 정도로 이해하면 된다.

state[i] 는 상태이므로 P V사이에 두어 락을 건다. pickup메서드가 실행되고 state를 hungry로 바꾼다음, test를 진행하게 된다. 만약 양옆의 철학자가 젓가락을 들지 않았다면, V(self[i])연산을 통해, 0을 1로 바꿔준다.

 

 

Monitor

 

모니터 구조

 

 

특징

semaphores의 한계를 보완해 synchronized 문제를 해결하기 위해 등장한 것으로, 상호배제 속성을 제공해주는 하나의 데이터 타입이다. 아래의 블록 내부 선언된 함수들은 모두 동기화된다. 즉, 하나의 쓰레드만 접근할 수 있게 된다는 것이다. ( java의 synchronize를 생각하면된다.)

monitor {
	  condition a
      condition b 
    
    function p1(
    	a.wait()
        ){}
    
    function p2(
    	a.signal()
    	){}
    
    function p3(
    	b.wait()
        ){}
        
    function p4(
    	b.signal()
        ){}
}

컨디션.wait()

특정 컨디션의 대기 q에서 프로세스가 대기하도록 한다.

 

컨디션.signal()

특정 컨디션의  대기 q에서 대기하던 프로세스가 깨도록 한다.

 

세마포어 vs 모니터

모니터 세마포어
모니터 자체에서 상호배제를 보장하고 개발자는 동기화만 고려하면 된다. 상호배제와 동기화 모두 개발자의 책임이다.
생산자와 소비자 모두 동시에 버퍼에 접근 가능하다. 생산자와 소비자가 동시에 버퍼에 접근 불가능하다.
모니터가 올바르게 작성되면 공유자원에 접근하려는 모든 프로세스의 수행이 올바르게 동작한다. 모든 프로세스들이 올바르게 수행해야 공유자원에 접근 가능하다.

 

 

 

Bounded-Buffer Problem 해결

Bounded-Buffer Problem 해결

 

 

 

Dining Philosophers Problem 해결

Dining Philosophers Problem 해결

 

양옆이 밥을 먹고 있지않고, 배고픈 상태라면 state[i] = eating으로 설정해주고 깨워준다.(밥을 먹는 상태)

 

 

 

 

본 포스팅은 kowc 이화여대 반효경 교수님 운영체제 강의를 바탕으로 작성하였습니다.