본문으로 건너뛰기

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 기반이라 다르다.