특정 Data를 읽어가기만 하는 'reader process' 과, 쓰기만 하는 'writer process'들이 있다.
Reader들은 해당 데이터에 동시 접근이 가능하다.
Writer은 한번에 한번만 데이터를 접근해야 한다.(다른 writer과 혹은 다른 reader와 동시 접근 불가능)
특정 reader 혹은 writer 프로세스에게 Priority를 주는 방법으로 해결할 수 있다.
(1) Strong Reader Preference Solution
(2) Weak Reader Preference Solution
(3) Writer Preference Solution
P연산 : Writer가 write 하기 전에 다른 프로세스가 들어가 있지 않은지 확인
WRITE Operation
V연산
nreaders 변수 : 현재 reading 하고 있는 reader의 개수
nreaders++ 읽기 전에 nreaders 증가
READ Operation
nreaders-- 읽기가 끝나면 nreaders 감소
Reader의 Mutual Exclusion을 위한 semaphore 변수 rmutex = 1;
따라서 nreaders++와 nreaders-- 연산 전후에 P(rmutex)와 V(rmutex) 연산을 수행한다.
if (nreaders == 0)
P(wmutex)
if (nreaders == 0)
v(rmutex)
➡️ 요런 방식으로 reader-writer문제를 semaphore로 해결할 수 있다 !
대부분의 운영체제들은 reader-writer 문제에 대해서 실제로 'semaphore'을 사용하기보다는, 'reader-writer Lock'이라는 컨셉을 만들고 사용하여 좀 더 쉽게 mutual exclusion 문제를 해결하고 있다. 즉, reader-writer lock이 별도로 제공된다.
실제 운영체제에서 맞닥뜨리는 문제는 아니지만, '만들어진 상황'의 문제 !
원탁 테이블 주변에 다섯 명의 철학자들이 앉아 있고, 그 앞에 음식이 놓여 있고, 사이사이에 포크가 놓여 있다.
철학자들은 '생각(Thinking)' => 식사(eating)'을 무제한 반복한다.
생각은 자유롭게 하지만, 식사는 '양 쪽의 모든 포크를 들어야' 할 수 있다. 그리고 식사가 끝나면 포크를 내려 놓는다.
각 철학자들은 포크를 집어 들고(pickup), 읽고(eating), 내려놓고(putdown), 생각하는 과정(think)을 반복한다.
=> pickup과 putdown함수를 어떻게 구현할 수 있는지 생각해 보기 !