읽는자 쓰는자 문제
The Readers and Writers Problem
데이터베이스 접근을 모델링한다
다수의 프로세스가 데이터베이스에서 동시에 읽는것은 허용되지만, 한 프로세스가 데이터베이스를 갱신하고 있다면 다른 프로세스는 읽는 경우라도 데이터베이스에 접근할 수 없다.
이 문제를 해결하기 위해, 최초의 독자는 데이터베이스를 접근하기 위해 세마포어 db를 down한다.
뒤따라 오는 독자들은 카운트 rc를 증가시킨다. 독자가 일을 마치면 rc를 감소시키고 마지막 독자를 세마포어 db에 대해 up을 수행하여 대기중인 작가가 있으면 작가가 다음 코드로 진입할 수 있게 한다.
typedef int semaphore;
semaphore mutex = 1; // rc에 대한 접근제어
semaphore db = 1; // db에 대한 접근제어
int rc = 0;
void reader(void){
while(TRUE){
down(&mutex); // rc에 대한 접근제어 획득
rc = rc+1;
if( rc==1 ) down(&db); // 첫번째 reader라면 db down
up(&mutex); // rc에 대한 접근제어 박탈
read_data_base();
down(&mutex); // rc에 대한 접근제어 획득
rc = rc-1;
if( rc==0 ) up(&db); // 마지막 reader가 읽고나면 db up
up(&mutex); // rc에 대한 접근제어 박탈
use_data_read();
}
}
void writer(void){
while(TRUE){
think_up_data();
down(&db); // db에 대한 접근제어 획득
write_data_base(); // db에 데이터 기록
up(&db); // db에 대한 접근제어 박탈
}
}
이 방법에도 문제가 존재한다.
적어도 하나의 독자가 이미 존재하는 한 새로운 독자는 '언제나' 진입이 허용된다.
-> 작가는 독자가 존재하지 않을 때까지 대기하게 된다. 독자의 작업이 끝나기 전에 새로운 독자가 계속해서 도착한다면 작가는 데이터베이스에 절대 접근할 수 없게 된다.
=> 작가가 기다리는 도중 독자가 도착하면 독자는 바로 진입이 허용되는 것이 아니라, 작가 뒤에 수행되도록 대기하도록 해야 한다. -> 작가는 이미 존재하는 독자들은 대기해야 하지만, 작가 이후에 도착한 독자들은 대기하지 않아도 된다.
이 방법의 단점은 병행성이 떨어져 성능이 나빠질 수 있다는 것이다.
-> Courtois et al. 은 작가에게 우선권을 주는 해결책을 제시했다.
'computerScience > 운영체제' 카테고리의 다른 글
고전적인 프로세스간 통신 문제들-식사하는 철학자 문제 (0) | 2019.12.03 |
---|---|
스레드 스케줄링 (0) | 2019.12.03 |
스케줄링 알고리즘의 분류 (0) | 2019.11.28 |
스케줄링 알고리즘 (0) | 2019.11.27 |
메시지 패싱, 장벽 (0) | 2019.11.27 |