Mímisbrunnr知恵の泉

← コンピュータ基礎 一覧

🎓 レベル:標準 | 重要度:B(推奨)

📎 前提:プロセスとスレッド | 関連:並行性のパターンファイルシステムの構造

要点(BLUF)

概念 ── なぜ通信路がわざわざ要るのか

プロセスとスレッド で見たように、プロセスは独立したアドレス空間を持ち、互いのメモリに触れません。これは保護のための設計(物理メモリと論理アドレス)ですが、裏を返せば普通の変数では会話できない

そこで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+CSIGINTkill コマンドは指定シグナルを送ります。データは運べず「イベントが起きた」ことだけを伝える。受け取り側はハンドラを登録して反応します(入出力とバス・割り込み の割り込みのソフト版)。

具体例 ── シェルのパイプを観察

ls | wc -l(ファイル数を数える)は、lswc を別プロセスで起動し、間を匿名パイプで繋いだものです(対応ラボ)。ls がディレクトリ一覧を書き、wc がそれを読んで行数を数える。2プロセスが同時に動き、パイプのバッファが満杯になれば ls は一時停止して wc の消化を待ちます(自然なフロー制御)。

仕組みの直観 ── なぜこの設計か

⚠️ よくある誤解・落とし穴

対応ラボ

cs-foundations-study/labs/02-04_pipe.md(Linux: ls | wc -l と、mkfifo で名前付きパイプを作り別端末から書き込む手順。同時実行とフロー制御を観察)。

関連

第2章 オペレーティングシステム 目次