この 2 つの用語は明確に定義されておらず、白黒の問題ではありません。
メモリ モデルは、非常に弱い場合もあれば、非常に強い場合も、その中間の場合もあります。
基本的には、同時メモリアクセスに関して提供される保証を指します。
単純に、1 つのスレッドで行われた書き込みは、他のすべてのスレッドにすぐに表示されると予想します。また、すべてのスレッドでイベントが同じ順序で表示されることも期待できます。
しかし、より弱い記憶モデルでは、どちらも成り立たないかもしれません。
順次整合性は、イベントがすべてのスレッドで同じ順序で表示されることを保証するメモリ モデルの用語です。したがって、シーケンシャルな一貫性を保証するメモリ モデルは非常に強力です。
より弱い保証は、因果的一貫性です。つまり、イベントが依存するイベントの後に観察されるという保証です。
つまり、最初x
にあるアドレスA
に値を書き込み、次に同じアドレスに 2 番目の値を書き込むと、値を読み取った後にその値を読み取るy
スレッドはありません。2 つの書き込みは同じアドレスに対するものであるため、すべてのスレッドが同じ順序を観察しないと、因果的一貫性に違反します。しかし、これは、無関係なイベントに何が起こるべきかについては何も言いません。3 番目の値を別のメモリ アドレスに書き込んだ結果は、他のスレッドによっていつでも観察される可能性があります(したがって、順次整合性の下とは異なり、別のスレッドは異なる順序でイベントを観察する可能性があります)。y
x
このような「一貫性」のレベルは他にもたくさんあり、強いものもあれば弱いものもあり、信頼できるものについてあらゆる種類の微妙な保証を提供します。
基本的に、より強力なメモリ モデルは、イベントが観察される順序についてより多くの保証を提供し、通常は直感的に期待するものに近い動作を保証します。
ただし、モデルが弱いほど、最適化の余地が大きくなり、特に、より多くのコアでより適切にスケーリングされます (必要な同期が少ないため)。
シーケンシャル整合性は、シングルコア CPU では基本的に無料で、クアッドコアでは実行可能ですが、32 コア システムまたは 4 つの物理 CPU を備えたシステムでは非常に高価になります。または、複数の物理マシン間の共有メモリ システム。
コアの数が多いほど、それらが離れているほど、すべてが同じ順序でイベントを監視することを保証することが難しくなります。したがって、妥協が行われ、より緩い保証を行う、より弱いメモリ モデルに落ち着きます。