キャッシュコヒーレンシ

キャッシュコヒーレンシ（英: cache coherency）とは、共有リソースに対する複数のキャッシュの一貫性を意味する。キャッシュコヒーレンシはメモリ一貫性の一種である。

複数のクライアントが共有メモリリソースのキャッシュを保持するとき、キャッシュ間のデータの不一致という問題が生じる。この問題は特にマルチプロセッシングシステムのCPU間で顕著である。右図において、上のクライアントがメモリのある部分を以前に読み込んでいてキャッシュ上にコピーを保持しているとき、下のクライアントが同じメモリ部分を更新すると、更新を何らかの方法で伝えない限り上のクライアントのキャッシュの内容は不正となる。キャッシュコヒーレンシはそのような状況に対処し、キャッシュとメモリの間の一貫性を保つことである。

定義 
一貫性を保つには、同じメモリ位置へのリードとライトの振る舞いを定義する。キャッシュコヒーレンシは以下の条件に適合するよう行われる。
 プロセッサPが位置Xにライトし、同じプロセッサPがXをリードする。その間、他のプロセッサがリードやライトを行っていない場合、Xは常にPがライトした値を返す。これはプログラムの実行順序の保持とも関係し、単一処理アーキテクチャでも常に成り立つ。
 プロセッサP2が位置Xにライトし、その後プロセッサP1がXをリードしたら、その間他のプロセッサがXにライトしていないなら、Xは常にP2がライトした値を返す。これはメモリの一貫性を定義する条件である。P2がライトした後もプロセッサから古い値がリードされる場合、メモリの一貫性が保たれていないと言える。
 同じ位置へのライトは逐次化される。つまり、Xという位置に対してAという値のライトとBという値のライトがそれぞれ別のプロセッサから発行されたとき、どのプロセッサから見てもライトの順序は一定でなければならず、最終的な値は後からライトした値でなければならない。

これらの条件はリードやライトが瞬間的に行われると仮定して定義している。しかし、実際のハードウェアではメモリレイテンシもあるし、その他アーキテクチャ上の制約によって瞬間的にリードやライトを実行することはできない。プロセッサXがライトを発行した直後にプロセッサYがリードを発行したとき、その間隔が短いとYにはXがライトした内容が見えない場合がある。メモリ一貫性モデルでは、ライトで書き込んだ値はその後の他のプロセッサからのリードで必ず取得できるようにしなければならない。

キャッシュコヒーレンシ機構 
 ディレクトリベースの一貫性機構
 キャッシュブロック群を集中ディレクトリ管理する。
 バススヌーピング
 個々のキャッシュ機構がアドレスバスを常に監視し、キャッシュ上にあるメモリ位置へのアクセスがないかを見ている。キャッシュ上にあるメモリ位置へのライトが観測されたら、キャッシュコントローラが自身のキャッシュ上のコピーを無効化する。
 スナーフィング (snarfing)
 キャッシュコントローラはバスのアドレスとデータ双方を監視し、自身のキャッシュ上のコピーのある位置が更新されたら、キャッシュの内容もそれに合わせて更新する。

分散共有メモリシステムはこれらの機構を疎結合システムに分散配置されたメモリ間でも擬似的に実現し、一貫性を保とうとする。

ディレクトリとスヌーピングはよく研究されていて、それぞれの利点と欠点がよく分かっている。スヌーピングは各ノードの帯域幅が十分大きければ性能がよい。しかし、スケーラビリティはよくない。全てのメモリアクセス要求を全体にブロードキャストしなければならないため、ノード数が増えるとバスの帯域幅もより大きくしなければならなくなる。一方ディレクトリはレイテンシが大きくなる傾向がある（ノードとメモリの間にディレクトリ機構があるため）が、ブロードキャストが不要であるため帯域幅は小さくてもよい。このため、64プロセッサ以上程度の大規模システムではディレクトリベースのキャッシュコヒーレンシを使うことが多い。

一貫性モデル 
キャッシュコヒーレンシを保つための各種モデルやプロトコルが考案されてきた。以下に主なものを挙げる。
 MESIプロトコル（イリノイプロトコル）
 MSIプロトコル
 MOSIプロトコル
 MOESIプロトコル

 Synapse protocol
 Berkeley protocol

一貫性モデルの選択はキャッシュコヒーレンシシステムの設計においては重要である。一貫性モデルには様々な性能とスケーラビリティのものがあり、個々のシステム毎にどれが最適かは異なる。

さらに、それぞれの実装でどのように状態遷移させるかも様々である。リードやライトで更新するのか無効化するのかによっても4種類の遷移の組合せが考えられる。状態遷移の選択によってキャッシュ間のトラフィック量が変わり、それが全体としての実際の帯域幅にも影響する。マルチプロセッサのキャッシュ間で頻繁に衝突が発生するようなソフトウェアでは、この点も考慮する必要がある。

関連項目 
ccNUMA
メモリバリア

参考文献 
 Handy, Jim. The Cache Memory Book. Academic Press, Inc., 1998. ISBN 0-12-322980-4

CPU
並列コンピューティング
メモリ管理
キャッシュ