MSI・MESI・MOESIの違い:状態の数・Exclusive状態・Owned状態・通信を比較

MSI・MESI・MOESIは、マルチコアの各キャッシュが持つラインに状態をつけて、同じアドレスのデータが食い違わないようにするプロトコルです。MSIはModified・Shared・Invalidの3つの状態だけの基本形です。MESIはExclusive(自分だけが持ち、メモリと同じ内容)を加え、ほかのコアが持っていないデータへの書き込みで、バスへの通信を省けます。MOESIはさらにOwned状態を加え、書き換えたデータをメモリに書き戻さないまま、ほかのキャッシュと共有できます。

項目MSIMESIMOESI
状態の数3つ(M、S、I)4つ(M、E、S、I)5つ(M、O、E、S、I)
Modified(M)自分だけが持ち、内容はメモリと違う同じ同じ
Shared(S)ほかのキャッシュも持っている可能性がある。内容はメモリと同じ同じほかのキャッシュも持っている可能性がある。内容はメモリと違うこともある(O状態のラインがあるとき)
Exclusive(E)なし自分だけが持ち、内容はメモリと同じあり(MESIと同じ)
Owned(O)なしなし内容はメモリと違うが、ほかのキャッシュもSで共有している。メモリへの書き戻しの責任を持つ
ほかに持つコアがないデータを読んだときS状態で入るE状態で入るE状態で入る
そのデータに書き込むときSからMに変えるため、ほかのコピーを無効にする要求をバスなどに出すEからMへ、通信なしで変われるEからMへ、通信なしで変われる
Mのラインをほかのコアが読んだときメモリに書き戻し、両方ともS状態になるメモリに書き戻し、両方ともS状態になる(データはキャッシュから直接渡すこともある)書き戻さずにデータを渡し、自分はO状態、相手はS状態になる
メモリへの書き戻し変更されたラインがほかのコアに読まれるたびに起こる変更されたラインがほかのコアに読まれるたびに起こるO状態のラインが追い出されるときまで遅らせられる
状態を表すビット数と複雑さ2ビット。最も簡単2ビット。中くらい3ビット。最も複雑

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

MSI
コヒーレンシの仕組みを学ぶときの基本形。状態の遷移をできるだけ簡単にしたいとき。
MESI
1つのコアだけが使うデータの読み書きが多いとき。E状態のおかげで、読んでから書く処理で通信を省けます。多くのマルチコアCPUのプロトコルの土台になっています。
MOESI
コアどうしで書き換えたデータを頻繁に受け渡すとき。メモリへの書き戻しを減らし、メモリの帯域を節約したいとき。

よくある質問

MESIのE状態があると、何がよいのですか?

ほかのコアが持っていないデータを読み込むとE状態になり、そのあと書き込むときに、ほかのコアへ知らせずにM状態へ変われます。MSIでは同じ場合にS状態で入るので、書き込みのたびに無効化の要求を出す必要があります。1つのスレッドだけが使うデータの「読んでから書く」処理でバスの通信を減らせます。

MOESIのO状態があると、何がよいのですか?

書き換えたデータ(M状態)をほかのコアが読むとき、MESIではメモリに書き戻してから共有しますが、MOESIでは書き戻さずにキャッシュどうしでデータを渡し、元のキャッシュがO状態として書き戻しの責任を持ち続けます。メモリへの書き込みを減らせます。

E状態とM状態はどう違いますか?

どちらも、そのラインを持っているのは自分のキャッシュだけです。E状態は内容がメモリと同じなので、追い出すときに書き戻す必要がありません。M状態は書き換えられていてメモリと内容が違うので、追い出すときに書き戻しが必要です。

これらのプロトコルは、スヌーピングとディレクトリ方式のどちらで使われますか?

どちらでも使えます。MSI・MESI・MOESIはラインの状態の決め方で、ほかのキャッシュへの知らせ方(共有のバスなどを監視するスヌーピングか、ラインの持ち主を記録するディレクトリ方式か)とは別の話です。

理解度チェック

キャッシュコヒーレンシのプロトコルであるMESIの4つの状態の組み合わせとして正しいものはどれか。

  1. AMemory、Execute、Store、Index
  2. BModified、Exclusive、Shared、Invalid
  3. CMiss、Evict、Swap、Idle
答えと解説を見る

正解:B. Modified、Exclusive、Shared、Invalid

MESIでは、キャッシュの各ラインが、変更済みで自分だけが持つModified、変更はないが自分だけが持つExclusive、複数のコアが同じ内容を持つShared、無効なInvalidのどれかの状態をとります。コアが読み書きしたり、ほかのコアの読み書きを知ったりするたびに状態が移り変わり、同じ番地のデータの食い違いを防ぎます。

MESIプロトコルでキャッシュのラインがModified(M)状態にあるときの意味として正しいものはどれか。

  1. Aこのコアだけがそのラインを持ち、内容は主記憶と違う(書き戻しが必要)
  2. B複数のコアが同じ内容を持ち、主記憶とも一致している
  3. Cこのラインの内容は使えず、読むにはもう一度取ってくる必要がある
答えと解説を見る

正解:A. このコアだけがそのラインを持ち、内容は主記憶と違う(書き戻しが必要)

M状態は、このコアが書き込みをして、最新の値を自分だけが持っている状態です。主記憶の値は古いので、このラインを追い出すときや、ほかのコアが読もうとしたときには、最新の値を書き戻すか直接渡す必要があります。M状態のラインには、ほかのコアに知らせずにそのまま何度でも書き込めるので、同じコアが続けて書き込むときは速く処理できます。

MESIプロトコルで、Exclusive(E)状態のラインにそのコアが書き込むときの動作として正しいものはどれか。

  1. Aほかのすべてのコアに無効化の要求を送ってから書き込む
  2. B書き込みはできないので、いったん主記憶に書いてから読み直す
  3. Cほかのコアに知らせる必要がなく、そのままM状態に変わる
答えと解説を見る

正解:C. ほかのコアに知らせる必要がなく、そのままM状態に変わる

E状態は、このコアだけがラインを持ち、内容が主記憶と同じ状態です。ほかのコアにコピーがないと分かっているので、書き込むときに無効化の通知をせずにM状態へ移れます。1つのコアだけが使うデータを読んでから書く、というよくある処理で通信を省けるのが、E状態を設ける利点です。S状態から書き込む場合は、ほかのコピーの無効化が必要です。

  1. 無効化型のコヒーレンシプロトコルで、あるコアがShared(S)状態のラインに書き込むときに行われることはどれか。
  2. MESIプロトコルで、コア0がModified(M)状態で持っているラインを、コア1が読もうとしたときの一般的な動作はどれか。
  3. キャッシュコヒーレンシのスヌーピング方式の説明として正しいものはどれか。

マルチコアと同期の練習問題へ

関連する用語の解説

MESIプロトコル
キャッシュの各ラインをModified・Exclusive・Shared・Invalidの4つの状態で管理するコヒーレンシのプロトコル。書き込みのときにほかのコアのコピーを無効にする。
キャッシュコヒーレンシ
マルチコアのCPUで、各コアのキャッシュに同じアドレスのデータがあるとき、その内容の一貫性を保つ仕組み。あるコアが書き換えると、他のコアの古いコピーを無効にするなどして実現する。
スヌーピング
各キャッシュが共有のバスなどに流れるほかのコアの読み書きを監視し、自分のラインの状態を変えるコヒーレンシの方式。コアの数が少ないときに向く。
キャッシュライン
キャッシュと下の階層の間でデータを読み書きする単位。キャッシュブロックともいう。多くのCPUでは64バイトで、アドレスの下位ビットがライン内の位置(オフセット)を表す。
ディレクトリ方式
各ラインをどのコアが持っているかを表に記録し、関係するコアにだけ通知するコヒーレンシの方式。コアの数が多いシステムで使われる。

関連する比較