시작은 미미하나 끝은 쥬쥬하리라.

CS/System

[System Programming] 프로세스 간 통신 - IPC의 개요와 종류

코딩뚜벅이 2023. 6. 11. 18:18

프로세스 간 통신 IPC의 개요와 종류

  • IPC 개요
  • IPC 표준
  • IPC 종류
  • PIPE
  • named PIPE
  • Shared Memory
  • Memory Map
  • Socket
  • Message Queue
  • IPC 정리
  • 기타 IPC 개념

IPC 개요

프로세스 간의 통신이 이루어지는 것을 IPC라고 한다. 기본적으로 하나의 프로세스는 독립적으로 존재하여 타 프로세스에 직접적인 접근이 불가능하지만, 운영체제의 커널이 IPC(Inter Process Communication)를 제공하여 각 프로세스들이 동시에 접근 가능한 메모리 즉, 프로세스들이 공유 가능한 메모리 영역을 통해 데이터를 주고 받을 수 있게 제공하고 있다. 각 프로세스들은 IPC를 이용하여 통신을 할 수 있다.

리눅스의 커널 구조 (참조 : https://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch08_IPC)


 

IPC 표준

  • System V IPC

System V IPC는 AT&T에서 출시하였으며 출시 된지 오래된 IPC 모델이다. 긴 역사를 가진만큼 이기종간 코드의 호환성을 보장해 주지만, API가 연식이 있고 함수명도 명확하지 않다는 단점이 있다.

 

  • POSIX IPC

POSIX IPC는 비교적 최근에 출시된 IPC 모델로 IEEE에서 제정하였다. 직관적인 API로 구성되어 있어서, 상대적으로 System V보다 사용하기 쉽다고 알려져 있다.


IPC 종류

본 글에서 소개할 IPC의 종류는 다음과 같다.

  • PIPE
  • Named PIPE
  • Shared Memory
  • Memory Map
  • Socket
  • Message Queue

1. PIPE

  • Anonymous PIPE(익명 파이프)라고도 한다.
  • 부모-자식(혹은 형제 간) 프로세스 간 통신에 사용된다. 
  • 외부 프로세스에서 사용할 수 없다.
  • FIFO(선입선출) 구조로 이루어져있다.
  • 두 개의 프로세스를 파이프가 연결하여, 하나의 프로세스는 데이터를 쓰거나 읽기만 가능하다.
  • 한쪽 방향으로만 통신하는 특성 때문에 반이증 통신이라고도 한다.
  • 양쪽 프로세스 모두 송/수신을 하려면 두 개의 파이프를 생성해야 한다.
  • Read와 Write는 기본적으로 Block 모드로 작동하기 때문에 프로세스의 Read가 마무리되기 이전에 Write 할 수 없다.
  • 하나의 프로세스로 송/수신 기능을 구현하려면 두 개의 파이프를 생성해야 하므로 구현이 복잡해질 수 있다.
  • 전이중 통신을 고려해야하는 상황이라면 낭비가 심하다.
  • PIPE 함수를 통해서 생성한다.

 


2. Named PIPE

  • 이름(Name)을 가진 파이프를 통해서 프로세스 간 양방향 통신을 지원한다.
  • 기본적으로는 단방향 통신을 사용하며, 양방향 통신을 위해서는 O_RDWR 모드로 열어야 한다.
  • 프로세스들은 파이프의 이름을 알면 타 프로세스와 통신을 할 수 있다.(외부 프로세스와 통신이 가능하다.)
  • FIFO(선입선출) 구조로 이루어져있다.
  • 두 개의 프로세스를 파이프가 연결하여, 하나의 프로세스는 데이터를 쓰거나 읽기만 가능하다.
  • 한쪽 방향으로만 통신하는 특성 때문에 반이증 통신이라고도 한다.
  • 양쪽 프로세스 모두 송/수신을 하려면 두 개의 파이프를 생성해야 한다.
  • Read와 Write는 기본적으로 Block 모드로 작동하기 때문에 프로세스의 Read가 마무리되기 이전에 Write 할 수 없다.
  • 하나의 프로세스로 송/수신 기능을 구현하려면 두 개의 파이프를 생성해야 하므로 구현이 복잡해질 수 있다.
  • 전이중 통신을 고려해야하는 상황이라면 낭비가 심하다.
  • mkfifo 혹은 mknod 함수로 생성한다.

3. Shared Memory

  • 시스템 상의 공유 메모리를 통해서 통신한다.
  • 일정한 크기의 메모리를 프로세스들 간에 공유하는 구조로 이루어져있다.
  • 공유 메모리는 커널에서 관리한다.
  • 프로세스가 공유 메모리의 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당하고 이후 타 프로세스들은 해당 메모리 영역에 접근할 수 있다.
  • 공유 메모리가 각 프로세스에게 첨부(attach)하는 방식으로 작동한다.
  • 프로세스 간 Read / Write 기능 모두를 필요로 하는 경우 사용한다.
  • 사용을 위해서는 프로세스 간 메모리의 크기가 동일해야 한다.
  • 대량의 정보를 다수의 프로세스에게 배포할 수 있다.
  • 중계자 없이 바로 메모리에 접근이 가능하기 때문에 모든 IPC 중에서 가장 빠르게 작동한다.

4. Memory Map

  • Shared Memory와 같이 메모리를 공유하는 방식이다.
  • 열린 파일을 메모리에 맵핑 시켜서 공유하는 방식이다.(따라서 공유 매개체는 파일 + 메모리이다.)
  • Memory Map 파일을 사용하면 디스크의 파일의 블록들과 프로세스의 페이지가 연결된다. 이 상태에서는 가상 메모리에 사상되어 있을 뿐이며, 실제 메모리에 파일을 불러오는 시기는 해당 주소에 읽거나 쓰기 작업을 시도하는 경우에 이루어진다. 이 작업은 운영 체제에서 가상 메모리를 다루는데 사용되는 페이징 기밥과 같이 페이지 부재를 일으키는 방식을 이용한다. 일반적으로 파일에서 불러오는 자료는 페이지 크기와 같은 4KiB이지만, 몇몇 운영 체제에서는 하드디스크의 낮은 임의 접근 시간을 고려해 4KiB보다 많은 자료를 페이지로 올릴 수 있다.
  • Memory Map 파일로 작접 중인 데이터가 실제 파일로 바로 반영되지는 않으며 페이지 교체 알고리즘에 따라 해당 페이지가 메모리에서 내려갈 경우 또는 Memory Map 파일을 닫는 과정에서 반영된다. 이것은 Memory Map 파일과 파일 입출력 API를 동시에 사용할 때 문제가 되는데, 파일을 통해 변경된 자료는 즉시 반영되지 않으므로 그 지점에 해당하는 자료를 파일 입출력 API를 사용하여 읽어오려는 경우 동기화 문제가 발생한다. 따라서 Memory Map 파일을 사용할 때에는 읽기 전용으로만 사용하는 것을 제외하고 파일 입출력 API를 사용하지 않는 것이 좋다.
  • 주로 파일로 대용량 데이터를 공유해야하는 경우에 사용한다.(파일의 I/O가 느린 경우 사용하면 효율적이다.)
  • 대다수의 운영 체제에서 프로세스를 실행할 때, 실행 파일의 각 세그먼트를 메모리에 사상하기 위해 Memory Map 파일을 사용한다.
  • Write 시기는 프로세스의 페이지가 메모리에서 내려갈 때 Wirte 된다.(메모리와 file sync가 맞지 않을 수 있다.)
  • Memory Map 파일은 파일의 크기를 바꿀 수 없으며, 파일을 사용하기 이전 / 이후에만 파일의 크기를 변경할 수 있다.

5. Socket

  • Unix 도메인 소켓 또는 IPC 소켓은 동일한 호스트 운영 체제에서 실행되는 프로세스간 데이터를 교환하기 위한 데이터 통신 엔드포인트이다.
  • Socket은 네트워크 소켕 통신을 통해서 데이터를 공유한다.
  • 데이터의 교환을 위해서 양쪽 PC에서 각각 임의의 포트를 정하고 해당 포트 간 대화를 ㅌ오해 데이터를 주고받는 방식이다. 이때, 각각 PC의 포트를 담당하는 소켓은 프로세스이다. 해당 프로세스는 임의의 포트를 통해서 데이터의 송수신 하는 역할을 담당하는 프로세스이다. PC에서 프로세스를 통해 다른 PC의 포트에 연결하라는 명령을 보내주면 두 프로세스는 확인 과정을 거쳐 연결 후 마치 PIPE 방식과 같이 1:1로 데이터를 주고 받는다.
  • 클라이언트와 서버가 소켓을 통해서 통신하는 고조로 원격에서 프로세스 간 데이터를 공유할 때 사용된다.
  • 전이중 통신이 가능하다.
  • 서버/클라이언트 환경을 구축하는데 용이하다.
  • 중대형 어플리케이션에서 주로 사용된다.
  • 데이터 세그먼트의 처리에 유의해야한다.

6. Message Queue

  • 메모리를 사용하는 PIPE 방식이다.
  • 구조체를 기반으로 통신하며 MsgType에 따라 다른 구조체를 가져올 수 있다.
  • FIFO(선입선출) 구조로 이루어져있다.
  • 입출력 방식은 Named PIPE 방식과 동일하지만, Message Queue는 파이프와 같은 데이터의 흐름이 아닌 메모리 공간이다. 또한, 다수의 프로세스 간 메시지를 전달할 수 있다.
  • 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다루기 용이하다.
  • 메시지의 접근을 위해서는 키가 필요하다.
  • 커널에서 제공하기 때문에 EnQueue하는데 제한이 있다.

 

7. IPC 정리


8. 기타 IPC 개념

* Semaphore

  • 세마포어는 프로세스간 데이터를 동기화하고 보호하는데 목적을 둔다.
  • 공유된 자원에 여러개의 프로세스가 동시에 접근하지 못하고, 한 번에 하나의 프로세스만 접근 가능하도록 하고 싶을 때 사용된다.
  • 비슷한 목적을 위해서 'Mutex' 방식도 사용한다.

 

* RPC

  • 분산 네트워크 망에서 많이 사용되는 방식이다.
  • 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저(루틴, 서브루틴, 함수와 같은 의미, 하나의 프로시저는 특정 작업을 수행하기 위한 프로그램의 일부 혹은 일련의 작업 순서)를 실행할 수 있게하는 프로세스간 통신 기술이다. 즉, 원격 프로시저 호출을 이용하면 프로그래머는 함수가 실행 프로그램에 로컬 위치 혹은 원격 위치 등 위치에 구애 받지 않고 동일한 코드를 이용할 수 있다.
  • RPC는 분리된 PC에 저장된 데이터를 마치 내 PC에 존재하는 것처럼 데이터를 가져와 사용하는 통신 방법이다.( = 스텁(Stub) : 자신의 디스크에 존재하는 것처럼 착각을 일으키는 방식, 리눅스의 공유 라이브러리 중 하나)