개발/잡다개발

Readers Writer Problems

----___<<<<< 2020. 5. 30. 23:20

 

공유 데이터베이스에 접근할 때 생기는 문제입니다. 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