🎓 レベル:標準 | 重要度:B(推奨)
📎 前提:プロセスとスレッド | 関連:並行性のパターン・ファイルシステムの構造
要点(BLUF)
- プロセスは互いのメモリを見られない(分離・保護)。だから協調するには OSが用意する通信路(IPC) を通す必要がある。
- 主な方式:パイプ(一方向バイトストリーム)、共有メモリ(同じ物理ページを両者にマップ・最速だが同期が要る)、メッセージキュー、シグナル(非同期の小さな通知)。
- 「速いが同期が必要な共有メモリ」と「安全だがコピーが要るメッセージ」のトレードオフ。用途で選ぶ。
概念 ── なぜ通信路がわざわざ要るのか
プロセスとスレッド で見たように、プロセスは独立したアドレス空間を持ち、互いのメモリに触れません。これは保護のための設計(物理メモリと論理アドレス)ですが、裏を返せば普通の変数では会話できない。
そこでOSが、保護を保ったまま情報をやり取りする専用の通信路を提供します。これがIPC。スレッド同士なら共有メモリで直接やり取りできるのに対し、プロセス同士は必ずOSの仲介が要る――この差がプロセスとスレッドの本質的な違いです。
仕組み ── 主なIPC方式
flowchart TB
subgraph SM["共有メモリ(最速・同期は自前)"]
pA["プロセスA"] <--> mem["共有ページ(両者にマップ)"]
pB["プロセスB"] <--> mem
end
subgraph MP["メッセージ/パイプ(OSがコピー・安全)"]
pC["プロセスC"] -->|"write"| os["カーネルのバッファ"]
os -->|"read"| pD["プロセスD"]
end
パイプ
一方向のバイトストリーム。A | B(シェルのパイプ)は、Aの標準出力をBの標準入力につなぐ匿名パイプです。書いた順にそのまま読める(FIFO)。シンプルで、UNIXの「小さな道具を繋ぐ」哲学の中心。名前付きパイプ(FIFO特殊ファイル)で無関係なプロセス間にも使えます。
共有メモリ
同じ物理メモリ領域を、両プロセスのアドレス空間にマップします(仮想記憶とページング)。一度設定すればOSを介さず直接読み書きできるので最速。ただしカーネルが順序を保証しないため、同期は自前(セマフォ等:排他制御(ロック・セマフォ・ミューテックス))で行う必要があります。これを怠ると競合状態(競合状態とクリティカルセクション)になります。
メッセージキュー
構造化されたメッセージを送受信。カーネルがバッファリングし、送受信の境界を保つ。コピーが入るぶん共有メモリより遅いが、同期の問題が起きにくく安全。
シグナル
「いま割り込みが起きた」式の非同期の小さな通知。Ctrl+C は SIGINT、kill コマンドは指定シグナルを送ります。データは運べず「イベントが起きた」ことだけを伝える。受け取り側はハンドラを登録して反応します(入出力とバス・割り込み の割り込みのソフト版)。
具体例 ── シェルのパイプを観察
ls | wc -l(ファイル数を数える)は、ls と wc を別プロセスで起動し、間を匿名パイプで繋いだものです(対応ラボ)。ls がディレクトリ一覧を書き、wc がそれを読んで行数を数える。2プロセスが同時に動き、パイプのバッファが満杯になれば ls は一時停止して wc の消化を待ちます(自然なフロー制御)。
仕組みの直観 ── なぜこの設計か
- 分離したのに通信路を足す理由:保護(誤って/悪意で他を壊さない)を優先しつつ、必要な協調だけを「検査された窓口」で許す。デフォルト遮断・明示的に開通、という安全側の設計。
- 共有メモリが速い理由:データを2度コピーしない(カーネルバッファ経由でない)。代わりに整合性は使う側の責任。性能と安全のトレードオフを使う側に委ねる。
- シグナルが小さい理由:非同期通知は「いつ来るか不明」。大きなデータを安全に渡すのは難しいので、最小限の「イベント発生」のみに割り切る。
⚠️ よくある誤解・落とし穴
- 「共有メモリは速いから常に最善」→ 同期を自前で正しく書くのは難しい。バグは競合状態として表面化する。
- 「パイプは双方向」→ 基本は一方向。双方向には2本要る。
- 「シグナルでデータを送れる」→ 送れるのは「番号」だけ(基本シグナル)。本体データは別のIPCで。
- 「IPC=ネットワーク通信」→ ここは同一マシン内のプロセス間。マシンをまたぐ通信は コンピュータネットワーク/分散システム へ。
対応ラボ
cs-foundations-study/labs/02-04_pipe.md(Linux: ls | wc -l と、mkfifo で名前付きパイプを作り別端末から書き込む手順。同時実行とフロー制御を観察)。
関連
- 共有を安全に使う同期は 排他制御(ロック・セマフォ・ミューテックス)
- 生産者消費者としてのパイプは 並行性のパターン
- パイプの実体(ファイル記述子)は ファイルシステムの構造