주니어 개발자 성장기

Process Synchronization - Readers-Writers Problem 본문

CS스터디/운영체제

Process Synchronization - Readers-Writers Problem

Junpyo Lee 2024. 4. 1. 20:05

문제 상황

  • 주로 데이터베이스에서 발생하는 문제이다.
  • 한 프로세스가 DB에 Write 중일 때 다른 프로세스가 접근하면 안된다.
  • Read는 동시에 여럿이 해도 된다.

 

해결법

  • Writer가 DB에 접근 허가를 아직 얻지 못한 상태에서는 모든 대기중인 Reader들을 다 DB에 접근하게 해준다.
  • Writer는 대기 중인 Reader가 하나도 없을 때 DB 접근이 허용된다.
    • 일단 Writer가 DB에 접근 중이라면 Reader들은 접근이 금지된다.
    • Writer가 DB에서 빠져나가야만 Reader의 접근이 허용된다.

 

여기서 Shared Data는?

  1. DB 자체
  2. readcount - 현재 DB에 접근 중인 Reader의 수

 

두 가지 동기화 변수(세마포어)

  • Mutex
    • 공유 변수 readcount를 접근하는 코드(critical section)의 mutual exclusion 보장을 위해 사용
  • DB
    • ReaderWriter가 공유 DB 자체를 올바르게 접근하게 하는 역할

 

 

Pseudo Code

Initialization
// Shared Data
int readcount = 0;
DB 자체;

// Synchronization variables
semaphore mutex = 1, db = 1;
  • DB 자체와 현재 읽는 중인 Reader의 수를 나타내는 readcount가 공유 데이터이다.
  • 이 두 공유 데이터를 관리하기 위해 세마포어 변수 mutexdb를 사용한다.
    • mutexReaderreadcount의 값을 변경할 때 쓰는 세마포어 변수다.
    • db는 DB 자체에 대해 WriterReader간 Mutual Exclusion을 달성하기 위한 세마포어 변수다.

 

Writer

P(db);

// writing DB is performed

V(db);
  • Starvation이 발생 가능하다.

 

Reader

P(mutex);
readcount++;
if(readcount == 1) P(db); // block writer
V(mutex);

// reading DB is performed

P(mutex);
readcount--;
if(readcount == 0) V(db); // enable writer
V(mutex);
  • 첫번째 ReaderWriter가 접근하지 못하도록 db 세마포어 변수에 lock을 건다
  • 마지막 Reader는 이제 Writer가 접근할 수 있도록 db 세마포어 변수에 lock을 해제한다.

 

 

 

출처

반효경, "운영체제 2014-1", KOCW, http://www.kocw.net/home/cview.do?cid=3646706b4347ef09