포스트

[OS] IPC: 프로세스 통신

1. 프로세스간 통신(IPC)

프로세스간 통신이 아닌 스레드 간 통신을 생각해보자. 이는 프로세스 내부 통신, 즉 Code, Data, Heap 영역을 공유자원으로 활용하므로 비교적 간단하다. 그러나 프로세스 간 통신(IPC, Inter-Process Communication)은 가상메모리로 인해 직접 통신이 불가능하다. 이런 이유로 프로세스 간에는 특별한 방법을 통해 통신하게 된다.

1.1. 종류

1.1.1. 프로세스 내부 데이터 통신(= 스레드)

  • 한 프로세스 내에 2개 이상의 스레드가 존재하는 경우의 통신이다.
  • 스레드는 전역변수, 파일 이용해 데이터 주고받는다.

1.1. 프로세스 통신 방법 - 내부

1.1.2. 프로세스간 데이터 통신(주요 의미)

  • 같은 컴퓨터에 있는 여러 프로세스 간의 통신이다.
  • 공용 파일 또는 OS가 제공하는 파이프 사용하여 통신한다.

1.1. 프로세스 통신 방법 - 동일 컴퓨터

1.1.3. 네트워크 이용한 데이터 통신

  • 여러 컴퓨터가 네트워크로 연결되어 있을 때의 통신이다.
  • 소켓을 이용해 데이터를 주고받는다.

1.1. 프로세스 통신 방법 - 네트워크

1.2. 원시적인 프로세스 통신 예시

  • 파일을 공통으로 경유해 메시지를 전달한다.

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.1. 단방향 통신

  • 라디오 신호처럼 한쪽 방향으로만 데이터 전송하는 구조
  • 프로세스간 통신에서의 예: 전역 변수, 파이프

2.1.2. 반양방향 통신(반이중 통신, Half duplex)

2.1.2. 반양방향 통신

  • 특정 시점에 한쪽 방향으로만 전송 가능한 구조
  • 데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능하다.
  • 대표적인 예: 무전기

2.1.3. 양방향 통신(전이중 통신, Full duplex)

2.1.3. 양방향 통신

  • 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조
  • 프로세스간 통신에서의 예: 소켓 통신

2.2. 수신 대기에 따른 분류

2.2.1. 대기 있는 통신

  • 동기화를 지원하는 통신 방식
  • 데이터 받는 쪽은 데이터 도착할 때까지 자동으로 대기 상태에 머물러 있는다.
  • 인터럽트와 비슷함

2.2.2. 대기가 없는 통신

  • 동기화를 지원하지 않는 통신 방식
  • 데이터를 받는 쪽은 바쁜 대기를 사용하여 데이터가 도착했는지 여부를 직접 확인한다.
  • 풀링과 비슷함

3. 통신 방법의 여러 양상들

두 실행 흐름이 있을 때 이들간의 통신에 있어 다양한 방법을 사용할 수 있는데, 통신 방법의 양상들을 Blocking / Non-Blocking 방식과 Synchronous / Asynchronous 방식을 조합하여 크게 4가지로 분류할 수 있다.

3. 통신 방법 양상 통신 방법 양상 정리

통신 방식

  • 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 라이선스를 준수합니다.