🧠

共有メモリとは?

2024/02/03に公開

はじめに

本記事では、共有メモリとは何か、についてざっくりとまとめる。

共有メモリとは?ひとことで

共有メモリとは、コンピュータのメインメモリのうち、複数の主体によって共有される領域。実行中の複数のプロセスが共有する領域を指す場合と、複数のプロセッサやプロセッサコアが共有する領域を指す場合がある。
共有メモリ(シェアードメモリ)とは - 意味をわかりやすく - IT用語辞典 e-Words

以下、2 つの場合それぞれについて見ていく。

①複数のプロセスが共有するメモリ領域を指す場合(ソフトウェアによる共有メモリ)

あるプロセスが OS から割り当てられたメモリ領域を、他のプロセスにも開放することで実現する。
共有メモリ(シェアードメモリ)とは - 意味をわかりやすく - IT用語辞典 e-Words

もともと「共有メモリの領域」として用意されているわけではないメモリ領域を、他のプロセスにも開放する、ということ。プロセス間通信に用いられる。
※もちろん、一度共有した他のプロセスと共有メモリとの紐付けを、後から解除可能。

同時に複数のプロセスからアクセスすると一貫性が失われる危険性があるため、ロック機構など適切な排他制御を行う必要がある。
共有メモリ(シェアードメモリ)とは - 意味をわかりやすく - IT用語辞典 e-Words

排他処理には、通常セマフォが用いられる。

プロセス間で高速に通信することができるが、同じコンピュータ内でしか通信できない制約がある。
共有メモリ(シェアードメモリ)とは - 意味をわかりやすく - IT用語辞典 e-Words

「同じコンピュータ内」とは、同じ CPU 内ということ。

Pros: 高速である

プロセス間通信の方法としては、共有メモリ以外にも、パイプやソケットなどがあるが、これらと比べて高速である。

理由:パイプやソケットを使う方法では、カーネルの状態をユーザーの状態に、あるいはユーザーの状態をカーネルの状態に、と逐一コピーする必要がある。その際、オーバーヘッドが発生する。一方で共有メモリは、複数のプロセスが同じメモリ領域にアクセスできるので、そのようなオーバーヘッドを回避できる。

Cons: 同じ CPU 内でしか共有できない

プロセス群は共有メモリ領域に通常のメモリ領域と同じようにアクセスできるので、他のプロセス間通信(名前付きパイプ、ソケット、CORBAなど)と比較して通信手段としては非常に高速である。しかし、プロセス群が同じマシン上で動作しなければならないという制約があり、プロセスが別々の CPU 上で動作する場合はハードウェアによる共有メモリを使っていることになり、キャッシュコヒーレンシなどに注意が必要となる。
共有メモリ - Wikipedia

もし複数の CPU で共有したい場合は、ハードウェアによる共有メモリを使っていることになる。

②複数のプロセッサやプロセッサコアが共有するメモリ領域を指す場合(ハードウェアによる共有メモリ)

コンピュータ内に複数のマイクロプロセッサやプロセッサコアが内臓されている場合、どのプロセッサからも等しくアクセス可能なメモリ装置を共有メモリという。
共有メモリ(シェアードメモリ)とは - 意味をわかりやすく - IT用語辞典 e-Words

こちらは、もともとハードウェアレベルで「共有メモリの領域」が用意されているケース。

比較的プロセッサ数の少ないシステムで採用される方式で、一般的なソフトウェアをそのまま使用できるが、各プロセッサ内部にあるキャッシュメモリとの一貫性を保つのが難しく、性能向上の制約となりやすい。
共有メモリ(シェアードメモリ)とは - 意味をわかりやすく - IT用語辞典 e-Words

それなら共有キャッシュを用意すれば良いのでは?
→実際、共有キャッシュ[1]はあるらしいが、共有キャッシュ特有の問題点はありそう。

Pros

ソフトウェアから見たら 1 つのメモリ領域として扱えて、追加の特別な処理が不要なので、簡単にプログラムが書ける。

Cons

  • CPU 数を増やしても、それに比例して性能の伸びが緩やかになってしまうため、CPU 数をあまり増やせない
  • キャッシュコヒーレンシが失われてしまう(キャッシュ間でデータが一致しなくなる)
    • 解決策として、「コヒーレンシプロトコル」があるが、今度はコヒーレンシプロトコルがオーバーヘッドとなってしまう

参考

脚注
  1. ※共有キャッシュについてはなかなか良い説明を見つけられていません…。もし良い記事などをご存知の方がいらっしゃったらコメントをいただけると嬉しいです。 ↩︎

Discussion