MOSIプロトコル

MSIプロトコルでは、キャッシュミスをしたプロセサがModifiedのキャッシュラインのデータを受け取る場合は、まず、Modifiedのキャッシュラインをメインメモリに書きだして、それを読むという2回のメモリアクセスが必要となる。これは無駄が多いので、直接、Modifiedのキャッシュラインのデータをキャッシュミスしたプロセサのキャッシュに送れるようにしようというのがMOSI(モジと発音する)プロトコルである。

MOSIプロトコルでは、新たに"Owned"という状態を追加する。そして、他のプロセサに書きかえられた最新のデータを供給したModifiedのキャッシュラインの状態をOwnedに変更する。また、データを受け取ったキャッシュラインの状態はSharedとする。

ここで、注意が必要なのは、 MSIプロトコルのShared状態の定義はメモリと同じデータを持つというものであったが、MOSIプロトコルでは、Shared状態は、メモリとは異なっているが他のプロセサのキャッシュラインに同じデータがある場合を含むように変更されている点である。

データを供給した方のプロセサにとっても他のプロセサのキャッシュに同じデータが存在するのである意味ではShared状態であるが、このキャッシュラインの状態をSharedにしてしまうと、複数のSharedのプロセサのどれが最終的に変更されたデータをメインメモリに書き戻すべきかが分からなくなってしまう。このため、書き戻しの責任者ということで新たにOwnedという属性を設け、図9.7に示すように、データを供給したModifiedのキャッシュラインの状態をOwnedに変更する。つまり、Owned状態のキャッシュラインは、書き換えが行われており、かつ、同じ内容のキャッシュラインが他のプロセサのキャッシュにも存在するという状態である(正確に言うと、プロセサ2に読み込まれたキャッシュラインが、その後、他のデータの読み込みのために追い出されてしまう場合があり、必ず、同じ内容のキャッシュラインが他のプロセサのキャッシュに存在することは保障されていない)。

図9.7 MOSIプロトコルでのキャッシュラインのModifiedからOwnedへの状態変化

なお、MOSIプロトコルでは、Owned状態のキャッシュラインは、まだ、メインメモリに書き戻されていないので、そのアドレスへの他のプロセサからのアクセスに対しては、Owned状態のキャッシュラインを持つプロセサがデータを送り返す必要がある。また、Owned状態のキャッシュラインに書き込みを行う場合は、他のプロセサにShared状態の同一アドレスのキャッシュラインがあり得るので、スヌープを行い、他のプロセサの対応するキャッシュラインを無効化してコヒーレンスを取る必要がある。