0

次のような状況があるとします。書き込みバッファを備えた 2 つの CPU で、キャッシュ コヒーレンス プロトコルとして MESI が使用されています。そして、CPU 間に 1 つの共有キャッシュ ラインがあります。

CPU1 キャッシュ:|I|I|S|I|I|

CPU2 キャッシュ:|I|I|S|I|I|

ここで、CPU1 は共有回線を変更することを決定します。変更レコードを書き込みバッファに置き、無効化メッセージを CPU2 に送信します。CPU2 はそれを受信し、確認応答を送信します。

CPU1 キャッシュ: |I|I|S|I|I|、CPU1 書き込みバッファ:change for the 3rd cache line

CPU2 キャッシュ:|I|I|I|I|I|

CPU1 が確認応答を受信すると、書き込みバッファをフラッシュしてキャッシュ ラインの状態を M(modified) に変更する必要がないというのは正しいですか? そうでない場合は、さらに先に進みましょう。

ここで、CPU2 がこのキャッシュ ラインを再度読み取りたいとします。スヌーピング CPU1 はこの読み取り要求をインターセプトする必要がありflush buffer->flush cache line->send the last value of the cache line to CPU2ますか? または、それを無視して、CPU2 が RAM (まだ変更されていない) に要求することによって古い値を保持している可能性がありますか?

4

1 に答える 1

1

標準の MESI プロトコルでは、無効化されたトランザクションの確認はありません。あなたの例では、キャッシュ ラインは CPU1 のM状態に遷移し、書き込みは書き込みバッファーからリタイアされます。

CPU2 が読み取りを行うと、CPU1 は変更された行をメモリに書き込みます。CPU2 は、CPU1 またはメモリから値を取得できます (CPU1 の書き込みが完了した後のみ)。O(Owned)状態がないため、メモリへの書き込みが必要です。

キャッシュ ラインが共有されているかどうかを示す信号を使用するDragonプロトコルのようなプロトコルがあります。

于 2015-04-16T07:03:51.283 に答える