포스트

병행 프로세스 문제

생산자-소비자 문제

정의

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

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

조건

버퍼에 여러 프로세스에 동시에 접근할 수 없음

  • 버퍼에 데이터를 넣는 동안에는 데이터를 꺼낼 수 없다.
  • 버퍼에서 데이터를 꺼내는 동안에는 데이터를 넣을 수 없다. (상호배제 필요)

버퍼 크기의 유한함

  • 버퍼가 가득 찬 경우 생산자는 대기해야 한다.
  • 버퍼가 빈 경우 소비자는 대기해야 한다. (동기화 필요)

세마포어를 이용한 해결

수도코드로 우선 표현해보겠다:

생산자 코드

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 라이센스를 따릅니다.