MESIプロトコル

MSIプロトコルやMOSIプロトコルでは、メモリから読まれたままの状態のキャッシュラインはShared状態であるが、このキャッシュラインに書き込みを行う場合は、他のプロセサのキャッシュにも同じキャッシュラインが存在する可能性があるので、書き込み前にスヌープして無効化を行う必要がある。

しかし、一般的には各プロセサは別々の仕事をしている場合が多く、複数のプロセサが同時並行的に同じデータを使うことは比較的頻度が低いので、この無効化は無駄な操作になる場合が多い。

この無駄を省こうというのがMESIプロトコル(メシと発音する)である。MESIプロトコルでは、Modified、Shared、Invalidに加えてExclusiveという状態を設ける。このExclusive状態は、メモリから読んだままで変更されておらず、かつ、他のプロセサのキャッシュには同じアドレスのキャッシュラインは存在していないという状態である。

ストア命令による書き込みの場合、そのアドレスのキャッシュラインがExclusive状態であれば他のプロセサのキャッシュに存在しないことが保証されているので、スヌープ、無効化を省いてキャッシュへの書き込みを行うことができ、効率が良い。

MESIプロトコルでは、キャッシュをミスしたメモリアクセスはスヌープを行い、他のプロセサにそのアドレスのキャッシュラインが存在しない場合は、メインメモリにアクセスしてデータを得る。この場合、他のプロセサのキャッシュにはそのアドレスのキャッシュラインは存在しないので、その状態はExclusiveとする。

一方、他のプロセサのキャッシュに目的のアドレスのキャッシュラインが存在する場合は、それがModified状態のキャッシュラインである場合は、前出の図9.6に示したMSIプロトコルの場合と同様に、Modifiedのキャッシュラインをメインメモリに書きだし、メモリ経由で書きかえられたデータを受け取る。そして、ModifiedのキャッシュラインはShared状態に変更する。また、データを得たプロセサのキャッシュラインも、他のプロセサのキャッシュに同じアドレスのキャッシュラインが存在するので、Shared状態とする。

キャッシュミスのスヌープで他のプロセサにExclusive、あるいはSharedのキャッシュラインがあることが判明した場合は、メインメモリからデータを読みキャッシュミスしたプロセサのキャッシュに書き込む。この場合、同じアドレスのキャッシュラインが複数のプロセサのキャッシュに存在することになるので、Exclusiveであったキャッシュラインの状態はSharedに変更し、新たにメモリから同じデータを読み込んだプロセサのキャッシュラインもShared状態とする。

MOSIプロトコルの場合は、プロセサのキャッシュ間で直接データ転送を行う制御機構が必要となるが、MSI、あるいは、MESIプロトコルを使用する場合は、メインメモリへの書きだしの終了をアクセス元のプロセサに連絡する必要はあるが、メモリアクセスは通常の書き込みと読み出しで済み、キャッシュライン間転送のような特別な機構が要らないというメリットがある。