프로세스 간 통신
프로세스가 시스템에서 실행 중인 다른 프로세스들에 영향을 주거나 받는다면 이는 협력적인 프로세스들이다. 프로세스 협력을 허용하는 환경을 제공하는 데는 다음과 같은 이유가 있다.
- 정보 공유(Information Sharing)
- 여러 응용 프로그램이 동일한 정보(ex. 복사, 붙여넣기 등)에 접근을 한다면 이를 병행적으로 접근할 수 있는 환경을 제공해야 한다.
- 계산 가속화(Computation Speedup)
- 특정 태스크(Task)를 빨리 처리하려면 이를 서브 태스크로 나누어서 병렬로 실행하게 해야한다.
- 모듈성(Modularity)
- 시스템의 기능을 별도의 프로세스들 혹은 스레드들로 나누어서 모듈식 형태로 시스템을 구성할 수 있다.
IPC (InterProcess Communication)
프로세스는 OS 로 부터 독립적인 메모리 공간을 할당받는다. 따라서, 프로세스 간에 데이터를 교환하기 위해서는 프로세스 간 통신(InterProcess Communication, IPC)
가 필요하다.
IPC 에는 두 가지 모델이 있다.
- Shared Memory System
- Message Passing System
![](https://velog.velcdn.com/images%2Fchullll%2Fpost%2F66204ed9-59cf-40db-9770-6cf4d51e56ca%2Fimg1.daumcdn.png)
Shared Memory System
- 공유메모리는 협력 프로세스간 공유 메모리 영역이 생성되고 해당 영역을 기반으로 정보 교환이 이루어진다. 동기화(Synchronization)가 중요한 분야이다.
- 속도가 빠르기 때문에 많은 양의 데이터를 전달하는 경우에 많이 사용한다.
- 다음과 같은 두 가지 유형의 버퍼가 사용된다.
- 무한버퍼 : 버퍼 크기에 제한이 없어서 소비자 프로세스는 생산을 기다려야 할 수도 있지만, 생산자 프로세스는 언제든 새로운 데이터를 생산할 수 있다.
- 유한버퍼 : 버퍼의 크기가 고정되어 있어서 버퍼가 비어있으면 소비자 프로세스는 대기해야 한다. 버퍼가 차 있으면 생산사 프로세스가 대기한다.
Message Passing System
- 협력 프로세스들 간에 교환되는 메세지를 통해 통신이 이루어진다.
Naming
- 통신을 원하는 각 프로세스는 서로의 이름을 명시한다.
send(sender, message)
receive(receiver, message)
- 다음과 같은 특징을 갖는다.
- 통신을 원하는 모든 프로세스의 쌍 사이에 연결이 자동적으로 구축된다.
- 프로세스들은 통신하기 위해 서로의 신원만 알면 된다.
- 연결은 정확히 두 프로세스 사이에서만 연관된다.
- 통신하는 프로세스들의 각 쌍 사이엔 정확하게 하나의 연결이 존재해야 한다.
Synchronization
동기화에는 다양한 옵션이 존재한다. 동기식, 비동기식 방식으로 메시지가 전달된다.
- Sync Send : 송신하는 프로세스는 메시지가 수신 프로세스 또는 메일박스에 의해 수신될 때까지 Block 된다.
- Async Send : 송신 프로세스가 메시지를 보내고 작업을 재시작한다.
- Sync Receive : 메시지가 이용 가능할 때까지 수신 프로세스가 Block 된다.
- Async Receive : 송신하는 프로세스가 유효한 메시지 또는 NULL 을 받는다.
Buffering
교환되는 메시지들은 임시 큐에 들어가 있다. 임시 큐를 구현하는 방법은 다음과 같이 3가지로 나뉜다.
- Zero Capacity(무용량) : 큐의 최대 길이가 0 이다. 즉, 링크는 자체 안에 대기하는 메시지들을 가질 수 없다. 이 경우 송신자는 메시지를 수신할 때까지 기다려야 한다.
- Bounded Capacity(유한 용량) : 큐는 유한한 길이 n 을 가진다. 즉 최대 n 개의 메시지가 그 안에 들어갈 수 있다. 큐가 만원이 아니면 메시지는 큐에 놓이고, 큐가 만원이면 송신자는 큐 안에 가용 공간이 생길 때 까지 Block 된다.
- Unbounded Capacity (무한 용량) : 큐가 잠재적으로 무한한 길이를 가진다. 메시지들이 얼마든지 큐 안에서 대기할 수 있다. 그렇기 때문에 송신자는 Block 되지 않는다.