[OS] IPC(프로세스 간 통신)

안경준·2025년 6월 18일

🎯 Goal

  • IPC가 필요한 이유에 대해 설명할 수 있다.
  • 프로세스가 데이터를 주고 받는 방법에 대해 설명할 수 있다.

⛳ Process

IPC는 왜 필요한가?

이전 공부에서 스레드는 메모리 공간과 자원을 공유하는 반면에 프로세스는 각자 별도의 자원을 할당받는 다는 것을 확인했다. 그렇기에 스레드는 데이터를 공유하는 데 어려움이 없지만 프로세스는 다른 프로세스의 데이터를 공유받기 위해서는 통신이 필요하게 된다. 이를 위해 커널 영역에서 IPC라는 내부 프로세스간 통신(Inter Process Communication)을 제공하게 되고, 프로세스는 커널이 제공하는 IPC 설비를 이용해서 프로세스간 통신을 할 수 있게 된다.

IPC의 종류

공유 메모리(Shared Memory)

  • 공유 메모리가 데이터 자체를 공유하도록 지원하는 설비로 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용
  • 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당한다. 이후 어떤 프로세스건 해당 메모리 영역에 접근할 수 있다.
    • 공유 메모리가 각 프로세스에게 첨부하는 방식으로 작동하게 된다.
  • 프로세스간 Read, Write가 모두 필요할 때 사용한다.
  • 대량의 정보를 다수의 프로세스에게 배포 가능하다.
  • 중개자 없이 메모리에 접근할 수 있기 때문에 모든 IPC 중에서 가장 빠르게 작동할 수 있다.

파이프(Pipe)

  • 통신을 위한 메모리 공간(버퍼)을 생성하여 프로세스가 데이터를 주고 받게 한다.

익명 파이프(Anonymous PIPE)

  • 일반적인 파이프
  • 통신할 프로세스가 명확하게 알 수 있는 경우 사용한다.
    • 부모-자식 or 형제 프로세스 간 통신에 사용
    • 외부 프로세스에서 사용할 수 없다.
  • 파이프는 두개의 프로세스를 연결하고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있다. 단방향으로만 통신이 가능한 파이프의 특징때문에 반이중(Half-Duplex) 통신이라고 부르기도 한다.
  • 송/수신을 모두 하기 위해서는 두 개의 파이프를 만들어야 가능하다.
  • 간단하게 사용할 수 있다.
  • 단점
    • 반이중 통신 == 프로세스가 읽기와 쓰기 통신을 모두 해야한다면, 파이프 두개를 만들어야하므로 구현이 복잡해질 수 있다.
    • 전이중 통신을 고려해야될 상황이라면 낭비가 심하기 때문에 좋은 선택이 아니다.

네임드 파이프(Named PIPE)

  • 전혀 모르는 상태의 프로세스들 사이의 통신에 사용한다.
  • 익명 파이프의 확장된 상태로 부모 프로세스와 무관한 다른 프로세스도 통신이 가능하다.
    • 프로세스 통신을 위해 이름이 있는 파일을 사용하기 때문에 가능
    • FIFO라 불리는 특수 파일을 이용해 서로 관련 없는 프로세스 간 통신에 사용한다.
  • mkfifo or mknod 함수로 생성
  • 단점
    • 반이중 통신 == 전이중 통신을 위해서는 두 개의 파이프를 만들어야 가능하다.

소켓(Socket)

  • Unix 도메인 소켓 또는 IPC 소켓은 동일한 호스트 운영 체제에서 실행되는 프로세스간 데이터를 교환하기 위한 데이터 통신 엔드 포인트다.
  • 네트워크 소켓 통신을 통해 데이터를 공유한다.
    • 데이터 교환을 위해 양쪽 PC에서 각각 임의의 포트를 정하고, 해당 포트 간의 대화를 통해 데이터를 주고받는 방식이다.
    • 이 때 각각 PC의 PORT를 담당하는 소켓은 각각 하나의 프로세스이다.
    • 즉, 해당 프로세스는 임의의 PORT를 맡아 데이터를 송수신 하는 역할을 진행하는 프로세스인 것이다.
    • 각각의 PC에서 프로세스를 통해 타 PC PORT에 연결하라는 명령을 보내게 되면 두 프로세스는 서로 확인과정을 거쳐 연결을 진행하고 연결 후 마치 PIPE와 같이 1:1로 데이터를 주고받는 방식이다.
  • 클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.
  • 전이중(Full Duplex, 양방향) 통신이 가능하다.
  • 서버/클라이언트 환경을 구축하는데 용이하다.
  • 서버(bind, listen, accept), 클라이언트(connect)
  • 중대형 애플리케이션에서 주로 사용한다.

메시지 큐(Message Queue)

  • 입출력 방식은 Named 파이프와 동일하다.
  • 단, 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다. (메모리를 사용한 PIPE)
  • PIPE나 FIFO와 달리 다수의 프로세스간 메시지를 전달할 수 있다.
  • 사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
  • 메시지의 접근을 위해서는 키(key)가 필요하다.

메모리 맵(Memory Map)

  • 공유 메모리처럼 메모리를 공유해준다.
  • 메모리 맵은 열린 파일을 메모리에 매핑시켜서 공유하는 방식이다. (즉, 공유 매개체가 파일 + 메모리)
  • 주로 파일로 대용량 데이터를 공유해야 할 때 사용한다.
  • FILE IO가 느릴 때 사용하면 좋다.
  • 대부분 운영 체제에서는 프로세스를 실행할 때 실행 파일의 각 세그먼트를 메모리에 매핑하기 위해 메모리 맵 파일을 이용한다.
  • 메모리 맵 파일은 파일의 크기를 바꿀 수는 없으며 메모리 맵 파일을 사용하기 이전, 또는 이후에만 파일의 크기를 바꿀 수 있다.

RPC(Remote Procedure Call)

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

정리

IPC 통신에서도 여러 종류가 있고, 각각의 특징에 따라 개발 상황과 목적에 따라 사용해야 효과가 있음을 알 수 있었다. 또한, 스레드와 마찬가지로 프로세스 간 데이터를 동기화하고 보호하기 위해서는 세마포어 또는 뮤텍스를 사용할 수 있다.

📖 Learning Point

  • IPC 통신에서도 개발 상황과 목적에 따라 사용해야하는 방법이 존재함을 알 수 있었다.
  • IPC 통신의 작동 원리 또는 특징에 대해 공부할 수 있었으나, 이후 멀티 프로세스를 구현하는 과정에서 발생할 수 있는 문제를 확인하기 위해서 추가적인 공부가 필요할 것으로 보인다.

Reference
[운영체제] 프로세스(Process)간 통신
[OS] 프로세스 간 통신 방법(Inter Process Communication, IPC)

profile
실력있는 개발자가 되기 위해 매일매일 성장하고 있습니다!

0개의 댓글