프로세스 간 통신(IPC) 방법에는 어떤 것들이 있나요?

김상욱·2024년 11월 30일
0

프로세스 간 통신(IPC) 방법에는 어떤 것들이 있나요?

프로세스 간 통신(Inter-process Communication, IPC)은 운영체제에서 서로 다른 프로세스들이 데이터를 주고받거나 자원을 공유하기 위해 사용하는 메커니즘.

파이프(Pipe)
단방향 통신 방식으로, 한 프로세스는 쓰기만하고, 다른 프로세스는 읽기만 가능.
익명 파이프는 부모-자식 프로세스 간의 통신에 사용된다.
명명된 파이프(Named Pipe, FIFO)는 서로 다른 프로세스 간의 통신을 지원하며 파일 시스템에 이름을 부여하여 프로세스 간 공유 가능하다.

메시지 큐(Message Queue) : 메시지를 큐에 저장하고 다른 프로세스가 읽어 가는 방식. 커널 공간에 존재하며, FIFO 방식으로 동작. 메시지의 우선순위를 지정할 수 있음.
: 커널은 하드웨어와 소프트웨어 간의 중재자 역할을 하는 운영체제의 핵심 부분이며 메모리는 크게 두가지로 나뉘는데 이것이 유저 공간과 커널 공간이다. 유저 공간은 일반 응용 프로그램이 실행되는 영역이며 커널 공간은 운영체제가 하드웨어 자원(CPU, 메모리, 디스크 등)을 관리하고 시스템 호출을 처리하는 영역이다.
여러 프로세스 간 동시 통신이 가능하지만 메시지 크기에 제한이 있다.

공유 메모리 : 여러 프로세스가 동일한 메모리 영역을 공유하며 가장 빠른 IPC 방식 중 하나이다. 사용자 공간에서 작업이 수행되기 때문에 커널 오버헤드가 적으며 동기화 문제를 해결하기 위해 추가적인 기법이 필요하다.(세마포어)
: 커널 오버헤드는 운영체제가 커널 공간에서 작업을 수행하는데 걸리는 추가적인 비용이다. 사용자 공간에서 직접 수행하는 것보다 더 많은 시간이나 자원이 소모될 수 있다. 그 이유는 다음과 같다.

  • 컨텍스트 스위칭 : 유저 공간에서 커널 공간으로 전환하거나 그 반대로 전환할 때 발생하는 작업 비용.
  • 시스템 호출 : 유저 공간에서 커널 공간의 기능을 요청할 때 발생하는 비용
  • 커널 공간에서 메모리 할당, 해제, 접근 제어 등의 작업을 수행할 때 발생하는 비용
  • 파일 읽기/쓰기, 네트워크 요청 등 커널이 처리해야 할 작업에서 발생
    그럼 왜 이런 커널 공간에서의 작업이 더 비용이 들까? 그 이유는 다음과 같다.
    : 커널 공간은 보호된 메모리 영역으로 유저 공간에서 직접 접근할 수 없다. 그렇기 때문에 이 공간에 접근하려면 시스템 호출을 통해야 하고 이것이 비용을 발생시킨다. 시스템 호출자체는 항상 안전성을 보장하기 위해 매개변수 검증과 같은 작업을 수행하기 때문에 시간이 훨씬 걸린다. 또한 하드웨어와 시스템 호출이 직접상호작용하기 때문에 복잡하고 시간이 오래걸린다.

소켓(Socket)
네트워크를 통한 프로세스 간 통신으로 동일한 호스트 내에서도 사용할 수 있다. 로컬뿐만 아니라 원격 프로세스 간에 통신이 가능하고 TCP/IP, UDP 등 다양한 프로토콜을 지원한다. 그렇기에 분산 시스템, 네트워크 기반 애플리케이션에 사용된다.
여기서 동일한 호스트란 동일한 물리적 컴퓨터(또는 가상머신)내에서 실행되는 프로세스 간의 통신. 네트워크를 통해 통신할 필요 없이 같은 시스템 내에서 소켓이나 메모리를 공유.

세마포어(Semaphore)
주로 프로세스 간 동기화를 위해 사용되며 공유 자원 접근을 제어하는 카운터 기반 메커니즘이다. 데드락 방지를 위한 제어 기능이 있으며 단순 데이터 전달에는 적합하지 않다.
세마포어는 일반적으로 정수 값을 가지며, 이 값을 통해 자원의 상태를 표현한다. 0이하의 값은 자원이 사용 중이거나 대기 상태이며 양수 값은 자원이 사용 가능한 상태이다.
P(S) {Proberen, 시도하다} 또는 Wait(S) : 세마포어의 값을 감소시키는 연산으로 자원이 사용한 가능한 경우(S>0)에는 값을 감소시키고 사용을 허용하고 S<=0인 경우에는 대기 상태로 진입한다.
V(S) {Verhogen, 증가하다} 또는 Signal(S)의 경우, 세마포어의 값을 증가시키는 연산으로 대기 중인 프로세스가 있으면, 자원을 할당하고 대기 상태를 해제시킨다.
세마포어에는 두가지 종류가 있다.
Counting Semaphore - 정수 값을 가지며 자원이 여러 개일 때 사용한다. ex) 3개의 프린터를 여러 프로세스가 공유할 때, 세마포어 값은 3으로 시작하고 각 프로세스가 프린터를 사용할 때마다 감소
Binary Semaphore - 0 또는 1의 값만 가짐. 하나의 자원을 보호할 때 사용하며 뮤텍스와 유사하지만, 세마포어는 여러 프로세스가 제어할 수 있다는 점이 다름.

시그널(Signal)
프로세스 간 이벤트 알림을 위한 메커니즘. 간단한 메시지나 상태 전달에 적합. 복잡한 데이터 전달에는 적합하지 않음

메모리 맵 파일(Memory-Mapped File)
파일 내용을 메모리에 매핑하여 공유. 프로세스 간 메모리를 통해 파일에 접근 가능. 대용량 파일 처리에 유용하며 속도가 빠르지만 동기화 문제가 발생할 수 있음.

RPC(Remote Procedure Call)
프로세스가 다른 프로세스(로컬/원격)의 함수를 호출하는 방식. 네트워크 투명성을 제공하며 분산 시스템 구현에 사용된다.

파일 기반 통신
프로세스 간 파일을 생성하고 읽고 쓰는 방식으로 데이터 교환을 한다. 구현이 단순하지만 파일 입출력 속도가 상대적으로 느리다.


IPC 방법과 실습 가능성

아래는 주요 IPC 방법과 신입 백엔드 개발자가 실습해볼 수 있는 방식을 정리한 표입니다:

IPC 방법설명실습 가능성 (Java/Spring)
파이프 (Pipe)단방향 통신으로 부모-자식 프로세스 간 데이터 전달.Java에서는 ProcessBuilder를 활용하여 간단한 프로세스 간 데이터 전달 실습.
명명된 파이프 (FIFO)이름이 지정된 파이프로, 서로 다른 프로세스 간 통신 가능.Java에서 java.nio.channels.Pipe로 명명된 파이프와 유사한 방식 실습 가능.
메시지 큐 (Message Queue)메시지를 큐에 저장하고 전달하는 방식. 우선순위 설정 가능.RabbitMQActiveMQ 같은 메시지 브로커 실습 (Spring과 통합).
공유 메모리 (Shared Memory)동일 메모리 영역을 여러 프로세스가 공유.Java에서는 직접 지원하지 않지만, Redis 등으로 비슷한 효과 실습 가능.
소켓 (Socket)네트워크 기반 양방향 통신. TCP/UDP 프로토콜 지원.Java Socket API로 서버-클라이언트 구현 실습.
세마포어 (Semaphore)공유 자원 접근 동기화.Java의 java.util.concurrent.Semaphore로 동기화 실습.
시그널 (Signal)프로세스 간 이벤트 알림.Java는 직접 지원하지 않으나 Runtime 객체로 유사한 실습 가능.
파일 기반 통신파일을 생성/읽기/쓰기로 프로세스 간 데이터 전달.Java의 File 또는 RandomAccessFile로 실습 가능.
RPC (Remote Procedure Call)원격 프로세스의 함수를 호출하는 방식.gRPC를 활용하여 분산 시스템 환경에서 실습.

백엔드 개발자 입장에서 추천하는 실습

  1. 메시지 큐 (Message Queue)

    • RabbitMQKafka와 같은 메시지 브로커를 사용해보세요.
    • 실습 내용:
      • Spring Boot를 사용하여 ProducerConsumer 간 메시지 송수신 구현.
      • 예: 주문 생성 메시지를 Queue에 넣고, 소비자가 이를 처리.
  2. 소켓 (Socket)

    • Java의 Socket 클래스를 사용해 채팅 서버를 만들어보세요.
    • 실습 내용:
      • TCP를 사용해 클라이언트와 서버 간 양방향 통신.
      • WebSocket으로 확장하여 실시간 통신 구현.
  3. 세마포어 (Semaphore)

    • 공유 자원 접근 제어를 연습해보세요.
    • 실습 내용:
      • java.util.concurrent.Semaphore를 사용해 다중 스레드에서 임계 구역을 보호.
      • 예: 최대 3개의 스레드만 동시에 데이터베이스 접근 허용.
  4. 파일 기반 통신

    • 두 Java 프로그램이 동일한 파일을 읽고 쓰며 데이터를 주고받는 구조 구현.
    • 실습 내용:
      • 하나의 프로그램이 데이터를 파일에 기록, 다른 프로그램이 이를 읽음.
  5. gRPC (Remote Procedure Call)

    • 원격 프로세스 호출을 통해 마이크로서비스 환경에 익숙해질 수 있습니다.
    • 실습 내용:
      • Spring Boot에서 gRPC 서버와 클라이언트를 구현.
      • 예: 계산기 서비스 구현(두 숫자의 합을 gRPC로 요청/응답).

실습의 장점

  • 현업 백엔드 기술과 연계: 메시지 큐, gRPC, WebSocket 등은 현업에서 자주 사용됩니다.
  • 멀티스레드와 동시성 이해: 세마포어나 공유 메모리 방식 실습은 동시성 제어 학습에 도움.
  • 네트워크 기본기: 소켓 통신은 네트워크 기반 애플리케이션의 기본 개념을 익히는 데 효과적.

실습을 위한 도구 추천

  1. RabbitMQ/ActiveMQ: 메시지 큐 실습.
  2. Redis: 간단한 공유 메모리 대체.
  3. gRPC: 분산 환경 RPC 실습.
  4. Netty: Java 기반 고성능 네트워크 통신 프레임워크.
  5. Postman: API와 네트워크 요청 테스트.

마무리

  • 백엔드 개발자로서, 메시지 큐, 소켓 통신, gRPC 같은 실습을 통해 실무와 연결된 IPC 방식의 이해도를 높이는 것이 중요합니다.
  • Java와 Spring을 활용해 실습하면 IPC 개념을 현업 기술 스택과 자연스럽게 연결할 수 있습니다.

0개의 댓글