コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

プロセス間通信(IPC)

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

プロセス間通信(IPC)

このレッスンで分かること

  • IPC は別々のプロセス間でデータをやり取りする仕組みです
  • 代表例は パイプシグナル共有メモリソケットメッセージキュー の 5 種類です
  • 用途と速度・複雑さのトレードオフを理解すれば、適切な仕組みを選べます

プロセス間通信 とは

プロセス間通信(IPC)。本レッスンでは、プロセス間通信 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ IPC が必要か

プロセスは独立した仮想メモリ空間を持ち、互いの変数を直接読み書きできません。これは安全性の柱ですが、協調作業がしたいときには「ちゃんと届ける」仕掛けが必要になります。これが IPC(Inter-Process Communication)です。

主要な IPC 一覧

種類方向速度同期用途
パイプ ``単方向高速カーネルがバッファ管理
名前付きパイプ FIFO単方向高速パスで識別別の祖先を持つプロセス間
シグナル通知のみ高速非同期終了通知、強制停止
共有メモリ双方向最速自前で同期必須大量データ
ソケット双方向中速OS が管理ネットワーク越し
メッセージキュー双方向中速OS が管理構造化メッセージ

図解

diagram (will load when visible)

具体例

パイプ

ターミナル

ls -l | grep ".txt" | wc -l

シェルは 3 つのプロセスを立ち上げ、それぞれの標準出力と標準入力をパイプで繋ぎます。データはディスクを介さず カーネルメモリ内 を流れます。

シグナル

ターミナル

kill -TERM 12345 # PID 12345 に終了要求 kill -KILL 12345 # 強制終了(無視不能)

SIGTERM は「片付けて終わって」、SIGKILL は「即死」というニュアンス。Ctrl+CSIGINT を送る操作です。

共有メモリ + セマフォ

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 レベルの帯域が出ます。遅いのはネットワーク越しのソケットだけです
  • 「シグナルでデータを渡せる」も誤解で、SIGUSR1 SIGUSR2 で「合図」程度のことしかできません

やってみよう

ターミナル

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 つができることを確認しましょう。

  1. IPC の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. IPC とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン