병행 프로세스
프로세스의 상호협력
공통 작업을 수행하기 위해 서로 협동하는 경우
- 생산자/소비자 문제, 판독기/기록기 문제
생산자/소비자 문제
- 유한 버퍼 문제
생산자
: 버퍼에 데이터를 채우는 프로세스소비자
: 버퍼에 있는 데이터를 읽어내는 프로세스
- 생산자 프로세스
1
2
3
4
5
6
7
8
9
repeat
P(empty);
P(mutex);
V(mutex);
V(full);
until false;
- 소비자 프로세스
1
2
3
4
5
6
7
8
9
repeat
P(full);
P(mutex);
V(mutex);
V(empty);
until false;
판독기/기록기 문제
- 여러 개의 판독기가 동시에 공유 데이터 객체에 접근하는 것은 문제 없음
- 기록기와 또 다른 프로세스(판독기 또는 기록기)가 동시에 공유 객체에 접근한다면 문제가 발생, 기록기가 공유 객체에 대해 배타적 접근을 하도록 해야한다.
- 우선순위에 따른 문제의 변형
- 제1판독기/기록기 문제(판독기 우선)
- 기록기가 이미 공유객체의 사용을 허가 받은 것이 아니라면 판독기는 대기하지 않음
- 기록기의 기아상태 유발 가능
- 제2판독기/기록기 문제(기록기 우선)
- 일단 기록기가 준비되었다면 기록을 가능한 한 빨리 수행할 수 있도록 함
- 판독기의 기아상태 유발 가능
- 제1판독기/기록기 문제(판독기 우선)
- 판독기 프로세스
1
2
3
4
5
6
7
8
9
10
11
12
var mutex, wrt : semaphore;
readcount : integer;
P(mutex);
readcount := readcount + 1;
if readcount = 1 then P(wrt);
V(mutex);
//..읽기 수행..
P(mutex);
readcount := readcount - 1;
if readcount = 0 then V(wrt);
V(mutex);
- 기록기 프로세스
1 2 3
P(wrt); //..쓰기 수행.. V(wrt);
프로세스 간의 통신
병행 프로세스 사이의 통신을 위한 방법
- 공유기억장치 기법
- 프로세스 간에 공유변수를 이용하여 정보를 교환하도록 하는 것
- 예 : 유한 버퍼
- 고속 통신 가능
- 통신기능 제공의 책임 : 응용 프로그래머
- 메시지 시스템 기법
- 메세지 교환방식을 이용함으로써 프로세스가 공유변수에 의존하지 않고도 서로 통신할 수 있게 하는 것
- send/receive 연산자
- 소량의 데이터 교환에 유용
- 통신기능 제공의 책임 : 운영체제
통신 링크
: 프로세스들 사이에 메시지를 주고받기 위한 연결통로논리적 구현에 대한 이슈
- 어떻게 링크를 설정하는가?
- 한 링크가 2개 이상의 프로세스와 연결될 수 있는가?
- 통신 프로세스의 pair에 얼마나 많은 링크가 있는가?
- 링크의 용량은 얼마인가? 즉, 링크가 어느 정도 버퍼 공간을 갖는가? 갖는다면 어느 정도인가?
- 메시지의 크기는 어느 정도인가? 링크가 가변크기 또는 고정크기 메시지를 수용할 수 있는가?
</div> </details>
- 어떻게 링크를 설정하는가?
- 직접 통신
- 메시지 전달 연산에 수신자나 송신자 이름을 명시
- 통신 링크는 자동 설정됨
- 하나의 링크는 두 프로세스 사이만 연관되며 각 통신 프로세스 쌍 사이에는 정확히 하나의 링크가 존재한다.
- 링크는 양방향이다.
- 간접 통신
- 메시지 전달 연산에 우편함 이름을 명시
- 공유 우편함이 있는 경우에만 설정됨
- 한 링크는 2개 이상의 프로세스들과 연관될 수 있으며 각 통신 프로세스 쌍 사이에는 여러 링크가 존재 가능
- 링크는 단방향 또는 양방향이다.
- 링크의 용량
- ‘0’ 용량 - 큐의 최대 길이가 0이다.
- 제한된 용량 - 큐는 유한 길이 n을 갖는다.
- 무제한 용량 - 큐는 무한한 길이를 가지고 있다.
- 예외조건
- 프로세스가 종료된 경우
- 송신 프로세스가 종료된 경우
- 수신 프로세스가 종료된 경우
- 메시지를 상실한 경우
- 운영체제가 이런 사건을 탐지하고 메시지를 재전송한다.
- 송신 프로세스가 이런 사건을 탐지하고, 원한다면 메시지를 재전송한다.
- 운영체제가 탐지 후 송신 프로세스에게 통지한다. 송신 프로세스는 원한다면 계속 수행할 수 있다.
- 메시지가 혼합된 경우
- 운영체제가 처음의 메시지를 재전송하거나 이런 사건을 프로세스에 통보한다.
- 프로세스가 종료된 경우