バススヌーピング

バススヌーピング（、またはバススヌープ、スヌープキャッシュ）は、分散共有メモリとマルチプロセッサを備えたシステムでキャッシュコヒーレンシを実現するために用いられる技術である。

システムにメインメモリが一つしかない場合でも、キャッシュメモリがプロセッサごとに一つずつ（システム全体では複数）存在し、何らかの対策を施さない限り同じメモリが複数のキャッシュにロードされ異なる値を持ってしまう可能性がある。これを防止するため、各キャッシュコントローラはバスを監視し、バス上に流れるブロードキャストの通知を受け、必要に応じて特定のキャッシュラインを無効にする。

各キャッシュラインは「更新済み」（ローカルのプロセッサが更新）、「有効」/「無効」、「共有」の状態を持つ。ローカルキャッシュの読み取りミスすると、バス上にリード要求がブロードキャストされる。あるノードでそのアドレスをキャッシュされており、かつ「更新済み」状態であるなら、そのノードでキャッシュラインの状態を「有効」に変え、情報のコピーを要求したノードに送出する。

ローカルキャッシュの書き込みミスが発生すると、他のキャッシュにあるコピーが「無効」になることが
バススヌーピングにより保証される。「有効」状態のブロックへの書き込みを行う場合には、キャッシュラインの状態が「更新済み」に変更され、すべてのキャッシュコントローラに、そのラインを無効にするようブロードキャストが送られる。

スヌーピングによる方法は大規模化にうまく対応できないので、規模の大きいccNumaシステムではディレクトリベースの一貫性機構を用いる傾向にある。

実装 
キャッシュが3つの状態ビットを持つとする。

 V: 有効(Valid)
 D: 更新済み(Dirty), キャッシュ内のデータはメモリと異なっていることを示す
 S: 共有(Shared)

 タグ | ID | V | D | S
 ---------------------
 1111 | 00 | 1 | 0 | 0
 0000 | 01 | 0 | 0 | 0
 0000 | 10 | 1 | 0 | 1
 0000 | 11 | 0 | 0 | 0

アドレス 1111 に 00 を書き込むと、下記のようになる。

 Tag  | ID | V | D | S
 ---------------------
 1111 | 00 | 1 | 1 | 0
 0000 | 01 | 0 | 0 | 0
 0000 | 10 | 1 | 0 | 1
 0000 | 11 | 0 | 0 | 0

キャッシュ機構はバスを監視し、キャッシュメモリへの要求が発生するかを確認する。

キャッシュが更新済みかつ共有状態であり、バスがそのメモリを要求すると、スヌーピングの機構がキャッシュからデータを取り出し、メモリを必要とするすべてのノードに対しメモリが更新されたことを通知する。

他のノードがキャッシュの更新を通知されると、そのキャッシュの有効ビットをクリアする。こうして元のキャッシュは排他的（Sビットが0）とマークされる。

更新済みとマークされたアドレスを無効化する（すなわちあるキャッシュが更新済みのアドレスを持っており、他のキャッシュがそこに書き込みを行う場合）キャッシュは要求を無視する。新しいキャッシュは更新済みで、有効かつ排他的とマークされ、以降そのアドレスに対する責任を担う。

外部リンク
 Jim Plusquellic. Centralized Shared-Memory Architectures.

キャッシュコヒーレンシ