앞서 공부한 fork / exec / wait에서 프로세스는 서로 독립된 메모리 공간을 가진다는 것을 배웠다.
그렇다면 독립된 프로세스들이 데이터를 주고받아야 할 때는 어떻게 할까?
그 답이 바로 IPC(Inter-Process Communication)다.
1. IPC란?
IPC(Inter-Process Communication)는 말 그대로 독립·분리된 프로세스들끼리 서로 데이터를 주고받는 메커니즘, 즉 프로세스 간 통신 방법을 제공하는 것이다.
💡 왜 필요한가?
기본적으로 프로세스는 다른 프로세스의 메모리 공간에 직접 접근할 수 없다.
가상 메모리 구조상 각 프로세스는 완전히 격리된 주소 공간을 가지기 때문이다.
따라서 프로세스 간에 데이터를 교환하려면 OS가 제공하는 공식 통로(IPC)를 반드시 거쳐야 한다.
실제 프로세스 메모리 구조
위 그림처럼 각 프로세스는 독립된 사용자 공간(User Space)을 가지지만, 커널 공간(Kernel Space)은 모든 프로세스가 공유한다.
결국 IPC의 핵심은 커널 공간을 활용해 프로세스 간 데이터를 중계하는 것이다.
⚠️ 파일(File) 방식을 제외한 모든 IPC 기법은 커널 공간을 사용한다.
IPC가 필요한 실제 사례
| 사례 | 설명 |
|---|
| Redis + 배치 시스템 | 배치 프로세스가 Redis 프로세스와 데이터를 주고받아야 함 |
| 웹 브라우저 + 렌더링 프로세스 | 브라우저가 렌더링 프로세스에게 HTML 데이터를 넘겨줌 |
| fork() 병렬 처리 | fork()로 여러 자식 프로세스를 만들어 작업을 분산, 결과를 부모에게 전달 |
2. IPC 기법의 종류
| # | 기법 | 커널 공간 사용 여부 |
|---|
| 1 | File | ❌ (디스크 사용) |
| 2 | Pipe | ✅ |
| 3 | Message Queue | ✅ |
| 4 | Shared Memory | ✅ |
| 5 | Signal | ✅ |
| 6 | Semaphore | ✅ |
| 7 | Socket | ✅ |
3. 대표 IPC 기법 상세
3-1. Pipe (파이프)
개념
- 단방향 통신이 기본이다. (한쪽은 쓰기 전용, 반대쪽은 읽기 전용)
- 주로
fork()로 생성된 부모-자식 프로세스 간의 통신에 사용된다. - 커널 공간에 임시 버퍼를 만들어 데이터를 중계한다.
동작 방식
1
| 부모 프로세스 ──[쓰기]──▶ [커널 파이프 버퍼] ──[읽기]──▶ 자식 프로세스
|
특징 및 한계
- 부모-자식 관계처럼 혈연 관계(관련 있는 프로세스) 사이에서만 사용 가능
- 양방향 통신이 필요하면 파이프를 2개 만들어야 한다
- 데이터를 읽으면 버퍼에서 사라진다 (소비형)
3-2. Message Queue (메시지 큐)
개념
- FIFO(First In, First Out) 정책으로 데이터를 전송한다.
- 파이프와 달리 관계없는 프로세스 사이에서도 사용할 수 있다.
- 커널 공간에 큐(Queue) 자료구조를 만들어 메시지 단위로 데이터를 관리한다.
동작 방식
1
2
| 프로세스 A ──[메시지 전송]──▶ [커널 메시지 큐] ──[메시지 수신]──▶ 프로세스 B
(FIFO 순서 보장)
|
3-3. Pipe vs Message Queue 비교
| 구분 | Pipe | Message Queue |
|---|
| 통신 가능 대상 | 부모-자식 관계 프로세스만 | 관계없는 프로세스 간에도 가능 |
| 통신 방향 | 단방향 | 양방향 |
| 메모리 위치 | 커널 공간 | 커널 공간 |
| 데이터 단위 | 바이트 스트림 (경계 없음) | 메시지 단위 (경계 있음) |
| 데이터 순서 | 순서 보장 | FIFO 순서 보장 |
3-4. Shared Memory (공유 메모리)
개념
- 커널 공간에 메모리 영역을 명시적으로 생성하고, 여러 프로세스가 해당 영역을 직접 읽고 쓰는 방식이다.
- 메시지 큐처럼 FIFO 방식이 아니라, 메모리 주소를 변수처럼 직접 접근한다.
- 공유 메모리 key를 통해 여러 프로세스가 같은 메모리 영역에 접근할 수 있다.
동작 방식
1
2
| 프로세스 A ──[key로 접근]──▶ [커널 공유 메모리 영역] ◀──[key로 접근]── 프로세스 B
(직접 읽기/쓰기 가능)
|
다른 기법과의 차이
| 구분 | Message Queue | Shared Memory |
|---|
| 접근 방식 | 메시지 송수신 함수 호출 | 메모리 주소 직접 접근 |
| 속도 | 상대적으로 느림 | 가장 빠름 (복사 없이 직접 접근) |
| 동기화 | 큐 자체가 순서 보장 | 별도 동기화 필요 (Semaphore 등) |
⚠️ 공유 메모리는 빠르지만, 여러 프로세스가 동시에 쓰기를 시도할 경우 데이터가 깨질 수 있다.
이를 방지하기 위해 Semaphore(세마포어)와 함께 사용하는 것이 일반적이다.
3-5. Signal (시그널)
개념
커널 또는 프로세스에서 다른 프로세스에게 어떤 이벤트가 발생했는지를 알려주는 기법이다.
데이터를 전달하는 것이 아니라, “이런 일이 생겼다”는 사건(Event) 자체를 통보하는 방식이다.
대표 시그널 종류
| 시그널 | 의미 | 발생 조건 |
|---|
SIGKILL | 프로세스를 즉시 강제 종료 | 슈퍼관리자가 사용, 프로세스가 무조건 종료됨 |
SIGINT | 프로세스에 인터럽트를 보내 종료 | Ctrl + C 입력 시 |
SIGSTP | 프로세스를 일시 정지 | Ctrl + Z 입력 시 |
SIGCONT | 정지된 프로세스를 재개 | fg 명령어 등으로 재개 시 |
SIGALRM | 알람 발생 | alarm() 시스템 콜 호출 후 지정 시간 경과 시 |
SIGSEGV | 메모리 침범 오류 | 프로세스가 허가되지 않은 메모리 영역에 접근 시 |
동작 방식
1
2
| 커널 또는 프로세스 A ──[시그널 전송]──▶ 프로세스 B
(핸들러 실행 또는 기본 동작 수행)
|
💡 앞서 배운 fork() → exec() 에서, 부모가 자식을 강제 종료할 때 사용하던 kill() 명령이 바로 SIGKILL 시그널을 보내는 것이다.
3-6. Socket (소켓)
개념
- 네트워크 통신을 포함한 가장 범용적인 IPC 기법이다.
- 같은 컴퓨터 내의 프로세스 간 통신뿐만 아니라, 다른 컴퓨터(원격 호스트)와의 통신도 가능하다.
- 클라이언트-서버 모델로 동작하며, IP 주소와 포트 번호로 통신 대상을 식별한다.
다른 IPC 기법과의 차이
| 구분 | 파이프 / 메시지 큐 / 공유 메모리 | Socket |
|---|
| 통신 범위 | 같은 컴퓨터 내 프로세스 간 | 같은 컴퓨터 + 다른 컴퓨터(네트워크) |
| 프로토콜 | OS 내부 메커니즘 | TCP, UDP 등 네트워크 프로토콜 |
| 사용 예시 | 로컬 프로세스 간 데이터 공유 | 웹 서버-클라이언트, API 통신 |
4. IPC 기법 전체 비교
| 기법 | 통신 방향 | 대상 | 속도 | 주요 특징 |
|---|
| File | 양방향 | 모든 프로세스 | 느림 | 디스크 기반, 영속성 있음 |
| Pipe | 단방향 | 부모-자식만 | 빠름 | 단순, 관계 있는 프로세스 전용 |
| Message Queue | 양방향 | 모든 프로세스 | 중간 | FIFO, 메시지 단위 전송 |
| Shared Memory | 양방향 | 모든 프로세스 | 가장 빠름 | 직접 메모리 접근, 동기화 필요 |
| Signal | 단방향 | 모든 프로세스 | 빠름 | 데이터 전달 X, 이벤트 통보 전용 |
| Semaphore | — | 모든 프로세스 | 빠름 | 통신보다는 동기화·접근 제어 목적 |
| Socket | 양방향 | 네트워크 포함 | 중간 | 가장 범용적, 원격 통신 가능 |
5. 헷갈리는 포인트
Q1. 공유 메모리는 커널 공간을 쓰는데, 왜 가장 빠를까?
다른 IPC 기법들(파이프, 메시지 큐)은 데이터를 전송할 때 **사용자 공간 → 커널 공간 → 사용자 공간**으로 두 번 복사가 일어납니다. 반면 공유 메모리는 커널 공간에 만들어진 메모리 영역을 **두 프로세스가 직접 자신의 주소 공간에 매핑**해서 사용합니다. 즉, 복사 없이 **같은 물리 메모리를 두 프로세스가 동시에 바라보는 것**이기 때문에 속도가 가장 빠릅니다.
Q2. 시그널은 데이터를 전달하지 못하는데, 그럼 왜 IPC로 분류할까?
IPC의 정의는 "데이터를 주고받는 것"만이 아니라 **"프로세스 간에 정보를 교환하는 모든 메커니즘"**을 포함합니다. 시그널은 "어떤 사건이 발생했다"는 **상태 정보 자체**를 전달하므로 IPC의 한 형태로 분류됩니다. 예를 들어 `SIGSEGV`를 받은 프로세스는 "내가 메모리를 침범했다"는 정보를 전달받은 것입니다.
Q3. Pipe와 Socket은 둘 다 통신인데 어떻게 다를까?
| 구분 | Pipe | Socket | |------|------|--------| | **통신 범위** | 같은 컴퓨터 내, 관계 있는 프로세스 | 같은 컴퓨터 + 네트워크 너머 다른 컴퓨터 | | **관계 조건** | 부모-자식 관계 필요 | 관계 없는 프로세스, 다른 서버도 가능 | | **프로토콜** | OS 내부 메커니즘 | TCP / UDP | 한 마디로, **Pipe는 가족끼리 쪽지를 주고받는 것**, **Socket은 우편 시스템을 통해 전 세계 누구에게나 편지를 보내는 것**입니다.
6. 보충해야 할 개념
| 개념 | 왜 필요한가 |
|---|
| Semaphore (세마포어) | 공유 메모리처럼 여러 프로세스가 동시에 접근할 때 충돌을 막는 동기화 기법 |
| Mutex | 세마포어의 특수한 형태로, 한 번에 하나의 프로세스만 접근을 허용 |
| Race Condition | 여러 프로세스가 공유 자원에 동시에 접근해 결과가 예측 불가능해지는 문제 |
| Dead Lock (교착 상태) | 두 프로세스가 서로 상대방의 자원을 기다리며 무한 대기하는 상태 |
| TCP / UDP | 소켓 통신에서 사용하는 네트워크 프로토콜의 차이 이해를 위해 |
7. 최종 요약
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| ┌───────────────────────────────────────────────────────────────┐
│ IPC 기법 한눈에 보기 │
├────────────────┬──────────────────────────────────────────────┤
│ Pipe │ 부모-자식 간 단방향 통신. 가장 단순 │
├────────────────┼──────────────────────────────────────────────┤
│ Message Queue │ FIFO 방식. 관계없는 프로세스도 가능 │
├────────────────┼──────────────────────────────────────────────┤
│ Shared Memory │ 메모리 직접 공유. 가장 빠름. 동기화 필요 │
├────────────────┼──────────────────────────────────────────────┤
│ Signal │ 이벤트 통보 전용. 데이터 전달 불가 │
├────────────────┼──────────────────────────────────────────────┤
│ Semaphore │ 통신보다는 공유 자원 접근 제어(동기화) 목적 │
├────────────────┼──────────────────────────────────────────────┤
│ Socket │ 네트워크 포함 가장 범용적. 원격 통신 가능 │
└────────────────┴──────────────────────────────────────────────┘
모든 IPC(File 제외)는 커널 공간을 통해 동작한다!
|