Interprocess Communication
- 프로세스는 independent하거나 cooperating함
- independent : 한 프로세스삭 다른 프로세스의 실행에 영향을 주거나 받지 않음
- cooperating : 다른 프로세스의 실행에 영향을 주기도 하고 받기도 함
- IPC (Interprocess Communication)
- 데이터나 여러가지 정보를 교환하기 위해 프로세스 간 통신 기법이 필요
- Shared memory
- Message passing
Shared Memory

- 통신을 하고자 하는 두 프로세스가 일정한 메모리 영역을 공유함으로써 데이터를 주고받는 방법
- 각 프로세스는 공유 메모리 영역을 자기 자신의 주소 공간의 일부로 간주
→ 데이터 송수신을 위해 별도의 송수신 함수가 필요하지 않음
→ 프로세스가 메모리에 데이터를 쓰는 것이 송신, 메모리에서 데이터를 읽는 것이 수신
- 통신 과정에서 송신, 수신 동작은 OS가 아닌 사용자 프로세스의 통제 하에 이루어짐
- 공유 메모리 기법에서 가장 큰 이슈 중 하나는 사용자 프로세스가 통신을 하기 위해 공유 메모리를 접근할 때 서로의 동작을 동기화할 수 있는 mechanism이 필요하다는 것
- 프로세스 A와 B는 독립적인 프로세스이므로 A의 송신 동작이 B의 수신 동작보다 먼저 이루어진다는 보장이 없음
- OS가 제공하는 기능을 통해 동기화
Producer-Consumer Problem
- 두 개의 프로세스인 producer와 consumer가 buffer라는 공간을 공유
- producer는 데이터를 생산해서 buffer에 채우고 consumer는 buffer에 들어있는 데이터를 꺼내서 소비
- unbounded-buffer : 공유 buffer 크기에 제한이 없음
- bounded-buffer : 공유 buffer 크기가 고정됨
Bounded-Buffer → Shared-Memory Solution

-
Shared data
#define BUFFER_SIZE 10
typedef struct {
...
} item;
item buffer[BUFFER_SIZE];
int int = 0;
int out = 0;
- bounded-buffer 크기를 10으로 정의
- 정수형 변수 in과 out은 buffer의 특정 위치를 가리키는 포인터 역할
- in : producer 프로세스가 생산한 데이터를 저장할 위치
- out : consumer가 소비할 데이터 위치
-
그림처럼 buffer는 처음 칸과 마지막 칸이 이어져 있는 형태 (circular list)
-
in과 out 포인터는 생산과 소비가 이루어질 때마다 시계 방향으로 한칸씩 이동
-
in 포인터가 out 포인터보다 늘 앞선 위치에 있음
-
데이터 개수 : in - out
-
Producer
item next_produced;
while (true) {
while (((int+1) % BUFFER_SIZE) == out)
;
buffer[in] = next_produced;
in = (in+1) % BUFFER_SIZE;
}
- 데이터를 생산해서 이를 bounded-buffer에 넣는 동작을 반복하는 구조
- 데이터를 저장하기 전 buffer의 상태를 살펴보고, 빈 공간이 없으면 빈 공간이 생기기를 기다리며 자신의 실행을 지연시킴 (동기화)
-
Consumer
item next_consumed;
while (true) {
while (in == out)
;
next_consumed = buffer[out];
out = (out+1) % BUFFER_SIZE;
}
- buffer에서 데이터를 꺼내어 소비하는 동작을 반복
- 데이터를 꺼내기 전 buffer의 상태를 살펴보고, buffer가 비어있으면 buffer에 하나 이상의 데이터가 채워질 때까지 자신의 실행을 지연시킴 (동기화)
Message Passing

- 프로세스 간 통신을 하거나 동기화를 하기 위한 대표적인 IPC mechanism
- 메모리를 공유하지 않고 통신 가능
- kernel이 두 개의 연산을 제공
- send(message)
- receive(message)
- 송신할 메시지를 kernel에 있는 queue에 매달고, 수신 프로세스는 이를 꺼내어 수신함
- 메시지 공유 공간은 kernel 내에 있고 messaage queue 형태로 존재
Direct Communication
- naming : 통신을 원하는 프로세스들이 서로를 가리키는 방법
- 통신을 원하는 프로세스가 통신의 송수신자 이름을 명시
- send(P, message) : 프로세스 P에 송신
- receive(Q, message) : 프로세스 Q로부터 수신
- 특징
- 연결은 자동으로 이루어짐 (send와 receive를 할 때마다 상대방을 지정하기 때문)
- 연결은 오직 두 프로세스 간에만 이루어짐
- 단방향 혹은 양방향 연결
Indirect Communication
- 프로세스 간의 mailbox 혹은 port를 두고, mailbox로 메시지를 보내고 mailbox로부터 메시지를 받는 방식
- 각 mailbox마다 고유한 id 보유
- 프로세스들은 통신을 위해 mailbox를 공유
- 특징
- 공통의 mailbox를 가지는 프로세스들끼리만 연결
- 하나의 link를 통해 여러 프로세스가 통신 가능
- 한 쌍의 프로세스 간에 여러 개의 link를 공유할 수도 있음
- 단방향 혹은 양방향 연결
- 연산 : mailbox 생성, 제거 및 mailbox로부터 송수신
- send(A, message) : mailbox A에 송신
- receive(A, message) : mailbox A로부터 수신
Synchronization
- Blocking
- Blocking send : 보낸 메시지를 수신자가 수신할 때까지 send가 block 되는 방식 (프로세스가 대기 상태에 있게 됨)
- Blocking receive : 수신하고자 하는 메시지가 available 할 때까지 receive가 block 되는 방식
- Non-Blocking
- Non-blocking send : 메시지를 보내고 수신 여부에 상관없이 다음 동작을 이어나감 (호출 후 바로 return 가능)
- Non-blocking receive : 수신하고자 하는 메시지가 없는 경우 null 메시지를 받음
- rendezvous(랑데뷰) : Blocking send와 receive로 송수신하는 것
Buffering
- direct 또는 indirect 커뮤니케이션에 관계없이 커뮤니케이션 link마다 메시지들을 위한 queue가 있으며, 프로세스들이 주고받는 메시지는 이 임시 queue에 머물게 됨
- message queue 구현 방식
- Zero capacity
- 큐의 길이가 최대 0
- link는 중간에 대기하는 메시지들을 가질 수 없으며, sender는 receiver가 수신할 때까지 무조건 기다려야 함
- Bounded capacity
- 큐에 최대 n개의 메시지를 넣을 수 있음
- 송신할 때 큐가 가득차 있지 않은 경우 sender가 송신 후 즉시 수행을 이어나갈 수 있음
- 큐가 가득차 있으면 큐가 비기를 기다림
- Unbounded capacity
- 큐의 길이에 제약이 없음
- sender가 기다리는 경우가 없음
참고 자료 : Operating System Concepts Essentials
*이미지 자료는 교재 자료를 직접 다시 만든 것으로 무단 불펌 금지입니다
끗!!