
コンピュータサイエンスにおいて、分散共有メモリ( DSM ) は、物理的に分離されたメモリを単一の共有アドレス空間としてアドレス指定できるメモリアーキテクチャの一種です。「共有」という用語は、単一の中央集中型メモリが存在することを意味するのではなく、アドレス空間が共有されていることを意味します。つまり、2 つのプロセッサ上の同じ物理アドレスは、メモリ内の同じ場所を参照します。[ 1 ] : 201分散グローバルアドレス空間( DGAS ) は、クラスタの各ノードが各ノードのプライベート (つまり、共有されていない)メモリに加えて共有メモリにアクセスできる、幅広いクラスのソフトウェアおよびハードウェア実装に対する同様の用語です。
DSMは、ソフトウェアとハードウェアの両方で実現できます。ハードウェアの例としては、キャッシュコヒーレンス回路やネットワークインターフェースコントローラなどがあります。DSMの実装方法は、仮想メモリを使用するページベースのアプローチ、ルーチンを使用して共有変数にアクセスする共有変数アプローチ、そしてオブジェクト指向の手法を用いて共有データにアクセスするオブジェクトベースのアプローチの3つがあります。
DSMはノード数が多くても高い拡張性を持ち、メッセージパッシングは隠蔽されています。複雑で大規模なデータベースを、レプリケーションやプロセスへのデータ送信なしで処理でき、一般的にマルチプロセッサシステムよりも低コストです。また、広い仮想メモリ空間を提供し、共通のプログラミングインターフェースによりプログラムの移植性が向上し、プログラマはプリミティブの送受信を意識する必要がありません。
分散型共有メモリは、非分散型共有メモリに比べてアクセス速度が一般的に遅く、共有データへの同時アクセスに対する追加の保護対策が必要です。DSMはパフォーマンスの低下を招く可能性があり、生成されるメッセージに対するプログラマの制御は限られており、正しいプログラムを作成するには一貫性モデルが必要です。
ソフトウェアDSMシステムは、共有メモリ領域をさまざまな方法で構成できる柔軟性も備えています。ページベースのアプローチでは、共有メモリを固定サイズのページに編成します。一方、オブジェクトベースのアプローチでは、共有メモリ領域を可変サイズの共有可能なオブジェクトを格納するための抽象空間として構成します。よく見られる別の実装では、共有の単位がタプルであるタプル空間を使用します。
共有メモリアーキテクチャでは、メモリをノード間およびメインメモリに分散された共有部分に分割するか、すべてのメモリをノード間で分散させるかのいずれかの方法をとる。一貫性モデルに従って選択されたコヒーレンスプロトコルによって、メモリの一貫性が維持される。
メモリの一貫性は、DSMを編成するシステムが、システムを構成する複数のメモリにわたるノード内のデータブロックの状態を追跡および維持するために必要である。ディレクトリは、システム内を移動するキャッシュブロックの状態を維持するメカニズムの一つである。

基本的な DSM では、ディレクトリ内の任意のブロックについて、ノード間で少なくとも 3 つの状態を追跡します。[ 2 ]ブロックがキャッシュされていない (U) ことを示す状態、ブロックが排他的に所有されているか変更された所有物である (EM) ことを示す状態、およびブロックが共有されている (S) ことを示す状態があります。ブロックがディレクトリ組織に入ると、最初のノードで U から EM (所有権状態) に遷移します。他のノードがブロックの読み取りを開始すると、状態は S に遷移します。
システムが各ノードにおけるブロックのキャッシュ場所と状態を追跡できるようにするには、主に2つの方法があります。ホーム中心のリクエスト/レスポンス方式では、ホームを使用してリクエストを処理し、状態を管理しますが、リクエスター中心方式では、各ノードがホームを介して独自のリクエストを管理します。
ホーム中心のシステムでは、DSM は、ホーム ノードがトランザクションの完了を決定するまで (通常は、ホームが要求に対する応答プロセッサの応答をすべて受信したとき) 一度に 1 つのトランザクションのみが発生するようにすることで、ノード間の要求応答の競合を処理する必要がなくなります。この例として、Intel のQPIホーム ソース モードがあります。[ 3 ]このアプローチの利点は、実装が簡単であることです。ただし、ホーム ノードの制限により、要求応答戦略は遅く、バッファリングされます。

要求者中心のシステムでは、DSM によりノードはホームを介して自由に相互に通信できます。これは、複数のノードがトランザクションを開始しようと試みることができることを意味しますが、一貫性を確保するために追加の考慮事項が必要です。たとえば、あるノードがブロックを処理しているときに、別のノードからそのブロックの要求を受信すると、NAck (否定応答) を送信して、処理中のノードはその要求をすぐに満たすことができないことを開始者に伝えます。この例として、Intel の QPI スヌープ ソース モードがあります。[ 3 ]このアプローチは高速ですが、競合状態を自然に防止することはできず、バス トラフィックが増加します。
DSMは、ノード間での読み書き順序の見方に関する一貫性を維持するために、特定のルールに従う必要があり、これはシステムの一貫性モデルと呼ばれます。
n個のプロセスがあり、各プロセスiに対してMi 個のメモリ操作があり、すべての操作が順次実行される状況では、( M1 + M2 + ... + Mn )!/( M1 ! M2 !... Mn !) が操作のインターリーブとして考えられます。この結論の問題点は、インターリーブされた操作の正しさを判断することです。DSM のメモリコヒーレンスは、どのインターリーブが許可されるかを定義します。
レプリケーションアルゴリズムには、読み取りレプリケーションと書き込みレプリケーションの2種類があります。読み取りレプリケーションでは、複数のノードが同時に読み取りを行うことができますが、書き込みは1つのノードのみ可能です。一方、書き込みレプリケーションでは、複数のノードが同時に読み取りと書き込みを行うことができます。書き込み要求はシーケンサーによって処理されます。一般的に、共有データのレプリケーションはネットワークトラフィックを削減し、並列処理を促進し、ページフォールトを減少させる傾向があります。ただし、一貫性と整合性を維持することはより困難になる可能性があります。
リリース一貫性とは、プロセスがクリティカルセクションを抜けた際に、変数の新しい値がすべてのサイトに伝播される状態を指します。エントリ一貫性とは、プロセスがクリティカルセクションに入った際に、共有変数の値が自動的に更新される状態を指します。ビューベースの一貫性はエントリ一貫性の一種ですが、クリティカルセクションの共有変数はシステムによって自動的に検出されます。