【きょうゆうメモリ】

共有メモリ とは?

最終更新:
💡 みんなで使う共用ホワイトボード、書くときは順番を守って

複数の実行主体が同じメモリ領域を利用する仕組み。プロセス間通信(IPC)では、複数プロセスから共有領域にアクセスしてデータをやり取りする。更新の競合を防ぐ同期や、領域の寿命の管理が重要。

📌 このページのポイント
共有メモリ:同じ領域にアクセス プロセスA プロセスB 書く 読む 共有のデータ領域 22 33 44 55 読み書きの順序を同期する 例:セマフォ / プロセス間ミューテックス 作成・接続・アクセス権・解放も管理
矢印はデータの読み書きの例です。同じ共有領域を利用し、更新途中を読まないための同期を設計します。
ひよこ ひよこ
共有メモリってどういう仕組みなの?
ペンギン先生 ペンギン先生
ここではプロセス間通信の使い方を考えよう。別々のプロセスでも、特定のメモリ領域をそれぞれのアドレス空間に対応付けて、同じデータにアクセスできるんだ。自分専用の領域まで全部共有するわけではないよ
ひよこ ひよこ
何がうれしいの?
ペンギン先生 ペンギン先生
大きな配列などを毎回メッセージとしてコピー・変換して渡す代わりに、共通の領域を直接使えることだよ。ただし、最初にデータを共有領域へコピーする場合もあるし、同期にも手間がかかる。必ずコピーがゼロ、必ず最速という意味ではないんだ
ひよこ ひよこ
同時に書いたら、おかしくならない?
ペンギン先生 ペンギン先生
更新がぶつかったり、相手が書きかけの状態を読んだりすると困るね。セマフォやプロセス間で使えるミューテックスなどで、読み書きの順序を調整する。どの部分をいつ更新するかに合わせて、同期方法を設計するんだ
ひよこ ひよこ
どんなところで使われるの?
ペンギン先生 ペンギン先生
たとえばPostgreSQLには共有メモリ上のバッファがあるよ。Pythonにも複数プロセスから同じ配列を参照する仕組みがある。画像データを共有の配列に置いて処理する、といった使い方を考えられるね
ひよこ ひよこ
使い終わったらどうするの?
ペンギン先生 ペンギン先生
アクセスを終える処理と、共有領域を取り除く処理を考える必要があるよ。POSIXの例ではshm_openで作成・接続し、サイズを設定してmmapで対応付ける。使い終わった領域はmunmapやshm_unlinkなどで管理する。具体的な手順はOSやAPIによって異なるんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「共有メモリ」って出てきたら「複数のプロセスなどが同じメモリ領域を使う仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Shared Memory」 = 共有メモリ
💬 Sharedは「共有された」、Memoryは「記憶領域」という意味で、複数のプロセスが同じメモリを共有する仕組みのことだよ

参考資料

← 用語集にもどる