포스트

[OS] IPC — 프로세스 간 통신

[OS] IPC — 프로세스 간 통신

앞서 공부한 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 기법의 종류

#기법커널 공간 사용 여부
1File❌ (디스크 사용)
2Pipe✅
3Message Queue✅
4Shared Memory✅
5Signal✅
6Semaphore✅
7Socket✅

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 비교

파이프와 메시지 큐 비교

구분PipeMessage Queue
통신 가능 대상부모-자식 관계 프로세스만관계없는 프로세스 간에도 가능
통신 방향단방향양방향
메모리 위치커널 공간커널 공간
데이터 단위바이트 스트림 (경계 없음)메시지 단위 (경계 있음)
데이터 순서순서 보장FIFO 순서 보장

3-4. Shared Memory (공유 메모리)

공유 메모리 동작 구조

개념

  • 커널 공간에 메모리 영역을 명시적으로 생성하고, 여러 프로세스가 해당 영역을 직접 읽고 쓰는 방식이다.
  • 메시지 큐처럼 FIFO 방식이 아니라, 메모리 주소를 변수처럼 직접 접근한다.
  • 공유 메모리 key를 통해 여러 프로세스가 같은 메모리 영역에 접근할 수 있다.

동작 방식

1
2
프로세스 A ──[key로 접근]──▶ [커널 공유 메모리 영역] ◀──[key로 접근]── 프로세스 B
                              (직접 읽기/쓰기 가능)

다른 기법과의 차이

구분Message QueueShared 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 제외)는 커널 공간을 통해 동작한다!
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.