メモリ一貫性とは(全体像)
複数のCPU(マルチコア)がそれぞれキャッシュを持っていると、同じデータをめぐって、CPUごとに見え方が食い違うことがある。あるCPUが書きかえた値を、別のCPUが古いまま見てしまうと困る。これを防ぐのがメモリ一貫性だ。
身近にたとえると、複数人で同じ共同編集ドキュメントをいじるのに似ている。「誰が最新版を持っているか」「複数人が同じものを見ているか」「その内容はもう古いか」を追跡しないと、ばらばらになってしまう。
その追跡を機械でやるのが、次に説明するMESIだ。
詳しく:MESIの4状態とメモリモデルだけ覚えれば戦える
ここが記事の心臓部。MESIは、各CPUのキャッシュの状態を4つで管理するしくみだ。
MESIの4状態
| 状態 | 読み | 意味 |
|---|---|---|
| M | Modified | 自分のキャッシュだけが最新版(メモリは古い) |
| E | Exclusive | 自分のキャッシュだけが持っている(メモリと同じ) |
| S | Shared | 複数のCPUが同じデータを持っている |
| I | Invalid | このキャッシュは無効(使えない) |
CPUが読み書きするたびに、各キャッシュの状態がこの4つの間を移り変わる。これで、マルチコアでもキャッシュが食い違わないようにする。
ここで取り違えやすいのが、MESIは「キャッシュの状態を管理するしくみ」であって、ネットワークの通信プロトコルではないこと。名前がプロトコルっぽいが、別ものだ。
もう1つ大事なのが、メモリモデルはCPUの種類で違うこと。
CPUごとのメモリモデル
| CPU | メモリの順序 |
|---|---|
| x86 | 比較的厳格(順序が守られやすい) |
| ARM | 緩い(順序が入れかわることがある) |
つまり、同じプログラムでも、x86とARMで動きが変わることがある。順序を確実にしたいときは、メモリバリア(順序を強制する命令)を使う、というわけだね。
わかりやすく言い換えると
要するに、メモリ一貫性は「みんなが同じ最新の中身を見るための整合管理」だ。
①MESIの4状態 … M(自分だけ最新)・E(自分だけ持つ)・S(複数で共有)・I(無効)
②MESIの正体 … キャッシュの状態管理のしくみ(通信プロトコルではない)
③メモリモデル … CPUで違う。x86は厳格、ARMは緩い
「MESIは通信プロトコルではない」「メモリモデルはCPUで違う」だけは取り違えやすい。
試験のツボ
🔴 一番出る:MESIはキャッシュの状態管理
①マルチコアでキャッシュが食い違わないようにするしくみ
②ネットワークの通信プロトコルではない
🔴 次に出る:4状態の意味
①M=自分だけ最新、E=自分だけ持つ
②S=複数で共有、I=無効
🟡 押さえると安定:メモリモデルはCPUで違う
①x86は比較的厳格、ARMは緩い
②同じプログラムでも動きが変わることがある
よくある間違い
①「MESIはネットワークの通信プロトコル」→ ✗ MESIはキャッシュの状態を管理するしくみ。通信プロトコルとは別もの。
②「メモリモデルはどのCPUでも同じ」→ ✗ x86は厳格、ARMは緩いなど、CPUの種類で違う。
③「Mは複数のCPUが同じデータを共有している状態」→ ✗ 共有はS(Shared)。Mは自分のキャッシュだけが最新の状態。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(MESIの正体)
MESIに関する次の記述のうち、正しいものはどれか。
- MESIはネットワークの通信プロトコルで、キャッシュとはいっさい関係がないものだ
- MESIはメモリをいっさい使わず、CPU内部だけで計算を完結させるしくみとされている
- MESIはマルチコアでキャッシュが食い違わないようにする、状態を管理するしくみである
- MESIは単一CPUのためのしくみで、複数CPUにはいっさい使われないものとされている
解答は 3 である。
MESIはマルチコアでキャッシュが食い違わないようにする、状態を管理するしくみなのだ。通信プロトコルではないなるぞ。
選択肢1の「通信プロトコル」、選択肢2の「CPU内部だけ」、選択肢4の「単一CPU」はどれも誤りである。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | キャッシュの状態管理 |
| 2 | ✗ | キャッシュとメモリの整合 |
| 3 | ✓ | キャッシュ一貫性の状態管理 |
| 4 | ✗ | マルチコアで使う |
オリジナル問題2(4状態の意味)
MESIの4状態に関する次の記述のうち、正しいものはどれか。
- Mは自分のキャッシュだけが最新、Sは複数のCPUが同じデータを共有する状態である
- Mは複数のCPUが共有する状態、Sは自分のキャッシュだけが最新の状態とされている
- MもSもIもまったく同じ意味で、状態を分ける理由はいっさいないものとされている
- Iはこのキャッシュが最新で有効な状態を表し、すぐに使えるものとされているものだ
解答は 1 である。
Mは自分のキャッシュだけが最新、Sは複数のCPUが同じデータを共有する状態なのだ。Iは無効な状態なるぞ。
選択肢2はMとSが逆。選択肢3の「同じ意味」、選択肢4の「Iは有効」はどちらも誤りである。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | M=自分だけ最新・S=共有 |
| 2 | ✗ | MとSが逆 |
| 3 | ✗ | 状態で意味が違う |
| 4 | ✗ | Iは無効な状態 |
オリジナル問題3(メモリモデル)
CPUのメモリモデルに関する次の記述のうち、正しいものはどれか。
- メモリモデルはどのCPUでも完全に同じで、x86とARMに違いはないものとされている
- メモリモデルはCPUで違い、x86は比較的厳格、ARMは緩いという特徴を持っている
- メモリモデルはx86が緩く、ARMが厳格という、実際とは逆の関係になっている
- メモリモデルはCPUとは無関係で、ディスクの読み書きの順序を決めるものとされている
解答は 2 である。
メモリモデルはCPUで違い、x86は比較的厳格、ARMは緩いという特徴なのだ。同じプログラムでも動きが変わることがあるなるぞ。
選択肢1の「同じ」、選択肢3の「x86が緩い」、選択肢4の「ディスクの順序」はどれも誤りである。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | CPUで違う |
| 2 | ✓ | x86は厳格・ARMは緩い |
| 3 | ✗ | 厳格・緩いが逆 |
| 4 | ✗ | メモリの順序の話 |
まとめ
押さえどころ
- 🔴 MESIの正体 = マルチコアでキャッシュが食い違わないようにする状態管理のしくみ。通信プロトコルではない。
- 🔴 4状態 = M(自分だけ最新)・E(自分だけ持つ)・S(共有)・I(無効)。
- 🟡 メモリモデル = CPUで違う。x86は厳格、ARMは緩い。順序を確実にするにはメモリバリア。
次に学ぶ
執筆: SikakuQuest編集部