[OS] 프로세스 동기화 : Semaphore Based Concurrent Programming_2

parkheeddong·2023년 4월 17일
0

Operating System

목록 보기
25/63
post-thumbnail

4. Reader-Writer Problem

1) 문제상황

특정 Data를 읽어가기만 하는 'reader process' 과, 쓰기만 하는 'writer process'들이 있다.

Reader들은 해당 데이터에 동시 접근이 가능하다.
Writer은 한번에 한번만 데이터를 접근해야 한다.(다른 writer과 혹은 다른 reader와 동시 접근 불가능)

2) Solution

특정 reader 혹은 writer 프로세스에게 Priority를 주는 방법으로 해결할 수 있다.

(1) Strong Reader Preference Solution
(2) Weak Reader Preference Solution
(3) Writer Preference Solution

우리는 Weak Reader Preference Solution을 본다!

(1) Writer

Writer의 Mutual Exclusion을 위한 semaphore 변수 wmutex = 1

P연산 : Writer가 write 하기 전에 다른 프로세스가 들어가 있지 않은지 확인
WRITE Operation
V연산

(2) Reader

nreaders 변수 : 현재 reading 하고 있는 reader의 개수

✔️ 여러 reader가 동시에 reading 해도 상관 없다.

nreaders++ 읽기 전에 nreaders 증가

READ Operation

nreaders-- 읽기가 끝나면 nreaders 감소

✔️ 단, nreaders 변수 값을 증가시킬 때, 여러 reader가 동시에 증가연산을 수행하면 안 되기 때문에 이 부분에서 mutual exclusion이 필요하다.

Reader의 Mutual Exclusion을 위한 semaphore 변수 rmutex = 1;

따라서 nreaders++와 nreaders-- 연산 전후에 P(rmutex)와 V(rmutex) 연산을 수행한다.

✔️ reader와 writer도 동시에 있으면 안 되기 때문에,

if (nreaders == 0)
P(wmutex)

를 하여 첫 번째 reader가 들어오면, P 연산을 하여 writer가 들어오지 못하도록 락을 건다.

if (nreaders == 0)
v(rmutex)

를 하여 마지막 reader가 나가면, P 연산을 하여 writer가 이제 들어올 수 있도록 락을 풀어준다.

➡️ 요런 방식으로 reader-writer문제를 semaphore로 해결할 수 있다 !

대부분의 운영체제들은 reader-writer 문제에 대해서 실제로 'semaphore'을 사용하기보다는, 'reader-writer Lock'이라는 컨셉을 만들고 사용하여 좀 더 쉽게 mutual exclusion 문제를 해결하고 있다. 즉, reader-writer lock이 별도로 제공된다.

5. Dining Philosopher Problem

실제 운영체제에서 맞닥뜨리는 문제는 아니지만, '만들어진 상황'의 문제 !

원탁 테이블 주변에 다섯 명의 철학자들이 앉아 있고, 그 앞에 음식이 놓여 있고, 사이사이에 포크가 놓여 있다.

철학자들은 '생각(Thinking)' => 식사(eating)'을 무제한 반복한다.
생각은 자유롭게 하지만, 식사는 '양 쪽의 모든 포크를 들어야' 할 수 있다. 그리고 식사가 끝나면 포크를 내려 놓는다.

각 철학자들은 포크를 집어 들고(pickup), 읽고(eating), 내려놓고(putdown), 생각하는 과정(think)을 반복한다.

=> pickup과 putdown함수를 어떻게 구현할 수 있는지 생각해 보기 !

0개의 댓글