본문으로 건너뛰기

IPC(Inter Process Communication)

March 26, 2026

IPC(Inter Process Communication)

개념

기본적으로 프로세스는 다른 프로세스와 자원을 공유하지 않는다.

하지만 프로세스 간의 통신을 해야하는 상황(프로세스간 자원을 넘겨주는 것이 효율적일 때)이 있을 때, 이를 가능하도록 해주는 것이 IPC 통신이다.

예를들어 ps aux | grep nginx 와 같이 파이프를 사용한다고 했을 때, ps 프로세스와 grep 프로세스가 동시에 생기는데, ps의 출력이 커널이 만들어준 파이프롤 통해 grep의 입력으로 넘어가는데 이 때 IPC를 사용해서 넘겨주는 것이다.

종류

  1. 익명 PIPE(Anonymous Pipe)
    • 쉘에서 ps aux | grep nginx 할 때 쓰이는 그것이다. 부모-자식 프로세스 간에만 사용가능하고, 한쪽이 쓰면 다른쪽이 읽는 단방향 통신이다.
    • 양방향이 필요하면 파이프를 두 개 만들어야 하며, 명령이 끝나면 삭제된다.
  2. Named PIPE(FIFO)
    • mkfifo /tmp/mypipe로 파일 시스템에 실제 파일을 만들어서 통신하는 파이프이다. 익명 파이프와 달리 부모-자식 관계가 아닌 아무 프로세스끼리도 그 파일 경로만 알면 통신할 수 있다.
    • 터미널 두 개 열어서 한쪽에서 echo "hello" > /tmp/mypipe, 다른 쪽에서 cat /tmp/mypipe 하면 바로 확인할 수 있으며, 여전히 단방향이다.
      • 위 과정을 진행하면 echo "hello" > /tmp/mypipe를 입력한 터미널은 대기하고 다른 터미널에서 cat /tmp/mypipe를 입력하면 다른 터미널에서 소비됨과 동시에 입력한 터미널에서 대기가 풀린다.
    • 그렇다고 일반 파일과는 조금 다른게 mkfifo 명령어로 생성하며, 파일 시스템에는 "이름"만 존재하고 내용이 디스크에 저장되지 않는다. 읽고 쓰면 커널 버퍼 통해 바로 전달된다. 그리고 데이터는 소비되면 사라진다.
  3. Message Queue
    • 프로세스 A가 메시지를 큐에넣으면 프로세스 B가 나중에 꺼내 읽는것이다.
    • 파이프와 다른 점은 메시지에 타입을 붙일 수 있어서 원하는 타입의 메시지만 골라서 읽을 수 있다는 것이다.
    • Named PIPE는 스트림 기반 통신, 메시지큐는 메시지 기반 통신이다. 즉, 보내는 쪽과 받는 쪽이 동시에 연결되어 있지 않아도 된다.
    • 위 설명을 보면 떠오르겠지만, Kafka, Redis Streams의 원조격이라고 보면 된다.
  4. 공유 메모리(Shared Memory)
    • 커널이 특정 메모리 영역을 여러 프로세스가 함께 접근할 수 있게 열어주는 방식이다.
    • IPC 중에 가장 빠르다. (데이터를 복사하는게 아니라 같은 메모리를 읽고 쓰는 것이기 때문)
    • 다만, DB에 락을 걸듯이 동시에 같은 메모리 영역을 여러 프로세스가 사용하면 문제가 생길 수 있어서 세마포어 같은 동기화 메커니즘을 반드시 함께 써야한다.
  5. 메모리 맵(mmap)
    • 파일을 메모리에 매핑해서 파일을 읽고 쓰는 대신 메모리를 읽고 쓰듯이 접근하는 방식이다.
    • 여러 프로세스가 같은 파일을 mmap하면 결과적으로 공유 메모리처럼 동작한다.
    • 공유 메모리와 다른점은 파일이 기반이라 프로세스가 죽어도 데이터가 디스크에 남을 수 있다는 점이다.
    • 대용량 파일을 처리할 때 전체를 RAM에 올리지 않고도 필요한 부분만 접근할 수 있어서 효율적이다.
  6. 소켓
    • 유일하게 같은 머신뿐 아니라 다른 머신 간 통신도 가능한 IPC이다.
    • 같은 머신 내엣어는 유닉스 도메인 소켓(/var/run/docker.sock 같은 것)을 쓰고, 다른 머신 간에는 TCP/UDP 소켓을 쓴다.
    • 양방향 통신이 기본이고, 가장 범용적이라 현실에서 가장 많이 쓰인다.
    • 실시간 게임, DB 클라이언트 - 서버 통신이 모두 소켓 기반이다.
    • cf) 게임 통신은 이 소켓이 맞지만, 우베 소켓은 HTTP 기반이라 다르다.