Shine's dev log

프로세스 동기화_3 (Classical Problems) 본문

운영체제

프로세스 동기화_3 (Classical Problems)

dong1 2020. 5. 31. 23:38

이번에는 Synchronization을 할 때에 발생할 수 있는 Classical Problem 들을 살펴보자.

 

대표적인 문제들은 1) Bound Buffer Problem 2) Readers-Writers Problem 3) Dining philosophers Problem 세가지가 있다.

 

 

 

1. Bound Buffer Problem

 

주로 아래 그림과 같은 Bound Buffer에서 발생하는 문제이다.

 

bound buffer

 

Producer는 버퍼에 접근해 내용을 채우고, Consumer는 버퍼에 내용을 빼간다.

 

이 때, in = out이면 Buffer는 비었다고 판단한다. (그래서 총 N-1개의 원소만 사용가능하다. -> 꽉차면 in = out 되므로)

 

여기서 producer 두놈이 동시에 접근하거나 consumer가 동시에 두개 접근하면 race condition 발생가능하다.

 

이때의 해결법을 알아보자.

 

1) Mutex로 Synchronize

 

- in과 out 비교하는 과정에 lock, 비교 끝날때와 데이터 넣고 unlock해준다. 코드는 아래와 같다.

 

Synchronize ring buffer - mutex

 

2) Semaphore로 Synchronize

 

- Mutex = 1, empty = 0, full = N 로 해놓고 semaphore설정한다.

 

Synchronize ring buffer - semaphore

 

 

2. Readers - Writers Problem

 

여러명의 readers와 writers가 하나의 파일을 공유할 경우 발생할 수 있는 문제다.

 

어떤 파일에 여러 reader가 접근하는것은 괜찮다. 하지만, "writer는 1) reader와 동시 접근 불가. 2) 다른 writer와 동시 접근 불가" 하게 만드는 것이다.

 

다만 read하는 도중에는 write가 불가한데, 만약 계속해서 read하는 경우 write이 불가하다. (starvation) 그래서 writer가 대기중일 때 reader에게 나가라고 눈치를 주기도 한다.

 

 

 

3. Dining philosophers problem

 

https://en.wikipedia.org/wiki/Dining_philosophers_problem#/media/File:An_illustration_of_the_dining_philosophers_problem12.png]

 

위의 그림처럼 5명의 철학자가 원탁에 앉아있다고 가정하자.

 

각 철학자들은 양쪽의 포크를 다 들어야만 식사가 가능하다.

 

단, 포크를 들때는 한쪽식 들어올린다. (왼쪽 포크 집고 오른쪽 포크 집는다)

 

각 철학자는 다음 과정을 반복한다.

1) 생각한다

2) 양쪽의 두 포크를 집는다

3) 먹고 내려놓는다.

 

이 경우, 결국 다 굶어죽는것이 이 문제의 핵심이다.

 

왜 모두 굶어죽냐면, 모두 한쪽 포크 잡은 경우 아무도 양쪽포크를 잡지 못하고, 그럼 내려놓지도 못하므로 다 굶어죽는 것이다.

 

즉, shared resource를 잡는 순서를 잘 안설정해주면 망한다는 것이다. => 이런게 deadlock

 

한사람만 잡는 순서 바꿔주면 (오른쪽 포크 집고 왼쪽 포크집기) 간단히 해결된다.

 

 

오늘 배운 내용을 정리해보면,

 

1. 동기화 할 때 여러 문제들이 발생한다.

 

 

본 내용은 공부하며 정리한 것으로, 오류가 있을 수 있습니다.