생산자-소비자 문제

두 협력 프로세스 사이에 버퍼를 두고 생산자와 소비자의 상황을 다루는 문제

  • 생산자 : 데이터를 넣는 프로세스
  • 소비자 : 데이터를 꺼내는 프로세스

  1. 문제조건
    1) 버퍼에 여러 프로세스가 동시에 접근할 수 없음
    - 데이터를 넣는 동안 꺼낼수없고, 꺼내는 동안 넣을 수 없음
    -> 상호 배제 필요
    2) 버퍼의 크기가 유한 (유한 버퍼 문제)
    - 버퍼가 가득 찬 경우 생산자는 대기해야 함
    - 버퍼가 빈 경우 소비자는 대기해야 함
    -> 동기화 필요

  2. 세마포어를 이용한 해결

    • 상호배제 : 세마포어 mutex (초깃값 1)
    • 버퍼가 가득 찬 경우 동기화 : 세마포어 empty (초깃값 n, n:버퍼크기)
    • 버퍼가 비어있는 경우 동기화 : 세마포어 full (초깃값 0)

  • 생산자의 코드
    while(true) {
      데이터를 생산
    	
      P(empty);
      P(mutex);
      버퍼에 데이터를 넣음 (임계영역)
      V(mutex);
      V(full);
    }
    
  • 소비자의 코드
    while(true) {
      P(full);
      P(mutex);
      버퍼에서 데이터를 꺼냄 (임계영역)
      V(mutex);
      V(empty);
    
      데이터를 소비
    }
    

판독기-기록기 문제

여러 협력 프로세스 사이에 공유자원을 두고 판독기와 기록기의 상황을 다루는 문제

  • 판독기 : 데이터를 읽는 프로세스
  • 기록기 : 데이터를 쓰는 프로세스

  1. 문제조건
    1) 하나의 기록기가 공유자원에 데이터를 쓰는 중에는 다른 기록기나 판독기는 공유자원에 접근할 수 없음
    - 공유자원에 데이터를 쓰는 동안에는 누구도 접근할 수 없음
    - 공유자원에서 데이터를 읽는 동안에는 데이터를 쓸 수 없음
    -> 상호 배제 필요
    2) 여러 판독기는 동시에 공유자원에서 데이터를 읽을 수 있음
    - 판독기가 읽는 중 새로운 판독기가 읽기 시도 가능함
    - 판독기가 읽는 중 기록기 대기
    -> 새로운 판독기 읽기 시도 -> 가능/불가능

* 제 1 판독기 - 기록기 문제

  • 판독기가 공유자원에 접근 중이라면 기록기보다 판독기에 우선순위를 줌
  • 즉, 새로운 판독기는 즉시 공유자원에 접근 가능
  • 문제점 : 기록기의 기아상태 유발 가능

  1. 세마포어를 이용한 해결
    • 상호배제 : 세마포어 wrt
    • 판독기 우선 : 일반변수 rcount (초깃값 0), 세마포어 mutex (초깃값 1)

  • 기록기의 코드
    while(true) {
      P(wrt);
      공유자원에 쓰기 (임계영역)
      V(wrt);
    }
    
  • 판독기의 코드
    while(true) {
      P(mutex);
      rcount = rcount +1;
      if(rcount==1) {
          P(wrt);
      }
      V(mutex);
      공유자원에서 읽기 (임계영역)
      P(mutex);
      rcount = rcount - 1;
      if(rcount==0) {
          V(wrt);
      }
      V(mutex);
    }
    

* 제 2 판독기 - 기록기 문제

  • 판독기가 공유자원에 접근 중이라면 판독기보다 기록기에 우선순위를 줌
  • 즉, 대기중인 기록기가 있다면 새로운 판독기는 공유자원에 접근 불가능
  • 문제점 : 판독기의 기아상태 유발 가능. 판독기의 병행성이 떨어짐

  1. 세마포어를 이용한 해결
    • 5개의 세마포어 rd, wrt, mutex1, mutex2, mutex3 (초깃값 전원 1)

  • 기록기의 코드
    while(true) {
      P(mutex2);
      wcount = wcount +1;
      if(wcount==1) {
          P(rd);
      }
      V(mutex2);
      P(wrt);
      공유자원에 쓰기 (임계영역)
      V(wrt);
      P(mutex2);
      wcount = wcount -1;
      if(wcount==0) {
          V(rd);
      }
      V(mutex2);
    }
    
  • 판독기의 코드
    while(true) {
      P(mutex3);
      P(rd);
      P(mutex1);
      rcount = rcount +1;
      if(rcount==1) {
          P(wrt);
      }
      V(mutex1);
      V(rd);
      V(mutex3);
      공유자원에서 읽기 (임계영역)
      P(mutex1);
      rcount = rcount - 1;
      if(rcount==0) {
          V(wrt);
      }
      V(mutex1);
    }
    

Updated: