프로세스 간 통신(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 방법 | 설명 | 실습 가능성 (Java/Spring) |
|---|---|---|
| 파이프 (Pipe) | 단방향 통신으로 부모-자식 프로세스 간 데이터 전달. | Java에서는 ProcessBuilder를 활용하여 간단한 프로세스 간 데이터 전달 실습. |
| 명명된 파이프 (FIFO) | 이름이 지정된 파이프로, 서로 다른 프로세스 간 통신 가능. | Java에서 java.nio.channels.Pipe로 명명된 파이프와 유사한 방식 실습 가능. |
| 메시지 큐 (Message Queue) | 메시지를 큐에 저장하고 전달하는 방식. 우선순위 설정 가능. | RabbitMQ나 ActiveMQ 같은 메시지 브로커 실습 (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를 활용하여 분산 시스템 환경에서 실습. |
메시지 큐 (Message Queue)
소켓 (Socket)
Socket 클래스를 사용해 채팅 서버를 만들어보세요.세마포어 (Semaphore)
java.util.concurrent.Semaphore를 사용해 다중 스레드에서 임계 구역을 보호.파일 기반 통신
gRPC (Remote Procedure Call)