병행 프로세스 문제
생산자-소비자 문제
정의
두 협력 프로세스 사이에 버퍼를 두고 생산자와 소비자의 상황을 다루는 문제
- 생산자: 데이터를 넣는 프로세스
- 소비자: 데이터를 꺼내는 프로세스
조건
버퍼에 여러 프로세스에 동시에 접근할 수 없음
- 버퍼에 데이터를 넣는 동안에는 데이터를 꺼낼 수 없다.
- 버퍼에서 데이터를 꺼내는 동안에는 데이터를 넣을 수 없다. (상호배제 필요)
버퍼 크기의 유한함
- 버퍼가 가득 찬 경우 생산자는 대기해야 한다.
- 버퍼가 빈 경우 소비자는 대기해야 한다. (동기화 필요)
세마포어를 이용한 해결
수도코드로 우선 표현해보겠다:
생산자 코드
1
2
3
4
5
6
7
8
while(true){
데이터를 생산
P(empty);
P(mutex);
버퍼에 데이터를 넣음
V(mutex);
V(full);
}
소비자 코드
1
2
3
4
5
6
7
8
while(true){
P(full);
P(mutex);
버퍼에 데이터 꺼냄
V(mutex);
V(empty);
데이터를 소비
}
세 개의 세마포어 mutex, empty, full이 필요하다.
판독기-기록기 문제
정의
여러 협력 프로세스 사이에 공유자원을 두고 판독기와 기록기의 상황을 다루는 문제
- 판독기: 데이터를 읽는 프로세스
- 기록기: 데이터를 쓰는 프로세스
유의할 점은, 판독기가 공유자원에서 데이터를 읽는 행위는 공유 자원에 영향을 미치지 않는다.
반면, 기록기는 데이터를 쓰기 때문에 이 행위는 공유자원에 변화를 준다.
앞서 봤던 생산자-소비자 문제에서는 생산자와 소비자 모두 일종의 기록기이다.
조건
하나의 기록기가 공유자원에 데이터를 쓰는 중에는 다른 기록기나 판독기는 공유자원에 접근할 수 없음
- 공유자원에 데이터를 쓰는 동안에는 누구도 접근할 수 없다.
- 공유자원에서 데이터를 읽는 동안에 다른 기록기는 데이터를 쓸 수 없다. (상호배제 필요)
여러 판독기는 동시에 공유자원에서 데이터를 읽을 수 있음
- 판독기가 읽는 중 새로운 판독기의 읽기 행위는 가능하다.
- 판독기가 읽는 중 기록기는 대기한다. 기록기가 대기하는 상황에서 새로운 판독기가 공유자원에 접근이 가능한지는 설정한 바에 따라 가능하기도, 불가능하기도 하다.
제1판독기-기록기 문제
판독기가 공유자원에 접근 중이라면 기록기보다 판독기에 우선순위를 줌
- 즉, 새로운 판독기는 즉시 공유자원에 접근 가능 문제점
- 기록기의 기아상태 유발 가능
세마포어를 이용한 해결
이 문제 또한 수도코드로 표현해보겠다:
기록기
1
2
3
4
P(wrt);
공유자원에 쓰기
V(wrt);
판독기
1
2
3
4
5
6
7
8
9
P(mutex);
rcount = rcount + 1;
if(rcount == 1) P(wrt);
V(mutex);
공유자원에서 읽기
P(mutex);
rcount = rcount - 1;
if(rcount ==0) V(wrt);
V(mutex);
두 개의 세마포어 mutex와 wrt가 필요하다.
제2판독기-기록기 문제
판독기가 공유자원에 접근 중이라면 판독기보다 기록기에 우선순위를 줌
- 즉, 대기 중인 기록기가 있다면 새로운 판독기는 공유자원에 접근 불가능 문제점
- 판독기의 병행성이 떨어짐
- 판독기의 기아상태 유발 가능
세마포어를 이용한 해결
기록기
1
2
3
4
5
6
7
8
9
10
11
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);
판독기
1
2
3
4
5
6
7
8
9
10
11
12
13
P(mutex3);
P(rd);
P(mutex);
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);
무려 다섯 개의 세마포어가 필요하다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.