[운영체제] 병행 프로세스-2
생산자-소비자 문제
두 협력 프로세스 사이에 버퍼를 두고 생산자와 소비자의 상황을 다루는 문제
- 생산자 : 데이터를 넣는 프로세스
- 소비자 : 데이터를 꺼내는 프로세스
-
문제조건
1) 버퍼에 여러 프로세스가 동시에 접근할 수 없음
- 데이터를 넣는 동안 꺼낼수없고, 꺼내는 동안 넣을 수 없음
-> 상호 배제 필요
2) 버퍼의 크기가 유한 (유한 버퍼 문제)
- 버퍼가 가득 찬 경우 생산자는 대기해야 함
- 버퍼가 빈 경우 소비자는 대기해야 함
-> 동기화 필요 -
세마포어를 이용한 해결
- 상호배제 : 세마포어 mutex (초깃값 1)
- 버퍼가 가득 찬 경우 동기화 : 세마포어 empty (초깃값 n, n:버퍼크기)
- 버퍼가 비어있는 경우 동기화 : 세마포어 full (초깃값 0)
- 상호배제 : 세마포어 mutex (초깃값 1)
- 생산자의 코드
while(true) { 데이터를 생산 P(empty); P(mutex); 버퍼에 데이터를 넣음 (임계영역) V(mutex); V(full); }
- 소비자의 코드
while(true) { P(full); P(mutex); 버퍼에서 데이터를 꺼냄 (임계영역) V(mutex); V(empty); 데이터를 소비 }
판독기-기록기 문제
여러 협력 프로세스 사이에 공유자원을 두고 판독기와 기록기의 상황을 다루는 문제
- 판독기 : 데이터를 읽는 프로세스
- 기록기 : 데이터를 쓰는 프로세스
- 문제조건
1) 하나의 기록기가 공유자원에 데이터를 쓰는 중에는 다른 기록기나 판독기는 공유자원에 접근할 수 없음
- 공유자원에 데이터를 쓰는 동안에는 누구도 접근할 수 없음
- 공유자원에서 데이터를 읽는 동안에는 데이터를 쓸 수 없음
-> 상호 배제 필요
2) 여러 판독기는 동시에 공유자원에서 데이터를 읽을 수 있음
- 판독기가 읽는 중 새로운 판독기가 읽기 시도 가능함
- 판독기가 읽는 중 기록기 대기
-> 새로운 판독기 읽기 시도 -> 가능/불가능
* 제 1 판독기 - 기록기 문제
- 판독기가 공유자원에 접근 중이라면 기록기보다 판독기에 우선순위를 줌
- 즉, 새로운 판독기는 즉시 공유자원에 접근 가능
- 문제점 : 기록기의 기아상태 유발 가능
- 세마포어를 이용한 해결
- 상호배제 : 세마포어 wrt
- 판독기 우선 : 일반변수 rcount (초깃값 0), 세마포어 mutex (초깃값 1)
- 상호배제 : 세마포어 wrt
- 기록기의 코드
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 판독기 - 기록기 문제
- 판독기가 공유자원에 접근 중이라면 판독기보다 기록기에 우선순위를 줌
- 즉, 대기중인 기록기가 있다면 새로운 판독기는 공유자원에 접근 불가능
- 문제점 : 판독기의 기아상태 유발 가능. 판독기의 병행성이 떨어짐
- 세마포어를 이용한 해결
- 5개의 세마포어 rd, wrt, mutex1, mutex2, mutex3 (초깃값 전원 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); }