MOESIプロトコル

また、ModifiedとExclusiveの両方の状態を持つ、MOESIプロトコル(モエジと発音する)を用いるキャッシュも存在する。MOESIプロトコルでは、MOSIプロトコルと同様にプロセサ間で直接、キャッシュラインの転送を行ってメモリアクセス回数を減らし、かつ、メモリから読み込んだデータが書き換えられておらず、他のプロセサのキャッシュに存在しない場合はExclusive状態として、そのキャッシュラインへの書き込みに際して無効化指令を送る必要も無くしている。

マルチコアプロセサの場合、各プロセサコアのキャッシュ間は物理的距離が非常に短く、かつ、多数の信号線を使うことができるので、高速、高バンド幅のデータ転送ができる。一方、メインメモリはCPUチップから(IntelのFSBを使うシステムではメモリコントローラチップを経由して)ボード上の配線を通ってDIMMに搭載されたDRAMチップをアクセスすることになり、一般的にはチップ内のデータ転送に比べて数十から100倍程度の長い時間がかかる。

このように、メインメモリへのアクセス時間と比較して、プロセサ間のキャッシュライン転送時間が非常に短く高速に実行できる場合は、性能的には、メインメモリへの書き戻しを行わずにコア間の直接データ転送を行うMOSIやMOESIプロトコルが有利である。

ただし、マルチソケットのサーバなどの場合は、一方のソケットのプロセサのキャッシュラインを他方のソケットのプロセサのキャッシュに転送する必要が出るので、メインメモリアクセスよりは速いものの、シングルチップの場合ほどの大きなメリットはない。

また、ここで述べたMOSI、MESI、MOESIなどのプロトコルは、単一のメインメモリに対して、複数のプロセサのキャッシュが一様に接続されている構造を想定して作られており、プロセサ間の接続が、チップ内、チップ間などと階層を持つ構造では、IBMのPOWERプロセサのようにキャッシュ制御のために接続構造に応じた(MOESI以外の)状態を追加して、効率化を図るプロセサシステムもある。

なお、無効化指令であるが、無効化指令の到着時に、自分のプロセサコア内から同じアドレスのキャッシュラインに対してアクセス要求が出て、両者がぶつかることが有り得る。このような場合、プロセサ内の調停機構がどちらを優先するかを判断し、無効化指令が負けた場合は、指令を拒否する応答を返す。このとき、無効化指令を出したプロセサは、どれかのプロセサから指令を拒否された場合は、原因となった書き込みなどの実行を中断し、暫く待ってからリトライすることになる。一方、無効化指令の方が優先された場合は、指令の受領応答を返し、プロセサ内からのアクセス要求を待たせる。

こう書くと簡単であるが、どちらの要求もパイプライン的に処理されており、それを途中で止めるのはかならずしも簡単ではない。このように、マルチプロセサでのキャッシュコヒーレンシ制御はバグの出やすい部分であり、注意深い設計が必要である。