一貫性モデル (ソフトウェア)
厳密な一貫性は、最も強力な一貫性モデルである。このモデルでは、任意のプロセッサによる変数への書き込みは、すべてのプロセッサによって瞬時に確認される必要がある。
厳密モデルの図と非厳密モデルの図は、時間の制約である「瞬間」を表している。これは、あたかもグローバルクロックが存在し、すべての書き込みがそのクロック期間の終わりまでにすべてのプロセッサのキャッシュに反映されなければならないように理解することができる。次の操作は、次のクロック期間にのみ行われなければならない。
これは最も厳格なモデルである。このモデルでは、プログラマーが期待した結果が毎回返ってくる。よって決定論的なモデルである。瞬間的なメッセージ交換は不可能なので、実用的な関連性は思考実験と形式論に限られる。また、同時書き込みが不可能であることを前提としているため、同じデータアイテムへの同時書き込みにおける衝突解決の問題にも役立たない。
逐次整合性モデルや因果整合性モデルなどの整合性モデルでは、一貫性を確保するために、複製された共有データに対する操作の順序を扱う。これらのモデルでは、すべてのレプリカが、一貫したグローバルな更新順序に同意しなければならない。
単調書込み一貫性条件は、Tanenbaum et al., 2007によって以下のように定義されている。
いくつかのモデルでは、異なる場所へのすべての操作が緩和される。読み込みや書き込みは、別の場所にある別の読み込みや書き込みを基準にして、順序を変えることができる。弱い順序はこのカテゴリに分類され、2種類のリリース一貫性モデル(RCscとRCpc)もこのモデルに含まれる。また、この緩和のカテゴリには、Digital Alpha、SPARC V9 relaxed memory order (RMO)、IBM PowerPCの3つの商用アーキテクチャが提案されていた。これらのモデルは、Digital Alphaを除いて、同じ場所への読み出しの再順序付けが可能だった。これらのモデルでは、従来のモデルにはない追加的な緩和が認められており、読み出し操作に続くメモリ操作は、読み出しに対してオーバーラップして順序を変更することができる。RCpcとPowerPCを除くこれらのモデルでは、読み出しが他のプロセッサの初期書き込みの値を返すことができる。プログラマーの観点からすると、これらのモデルは、プロセッサが自分の書き込みを早く読むことができるにもかかわらず、書き込みの不可分性の錯覚を維持しなければならない。
これらのモデルは、提供されるセーフティネットの種類に基づいて2つのカテゴリーに分類される。ここでは、慎重に書かれたプログラムの必要性が見られる。同期の性質によって、弱い命令、RCsc、RCpcモデルに分類される。Alpha、RMO、PowerPCモデルでは、フェンス命令が用意されており、異なるメモリ操作の間にプログラムの順序を課すことができる。
リリース一貫性には、RCsc (release consistency with sequential consistency)とRCpc (release consistency with processor consistency)の2種類がある。後者のタイプは、以下で特殊とされる操作に適用される一貫性のタイプを示す。
特殊な(通常の)メモリ操作があり、それは同期操作と非同期操作の2つのクラスの操作からなる。後者は同期に使用されない操作で、前者はアクイジション(取得)とリリース(解放)の操作で構成される。アクイジションとは、ある特定の共有ロケーションへのアクセスを得るための、事実上のリードメモリ操作のことである。一方、リリースとは、共有されている場所へのアクセス許可を与えるために行われる書き込み操作である。
リリース一貫性と逐次一貫性(RCsc)の場合、制約条件は次のようになる。
アクワイア(取得) → その他の操作
その他の操作 → リリース(解放)
特殊操作 → 特殊操作
プロセッサ一貫性とリリース一貫性(RCpc)では、プログラムの書き込みから読み出しまでの順序が緩和され、次のような制約となる。
アクワイア(取得) → その他の操作
その他の操作 → リリース(解放)
特殊操作 → 特殊操作 (特殊な書き込みの後に特殊な読み込みが続く場合を想定)。
注:上記のA→Bという表記は、プログラム順でAの操作がBよりも先に行われた場合、プログラム順が強制されることを意味する。
Tanenbaum et al., 2007は、一貫性モデルをソフトウェア(プロセス)とメモリ実装(データストア)の間の契約と定義している。このモデルは、ソフトウェアが一定のルールに従えば、メモリが正しく動作することを保証するものである。グローバルクロックを持たないシステムでは、書き込みの中で最後の操作を定義することが難しいため、読み出し操作で返せる値に何らかの制限を加えることができる。