Skip to content

IPC(Inter Process Communication)



프로세스는 기본적으로 서로 독립된 가상 주소 공간을 가진다. 따라서 다른 프로세스의 메모리에 직접 접근할 수 없고, 운영체제가 제공하는 메커니즘을 통해 데이터를 주고받아야 한다. 이를 IPC라고 한다.

IPC는 크게 "커널이 중간에서 데이터를 전달하는 방식"과 "같은 메모리 영역을 함께 보게 만드는 방식"으로 나눠 생각할 수 있다.


IPC 종류

  1. 익명 파이프(Anonymous Pipe)

    커널이 제공하는 단방향 바이트 스트림이다.

    보통 fork() 이후 부모-자식처럼 관계가 있는 프로세스 사이에서 많이 사용한다.

    양방향 통신이 필요하면 일반적으로 파이프 2개를 만들거나 socketpair() 같은 다른 수단을 사용한다.


  2. Named Pipe(FIFO)

    파일 시스템의 경로 이름을 가진 파이프다.

    서로 관계가 없는 프로세스도 같은 FIFO 파일을 열어 통신할 수 있다.

    동작 특성은 익명 파이프와 비슷한 바이트 스트림이며, 전이중 통신을 하려면 보통 두 개가 필요하다.


  3. 메시지 큐(Message Queue)

    커널이 관리하는 메시지 단위의 큐다.

    파이프와 달리 메시지 경계가 보존된다. 즉, 단순한 바이트 스트림이 아니라 "메시지"를 기준으로 송수신한다.

    구현에 따라 메시지 타입이나 우선순위를 지원하기도 한다.


  4. 공유 메모리(Shared Memory)

    여러 프로세스가 같은 물리 메모리 페이지를 각자의 주소 공간에 매핑해서 직접 읽고 쓰는 방식이다.

    중간 복사 비용이 적어서 IPC 중 매우 빠른 편이다.

    다만 동시에 접근하면 데이터가 깨질 수 있으므로, 세마포어·뮤텍스·원자 연산 같은 동기화 기법을 함께 써야 한다.


  5. 메모리 매핑(Memory Mapped File, mmap)

    파일이나 익명 메모리 객체를 프로세스의 주소 공간에 매핑하는 방식이다.

    MAP_SHARED 같은 공유 매핑을 사용하면 여러 프로세스가 같은 내용을 볼 수 있고, 파일 기반 매핑은 대용량 데이터를 효율적으로 다룰 때 유용하다.

    단, 메모리 매핑이 항상 공유 메모리와 같은 뜻은 아니다. private mapping이면 copy-on-write로 동작할 수 있다.


  6. 소켓(Socket)

    양방향 통신이 가능한 IPC 수단이다.

    같은 머신 내부에서는 Unix domain socket을, 네트워크를 건너는 경우에는 TCP/UDP socket을 주로 사용한다.

    즉, 소켓은 원격 통신뿐 아니라 로컬 IPC에도 많이 쓰인다.


동기화와 IPC

IPC를 쓴다고 해서 항상 별도 동기화가 필요한 것은 아니다.

  • 파이프, 메시지 큐, 소켓은 커널이 내부 자료 구조를 관리하므로 기본적인 전달 자체는 안전하다.
  • 공유 메모리는 여러 실행 흐름이 같은 데이터를 직접 다루므로 별도의 동기화가 거의 항상 필요하다.

즉, "IPC"와 "동기화"는 관련은 있지만 같은 개념은 아니다.