Featured image of post 프로세스 간 통신 (IPC)

프로세스 간 통신 (IPC)

프로세스 간에 통신하는 방법들에 대하여 (Shared Memory, Message Passing, Ordinary Pipe, Named Pipe, Socket, RPC)

프로세스 간 통신

운영체제에서 프로세스란 실행 중인 프로그램을 의미한다. 이 프로세스는 independent 할 수도 있고 cooperative 할 수도 있다. 이 중 cooperative 프로세스가 서로 데이터를 교환하거나 정보를 주고받는 방식을 프로세스 간 통신(IPC, Interprocess Communication)이라고 한다. 운영체제는 정보 공유, 계산 속도 향상, 모듈성을 위해 IPC를 지원한다.

IPC는 기본적으로 공유 메모리, 메시지 전달 방식의 두 모델이 있다.

(a)Shared Memory, (b)Message Passing

공유 메모리

공유 메모리(Shared Memory) 방식은 프로세스 간 통신을 위해 메모리의 특정 영역을 공유하는 방식이다. 프로세스들이 공통의 메모리 영역을 읽고 쓰면서 데이터를 교환한다.

  • 장점: 시스템 호출(System call)이 거의 필요 없어서 매우 빠르다.
  • 단점: 프로세스 간 데이터 접근 충돌 문제가 발생할 수 있어 이를 방지하기 위한 동기화가 필요하다.

공유 메모리는 특히 많은 데이터를 빠르게 교환할 때 효과적이다.

공유 메모리 방식의 생산자-소비자 문제

공유 메모리를 사용하면 생산자-소비자 문제를 고려해야 한다. 생산자는 데이터를 생성해 공유 메모리에 놓고, 소비자는 이 데이터를 꺼내어 처리한다.

이때 생산자와 소비자가 동기화되지 않으면 다음과 같은 문제가 발생한다.

  • 소비자가 아직 생산되지 않은 데이터를 읽으려 함
  • 생산자가 가득 찬 버퍼에 데이터를 넣으려 함

이를 방지하기 위해 세마포어 등 동기화 메커니즘을 사용하여 생산자와 소비자 간 작업이 원활히 진행되도록 관리해야 한다.


메시지 전달

메시지 전달(Message Passing) 방식은 프로세스 간에 데이터를 메시지 형태로 전달하여 통신하는 방식이다.

  • 장점: 데이터 접근 충돌 문제가 없어 관리가 쉽고 간단하며, 분산 시스템에서 구현이 용이하다.
  • 단점: 메시지를 주고받을 때마다 커널의 시스템 호출이 필요해 오버헤드가 크고, 속도가 느릴 수 있다.

메시지 전달 방식은 소규모 데이터나 명확한 메시지 전달이 필요한 상황에서 적합하다.

메시지 전달 시스템의 종류

서로를 가리킬 방법에 따라 직접 혹은 간접으로 나눌 수 있다.

  • 직접 통신: 프로세스가 메시지를 주고받을 상대 프로세스를 직접 지정한다.
  • 간접 통신: 메시지를 메일박스(또는 포트)를 통해 전달한다. 프로세스들은 공유된 메일박스를 통해 통신한다.

혹은 블락킹 여부로 나눌 수 있다.

  • 동기식: 메시지를 보내거나 받을 때 상대 프로세스가 준비될 때까지 대기(Blocking)한다.
  • 비동기식: 메시지를 보내거나 받을 때 상대 프로세스가 준비되지 않았더라도 바로 다음 작업을 진행(Non-blocking)한다.

파이프를 통한 IPC

파이프(Pipes)는 메세지 패싱의 한 예시로, 데이터를 한 방향으로 흘려보내는 통로이다.

일반 파이프

일반 파이프(Ordinary Pipe)는 주로 부모와 자식 프로세스 간의 단방향 통신에 사용된다.

  • 단방향으로만 데이터를 전달한다. (양방향 통신 시 두 개의 파이프 필요)
  • 프로세스 간에 반드시 부모-자식 관계가 있어야 한다.
  • 같은 시스템 내부에서만 통신 가능하다.

예를 들어, ls | more 명령어는 ls의 출력을 more의 입력으로 전달하는 파이프를 사용한다.

지명 파이프

지명 파이프(Named Pipe)는 파일 시스템에 이름을 가진 형태로 존재해, 부모-자식 관계 없이 서로 다른 프로세스 간 통신에 사용할 수 있다.

  • 파일 시스템에서 이름을 가지고 존재한다.
  • 프로세스가 종료되어도 지명 파이프는 계속 유지된다.
  • 같은 시스템 내부 또는 네트워크를 통해 서로 다른 시스템 간에도 통신 가능하다.

클라이언트-서버 시스템의 IPC

클라이언트-서버 통신에서는 일반적으로 소켓과 원격 프로시저 호출(Remote Procedure Call, RPC)을 사용한다.

소켓

소켓(Socket)은 네트워크를 통해 서로 다른 시스템의 프로세스들이 통신할 때 사용되는 End Point다. 소켓은 IP 주소와 포트 번호를 이용하여 식별된다. 웹 서버(HTTP), FTP 서버 등의 통신에 널리 사용된다.

원격 프로시저 호출

RPC는 네트워크상 다른 시스템에 존재하는 프로세스의 함수를 마치 자신의 로컬 함수처럼 호출할 수 있게 한다.

RPC는 내부적으로 매개변수를 변환하는 마샬링(Marshalling)을 수행한다. 또한 복잡한 네트워크 통신을 추상화하여 프로그래머에게 편리한 인터페이스를 제공한다. RPC를 사용하는 예시로는 Android의 Binder가 있다.