[OS] IPC: 프로세스 통신
1. 프로세스간 통신(IPC)
프로세스간 통신이 아닌 스레드 간 통신을 생각해보자. 이는 프로세스 내부 통신, 즉 Code, Data, Heap 영역을 공유자원으로 활용하므로 비교적 간단하다. 그러나 프로세스 간 통신(IPC, Inter-Process Communication)은 가상메모리로 인해 직접 통신이 불가능하다. 이런 이유로 프로세스 간에는 특별한 방법을 통해 통신하게 된다.
1.1. 종류
1.1.1. 프로세스 내부 데이터 통신(= 스레드)
- 한 프로세스 내에 2개 이상의 스레드가 존재하는 경우의 통신이다.
- 스레드는 전역변수, 파일 이용해 데이터 주고받는다.
1.1.2. 프로세스간 데이터 통신(주요 의미)
- 같은 컴퓨터에 있는 여러 프로세스 간의 통신이다.
- 공용 파일 또는 OS가 제공하는 파이프 사용하여 통신한다.
1.1.3. 네트워크 이용한 데이터 통신
- 여러 컴퓨터가 네트워크로 연결되어 있을 때의 통신이다.
- 소켓을 이용해 데이터를 주고받는다.
1.2. 원시적인 프로세스 통신 예시
- 파일을 공통으로 경유해 메시지를 전달한다.
1
2
3
4
5
6
7
8
9
10
// 프로세스 1(Sender)의 코드
#include <stdio.h>
int main() {
FILE *f = fopen("temp.txt", "w");
fprintf(f, "Can you hear me? \n");
fclose(f);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
// 프로세스 2(Receiver)의 코드
#include <stdio.h>
int main() {
sleep(10);
FILE *f = fopen("temp.txt", "r");
char buf[128];
fread(buf, 1, 128, f);
printf(buf);
fclose(f);
return 0;
}
2. 프로세스간 통신의 분류
- 통신 방향(전송 방식)에 따른 분류
종류 | 예 |
---|---|
양방향 통신 | 일반적 통신, 소켓 |
반양방향 통신 | 무전기 |
단방향 통신 | 전역 변수, 파일, 파이프 |
- 통신 구현 방식(수신 대기 여부)에 따른 분류
종류 | 예 |
---|---|
대기가 있는 통신(동기화 통신) | 파이프, 소켓 |
대기가 없는 통신(비동기화 통신) | 전역 변수, 파일 |
2.1. 전송 방식에 따른 분류
2.1.1. 단방향 통신(Simplex)
- 라디오 신호처럼 한쪽 방향으로만 데이터 전송하는 구조
- 프로세스간 통신에서의 예: 전역 변수, 파이프
2.1.2. 반양방향 통신(반이중 통신, Half duplex)
- 특정 시점에 한쪽 방향으로만 전송 가능한 구조
- 데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능하다.
- 대표적인 예: 무전기
2.1.3. 양방향 통신(전이중 통신, Full duplex)
- 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조
- 프로세스간 통신에서의 예: 소켓 통신
2.2. 수신 대기에 따른 분류
2.2.1. 대기 있는 통신
- 동기화를 지원하는 통신 방식
- 데이터 받는 쪽은 데이터 도착할 때까지 자동으로 대기 상태에 머물러 있는다.
- 인터럽트와 비슷함
2.2.2. 대기가 없는 통신
- 동기화를 지원하지 않는 통신 방식
- 데이터를 받는 쪽은 바쁜 대기를 사용하여 데이터가 도착했는지 여부를 직접 확인한다.
- 풀링과 비슷함
3. 통신 방법의 여러 양상들
두 실행 흐름이 있을 때 이들간의 통신에 있어 다양한 방법을 사용할 수 있는데, 통신 방법의 양상들을 Blocking / Non-Blocking 방식과 Synchronous / Asynchronous 방식을 조합하여 크게 4가지로 분류할 수 있다.
통신 방식
- Synchronous
- 호출한 흐름의 return을 기다리는 방식
- Asynchronous
- 호출한 흐름의 return을 기다리지 않는 방식
- Blocking
- 실행의 제어권을 다른 흐름에게 넘겨주는 방식
- Non-blocking
- 실행의 제어권을 넘겨주는 방식
통신 방식이 조합되어 아래와 같은 4가지의 통신 양상이 나올 수 있다.
통신 방법의 여러 양상들
- Sync-Blocking
- 다른 작업 흐름을 호출하고 본인은 대기한다.
- 다른 흐름 작업이 완료되는 즉시 본인의 작업을 수행한다.
- Async-Blocking
- 다른 작업 흐름을 호출 시 callback 함수를 같이 전달한다.
- 다른 흐름이 완료되면 callback이 호출되지만, async한 특성으로 인해 흐름이 동기화가 되지는 않는다.
- 개념적으로만 있을뿐 실제로는 거의 사용되지 않는다. Sync-Blocking 방식과의 성능 차이가 거의 없기 때문이다.
- Sync-Nonblocking
- 주기적으로 작업이 완료되었는지 확인한다.
- 바쁜 대기(busy-waiting)라고도 한다.
- 폴링과 동작이 비슷하다.
- Async-Nonblocking
- callback 함수를 제공함으로써, 다른 흐름이 완료되면 callback 함수를 호출하게 한다.
4. 프로세스 통신 방법 정리
본격적으로 프로세스간 다양한 통신 방법을 다루기 전에 그 방법들을 정리하였다. 자세한 내용은 다음 게시물에서 다룰 것이다.
IPC 종류 | 사용 시기 | 공유 매개체 | 통신 단위 | 통신 방향 | 통신 가능 범위 |
---|---|---|---|---|---|
PIPE | 부모 자식 간 단방향 통신 시 | 파일 | Stream | 단방향 | 동일 시스템 |
Named PIPE | 다른 프로세스와 단방향 통신 시 | 파일 | Stream | 단방향 | 동일 시스템 |
Mesage Queue | 다른 프로세스와 단방향 통신 시 | 메모리 | 구조체 | 단방향 | 동일 시스템 |
Shared Memory | 다른 프로세스와 양방향 통신 시 | 메모리 | 구조체 | 양방향 | 동일 시스템 |
Memory Map | 다른 프로세스와 양방향 통신 시 | 파일+메모리 | 페이지 | 양방향 | 동일 시스템 |
Socket | 다른 시스템간 양방향 통신 시 | 소켓 | Stream(Packet) | 양방향 | 동일 + 외부 시스템 |
이 포스팅은 작성자의 CC BY-NC 4.0 라이선스를 준수합니다.