コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
プロセス間通信(IPC)
プロセス間通信(IPC)
このレッスンで分かること
- IPC は別々のプロセス間でデータをやり取りする仕組みです
- 代表例は パイプ、シグナル、共有メモリ、ソケット、メッセージキュー の 5 種類です
- 用途と速度・複雑さのトレードオフを理解すれば、適切な仕組みを選べます
プロセス間通信 とは
プロセス間通信(IPC)。本レッスンでは、プロセス間通信 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ IPC が必要か
プロセスは独立した仮想メモリ空間を持ち、互いの変数を直接読み書きできません。これは安全性の柱ですが、協調作業がしたいときには「ちゃんと届ける」仕掛けが必要になります。これが IPC(Inter-Process Communication)です。
主要な IPC 一覧
| 種類 | 方向 | 速度 | 同期 | 用途 |
|---|---|---|---|---|
| パイプ ` | ` | 単方向 | 高速 | カーネルがバッファ管理 |
| 名前付きパイプ FIFO | 単方向 | 高速 | パスで識別 | 別の祖先を持つプロセス間 |
| シグナル | 通知のみ | 高速 | 非同期 | 終了通知、強制停止 |
| 共有メモリ | 双方向 | 最速 | 自前で同期必須 | 大量データ |
| ソケット | 双方向 | 中速 | OS が管理 | ネットワーク越し |
| メッセージキュー | 双方向 | 中速 | OS が管理 | 構造化メッセージ |
図解
具体例
パイプ
ターミナル
ls -l | grep ".txt" | wc -lシェルは 3 つのプロセスを立ち上げ、それぞれの標準出力と標準入力をパイプで繋ぎます。データはディスクを介さず カーネルメモリ内 を流れます。
シグナル
ターミナル
kill -TERM 12345 # PID 12345 に終了要求
kill -KILL 12345 # 強制終了(無視不能)SIGTERM は「片付けて終わって」、SIGKILL は「即死」というニュアンス。Ctrl+C は SIGINT を送る操作です。
共有メモリ + セマフォ
c
int shmid = shmget(IPC_PRIVATE, 4096, 0666 | IPC_CREAT);
void *ptr = shmat(shmid, NULL, 0); // 自分の空間にマップ
// 別プロセスが同じ shmid で attach すれば、同じメモリを共有最も高速ですが、書き込み競合は自前で sem_wait などのセマフォで防ぐ必要があります。
Unix ドメインソケット
Python
import socket
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/tmp/myapp.sock")
s.send(b"hello")ローカルマシン内のプロセス間通信に特化したソケット。Docker や PostgreSQL、X Window System が活用しています。TCP より速く、ファイルパスで識別できる点が便利です。
トレードオフ
- 共有メモリ は最速ですが同期バグの温床。データの大きさやサイクルの速さで「速度のリターン」と「保守の苦しみ」を天秤にかけます
- ソケット はネットワーク透過で柔軟ですが、シリアライズ・脱シリアライズのコストがかかります
- シグナル は軽量ですが「通知」しか送れません。情報を運びたいなら他の手段と組み合わせます
よくある誤解
- 「IPC は遅い」は誤解で、ローカルパイプや共有メモリは GB/s レベルの帯域が出ます。遅いのはネットワーク越しのソケットだけです
- 「シグナルでデータを渡せる」も誤解で、
SIGUSR1SIGUSR2で「合図」程度のことしかできません
やってみよう
ターミナル
mkfifo /tmp/myfifo
# ターミナル 1
cat /tmp/myfifo
# ターミナル 2
echo "hello via named pipe" > /tmp/myfifo別のシェル同士でも、ファイルパスを介してデータが流れることを確認できます。終わったら rm /tmp/myfifo で片付けてください。
よくある質問
Q. プロセスとスレッドの違いは?
A. プロセスは独立したメモリ空間を持つ実行単位、スレッドは同じプロセス内でメモリを共有する実行単位です。プロセスの切り替えは重く、スレッドは軽量です。マルチコア活用にはスレッドが向き、堅牢な分離にはプロセスが向きます。
Q. スレッドが多すぎるとどうなりますか?
A. コンテキストスイッチのオーバーヘッドで全体性能が下がります。CPU バウンドな処理ならコア数程度、I/O バウンドならその数倍が適正です。スレッドプール(ExecutorService、ThreadPoolExecutor)で上限を制御すると安定します。
Q. プロセス間で通信するには?
A. パイプ、ソケット、共有メモリ、メッセージキューなどがあります。同一マシンならソケット(UNIX domain socket)や共有メモリが高速で、分散システムなら gRPC、HTTP、Kafka などのメッセージング基盤が定番です。
次のレッスン
次は メモリ階層(レジスタ→キャッシュ→RAM→ディスク) で、メモリ階層について学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- IPC の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. IPC とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン