프로세스 간 통신 (IPC)

2023-12-08
processipc

Intro

프로세스는 각각 독립적으로 실행될 수도, 프로세스끼리 협력하며 실행될 수도 있다. 협력하는 이유는 첫째, 프로세스 간 정보 교환을 위해서다. 같은 정보를 여러 프로세스가 공유하며 유저에게 더 나은 경험을 줄 수 있다. 둘째, 작업을 더 작은 작업으로 쪼개어 병렬적으로 실행해 더 빠르게 작업을 완료하기 위해서다. 셋째, 모듈화를 위해 프로세스를 여러 모듈로 나누어 각각 협력하여 동작하도록 하기 위해서다. 이러한 협력을 위해 필연적인 프로세스 간 통신을 Interprocess Communication (IPC) 이라고 한다.

IPC에는 두 가지 기반 모델이 있다.

  1. Shared Memory
  2. Message Passing

Shared Memory

이름 그대로 통신하는 두 프로세스가 같은 메모리 공간을 활용하여 통신하는 것이다. 이를 위해 두 프로세스는 같은 메모리 공간을 공유할 수 있어야 한다.

장점

단점

특징

Producer - Consumer model

생산자 - 소비자 모델은 협업하는 두 프로세스 간 흔히 사용되는 모델이다. 한 쪽은 정보를 생산하고, 다른 한 쪽은 그 정보를 소비한다.

예시

Buffer

생산자 - 소비자 모델을 구현하는 한 가지 방식 중 하나는 공유 메모리 공간에 버퍼를 두는 것이다. 생산자는 버퍼에 데이터를 쓰고 소비자는 버퍼에서 데이터를 읽는다. 생산되지 않은 데이터를 읽지 않도록 두 프로세스는 동기화 되어야 한다.

버퍼는 unbounded buffer와 bounded buffer로 나뉜다. unbounded buffer를 사용하면 생산자는 계속해서 생산할 수 있고, 소비자는 계속해서 아이템을 대기할 수 있다. 버퍼의 사이즈의 제한이 없어서 unbounded buffer이다. bounded buffer를 사용하면 생산자는 버퍼가 가득 차면 대기하고, 소비자는 버퍼가 비면 대기한다.

Message Passing

메시지 전달 방식은 공유 메모리 공간 없이도 두 프로세스가 통신할 수 있는 메커니즘이다. 따라서 다른 컴퓨터에 위치한 프로세스와 통신할 때 유용하다. 메시지 전달 방식은 send와 receive로 나뉜다.

장점

단점

메시지 크기

메시지의 크기는 고정될 수도 있고, 가변적일 수도 있다.

두 프로세스가 통신하기 전에 논리적인 연결이 있어야 한다. 이를 link라고 한다.

link와 send, receive를 활용하여 다음과 같이 통신할 수 있다.

  1. 직접 통신과 간접 통신

    • 프로세스 간 직접 통신하거나, 메일함 등을 이용해 간접 통신한다.
  2. 동기 통신과 비동기 통신

    • 동기 통신은 상대가 다 받았을 때 작업이 완료된다. 비동기 통신은 일단 보내고 다른 일을 할 수 있다. 반대의 경우도 마찬가지다.
  3. 자동 버퍼링과 명시적 버퍼링

    • 메시지를 저장하는 큐의 용량이 zero거나, 고정이거나, 가변적이다.

Naming

통신을 원하는 프로세스는 서로를 지칭해야 한다. 직접 통신과 간접 통신 각각에서 명명하는 법을 살펴보자.

직접 통신

send()receive()에 프로세스의 이름을 명시해야 한다. 보내는 프로세스는 받는 프로세스를 인자로 넘겨야 하고, 받는 프로세스는 보내는 프로세스를 인자로 넘겨야 한다. 두 프로세스 간 정확히 하나의 link가 생성된다.

Addressing 방법은 다음과 같다.

  1. Symmetry in addressing (대칭적 명명)
    • 통신하려는 두 프로세스가 서로의 이름을 알고 있어야 한다.
    • send(P, message), receive(Q, message)
  2. Asymmetry in addressing (비대칭적 명명)
    • 전송하는 프로세스만 상대 프로세스의 이름을 알고 있으면 된다.
    • send(P, message), receive(id, message)

직접 연결 통신의 단점은 프로세스를 정의할 때 모듈화 정도가 떨어진다는 점이다. 특히 id를 하드코딩하는 것은 간접적으로 명시하는 것에 비해 바람직하지 않은 방법이다.

간접 통신

메일함을 이용한 통신이다. 메일함으로 보내고, 메일함에서 꺼낸다. 메일함은 고유한 id 값을 가지고 있다. 마치 공유 메모리처럼 공유 메일함을 가질 때만 두 프로세스가 통신할 수 있다.

send(A, message), receive(A, message)와 같이 사용한다. 이 때 A는 공유 메일함의 id이다. 두 프로세스가 모두 공유 메일함을 가질 때만 link가 생성된다. 또한 직접 통신에서 두 프로세스가 정확히 하나의 link를 가지는 것과 달리 간접 통신에서는 여러 프로세스와 연결될 수 있다.

메일함의 소유는 프로세스일 수도, OS일 수도 있다.

Blocking and Non-blocking

프로세스 간 통신은 send()receive()로 이루어져 있고, 이를 다음과 같은 메커니즘으로 나눌 수 있다.

  1. Blocking send

    • 메시지를 보내는 프로세스는 메시지를 받는 프로세스가 메시지를 받을 때까지 기다린다.
    • 데이터 전송이 완료되면 제어를 반환한다.
  2. Blocking receive

    • 메시지를 받는 프로세스는 메시지를 받을 때까지 기다린다.
    • 데이터 수신이 완료되면 제어를 반환한다.
  3. Non-blocking send

    • 데이터를 전송한 후 즉시 제어를 반환한다. 데이터가 완전히 수신되지 않아도 다른 작업을 수행한다.
    • 송신 버퍼의 크기가 충분한지 확인하지 않는다.
  4. Non-blocking receive

    • 데이터를 수신하지 않았어도 제어를 반환한다. 데이터가 완전히 송신되지 않아도 다른 작업을 수행한다.

      비차단적 수신은 우편함과 비슷합니다. 가정해 봅시다. 당신은 집에 도착한 우편물을 확인하려고 우편함을 열고 있습니다. 만약 우편물이 이미 도착했다면, 당신은 바로 확인하고 처리할 수 있습니다. 그런데 만약 아직 아무것도 도착하지 않았다면, 당신은 우편함을 계속 열고 다른 작업을 처리할 수 있습니다. 그리고 나중에 우편물이 도착하면 우편함을 다시 확인합니다. - GPT-3.5


Related Posts

os
Virtual Memory
2023/12/25

Virtual Memory

os
Main Memory
2023/12/17

Main Memory

os
Deadlock
2023/12/16

Deadlock

os

병렬, 병행 실행에도 데이터 무결성 보장하기

동기화
2023/12/15

동기화