공유 데이터베이스에 접근할 때 생기는 문제입니다. Writer가 데이터를 쓰고 있을 때 다른 Writer가 동일한 공간에 접근하여 Write를 실행하는 것은 허락하지 않지만, Reader는 동시에 여럿이 접근하여 데이터를 읽을 수 있습니다.
readcount = 0 (db에 접근중인 reader의 수)
semaphore w_mutext (writer들 사이의 동기화 관리)
semaphore mutex ( readcount와 wrt로 접근이 순차적으로 진행되도록 하는 세마포어)
writer의 경우 shared data에 다른 process들의 접근을 차단하여 비교적 간단하게 구현합니다.
do {
wait(w_mutex);
// 쓰기 수행
signal(w_mutex);
} while (true);
reader의 경우, readcount의 증감을 전후로 lock과 unlock를 수행합니다. readcount의 값을 0과 1로 변경하면서 reader들의 접근을 처리합니다.
do {
wait(mutex);
read_count++;
if(read_count ==1)
wait(w_mutex);
signal(mutex);
// 읽기 수행
wait(mutex);
read_count--;
if (read_count == 0)
signal(w_mutex);
signal(mutex);
} whilte (true);
Readers Priority
int readcount = 0;
semaphore wsem = 1; //
semaphore x = 1; //
void main(){
int p = fork();
if(p) reader; // assume multiple instances
else writer; // assume multiple instances
}
void reader(){
while(1){
wait(x);
readcount++;
if (readcount==1)
wait(wsem);
signal(x);
doReading();
wait(x);
readcount--;
if (readcount==0)
signal(wsem);
signal(x);
}
}
void writer(){
while(1){
wait(wsem)
doWriting();
signal(wsem)
}
}
Writer Priority
int readcount, writecount = 0;
semaphore rsem, wsem = 1; //
semaphore x,y,z = 1; //
void main(){
int p = fork();
if(p) reader; // assume multiple instances
else writer; // assume multiple instances
}
void reader(){
while(1){
wait(z);
wait(rsem);
wait(x);
readcount++;
if (readcount==1)
wait(wsem);
signal(x);
signal(rsem);
signal(z);
doReading();
wait(x);
readcount--;
if (readcount==0)
signal(wsem);
signal(x);
}
}
void writer(){
while(1){
wait(y);
writecount++;
if (writecount==1)
wait(rsem);
signal(y);
wait(wsem);
doWriting();
signal(wsem);
wait(y);
writecount--;
if (writecount==0)
signal(rsem);
signal(y);
}
}
Reader priority 프로그램의 경우, reader process가 writer process의 리소스를 고갈시킬 수 있습니다.
참조
[1] - https://blog.naver.com/PostView.nhn?blogId=and_lamyland&logNo=221192481544
[2] - https://oaksong.github.io/2018/02/22/process-synchronization-part2/
[3] - http://faculty.juniata.edu/rhodes/os/ch5d.htm
'개발 > 잡다개발' 카테고리의 다른 글
IGMP (0) | 2020.06.14 |
---|---|
ESMTP (0) | 2020.06.14 |
Scrapy 구조 분석 (0) | 2020.05.27 |
파이썬 크롤링 도구 (0) | 2020.05.27 |
B+ Tree (0) | 2020.05.25 |