キャッシュコヒーレンシ(英: cache coherency)とは、共有リソースに対する複数のキャッシュの一貫性を意味する。キャッシュコヒーレンシはメモリ一貫性の一種である。
複数のクライアントが共有メモリリソースのキャッシュを保持するとき、キャッシュ間のデータの不一致という問題が生じる。この問題は特にマルチプロセッシングシステムのCPU間で顕著である。右図において、上のクライアントがメモリのある部分を以前に読み込んでいてキャッシュ上にコピーを保持しているとき、下のクライアントが同じメモリ部分を更新すると、更新を何らかの方法で伝えない限り上のクライアントのキャッシュの内容は不正となる。キャッシュコヒーレンシはそのような状況に対処し、キャッシュとメモリの間の一貫性を保つことである。
一貫性を保つには、同じメモリ位置へのリードとライトの振る舞いを定義する。キャッシュコヒーレンシは以下の条件に適合するよう行われる。
これらの条件はリードやライトが瞬間的に行われると仮定して定義している。しかし、実際のハードウェアではメモリレイテンシもあるし、その他アーキテクチャ上の制約によって瞬間的にリードやライトを実行することはできない。プロセッサXがライトを発行した直後にプロセッサYがリードを発行したとき、その間隔が短いとYにはXがライトした内容が見えない場合がある。メモリ一貫性モデルでは、ライトで書き込んだ値はその後の他のプロセッサからのリードで必ず取得できるようにしなければならない。
分散共有メモリシステムはこれらの機構を疎結合システムに分散配置されたメモリ間でも擬似的に実現し、一貫性を保とうとする。
ディレクトリとスヌーピングはよく研究されていて、それぞれの利点と欠点がよく分かっている。スヌーピングは各ノードの帯域幅が十分大きければ性能がよい。しかし、スケーラビリティはよくない。全てのメモリアクセス要求を全体にブロードキャストしなければならないため、ノード数が増えるとバスの帯域幅もより大きくしなければならなくなる。一方ディレクトリはレイテンシが大きくなる傾向がある(ノードとメモリの間にディレクトリ機構があるため)が、ブロードキャストが不要であるため帯域幅は小さくてもよい。このため、64プロセッサ以上程度の大規模システムではディレクトリベースのキャッシュコヒーレンシを使うことが多い。
キャッシュコヒーレンシを保つための各種モデルやプロトコルが考案されてきた。以下に主なものを挙げる。
一貫性モデルの選択はキャッシュコヒーレンシシステムの設計においては重要である。一貫性モデルには様々な性能とスケーラビリティのものがあり、個々のシステム毎にどれが最適かは異なる。
さらに、それぞれの実装でどのように状態遷移させるかも様々である。リードやライトで更新するのか無効化するのかによっても4種類の遷移の組合せが考えられる。状態遷移の選択によってキャッシュ間のトラフィック量が変わり、それが全体としての実際の帯域幅にも影響する。マルチプロセッサのキャッシュ間で頻繁に衝突が発生するようなソフトウェアでは、この点も考慮する必要がある。