IPC(Inter-Process Communication)는 왜 필요하고 어떤 방식이 있나요?
답변 포인트
프로세스 간 데이터 교환 방식를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
프로세스는 기본적으로 메모리를 공유하지 않으므로 데이터를 주고받기 위해 IPC가 필요합니다. 파이프, 메시지 큐, 공유 메모리, 소켓 등이 있습니다.
IPC는 서로 다른 프로세스가 데이터를 주고받거나 실행 순서를 맞추기 위한 메커니즘입니다. 프로세스는 기본적으로 독립된 주소 공간을 가지므로 한 프로세스의 메모리를 다른 프로세스가 직접 읽을 수 없습니다. 이 격리는 안정성과 보안에는 좋지만, 협업을 위해서는 명시적인 통신 수단이 필요합니다.
IPC가 필요한 상황
- 웹 서버 프로세스가 워커 프로세스에게 작업을 전달합니다.
- 쉘에서
cat file | grep error처럼 프로세스 출력을 다음 프로세스 입력으로 연결합니다. - 브라우저가 렌더러 프로세스와 네트워크 프로세스를 분리하고 메시지를 주고받습니다.
- 여러 프로세스가 같은 캐시나 공유 상태에 접근해야 합니다.
대표 방식
Pipe / Named Pipe
단방향 바이트 스트림입니다. 부모-자식 프로세스 또는 이름 있는 FIFO를 통해 간단한 데이터 흐름을 만들 수 있습니다.
ps aux | grep nginx | awk '{print $2}'쉘 파이프도 IPC의 대표 예입니다.
Signal
작은 이벤트 알림에 적합합니다. 예를 들어 SIGTERM은 정상 종료 요청, SIGHUP은 설정 재로드에 자주 사용됩니다. 데이터 전달보다는 “무슨 일이 발생했다”는 신호에 가깝습니다.
Socket
동일 호스트 또는 네트워크 너머의 프로세스와 통신할 수 있습니다. Unix Domain Socket은 같은 머신에서 TCP보다 가볍게 사용할 수 있어 Docker daemon, database proxy 등에 많이 쓰입니다.
Shared Memory
여러 프로세스가 같은 메모리 영역을 매핑합니다. 복사가 적어 빠르지만 동시성 제어가 어렵기 때문에 mutex, semaphore 같은 동기화 도구와 함께 써야 합니다.
Message Queue
커널 또는 미들웨어가 메시지를 큐에 저장합니다. 생산자와 소비자를 느슨하게 분리할 수 있고, RabbitMQ, Kafka, Redis Streams 같은 시스템은 분산 환경의 IPC로 볼 수 있습니다.
선택 기준
| 요구사항 | 적합한 방식 |
|---|---|
| 단순 스트림 연결 | Pipe |
| 종료/재시작 알림 | Signal |
| 로컬 고성능 RPC | Unix Domain Socket |
| 대용량 저지연 공유 | Shared Memory |
| 비동기 작업 분리 | Message Queue |
주의할 점
IPC는 통신 형식뿐 아니라 실패 모델이 중요합니다. 상대 프로세스가 죽었는지, 메시지가 중복 처리될 수 있는지, 큐가 가득 찼을 때 어떻게 할지, 공유 메모리의 lock이 해제되지 않으면 어떻게 복구할지까지 설계해야 합니다.
면접 답변 포인트
IPC는 “격리된 프로세스들이 안전하게 협력하기 위한 통신 수단”이라고 설명하고, pipe/signal/socket/shared memory/message queue를 용도와 trade-off로 구분하면 좋습니다.