キャッシュへの書き込みと同時に主記憶にも書き込む方式
ライトスルー方式(write through)とは、CPUがデータを書き込むとき、キャッシュへの書き込みと同時に主記憶にも同じ値を書き込む方式のことです。「through(通り抜けて)」という名前の通り、書き込みがキャッシュを通り抜けて主記憶まで届くイメージです。
キャッシュは普段、主記憶のデータのコピーを持っています。ここで「キャッシュだけ書き換えて主記憶は古いまま」にしてしまうと、両者の値が食い違ってしまいます(一貫性の問題)。ライトスルー方式は、書き込みのたびに主記憶も必ず更新することで、キャッシュと主記憶の値を常に一致させるのが特徴です。
身近な例で考えると、手帳に予定を書くと同時にスマホのカレンダーにも入力するようなものです。手帳(キャッシュ)だけに書いておくと、後でスマホ(主記憶)と食い違って混乱します。書くたびに両方へ反映しておけば、どちらを見ても同じ予定が確認できます。上のツールで▶ボタンを押すと、CPUの書き込みがキャッシュと主記憶の両方に反映される流れが1ステップずつ見られます。
ライトスルー方式での書き込みは、おおむね次の流れで進みます。
・① CPUが書き込みを要求:「この番地にこの値を書け」とキャッシュへ伝える
・② キャッシュを更新:キャッシュ上の値を新しい値に書き換える
・③ 主記憶も更新:同時に主記憶の同じ番地にも新しい値を書き込む
・④ 完了:キャッシュと主記憶が同じ値になり一致が保たれる
ポイントは、②と③が「同時」に行われることです。キャッシュにだけ書いて主記憶を後回しにする、ということはしません。そのため、書き込み処理が完了した時点では必ず両者の値が一致しています。上のStats(統計)で「キャッシュの値」「主記憶の値」「一貫性」が、ステップを進めるごとにどう変わるか確認してください。途中の「キャッシュへ書き込み」の段階では一瞬だけ値が食い違いますが、すぐに主記憶も更新されて一致に戻ります。
なお、書き込みではなく読み込みのときは、これまで学んだキャッシュの動き(ヒットなら高速、ミスなら主記憶から取得)と同じです。ライトスルー/ライトバックという区別は、あくまで書き込み時の主記憶の更新タイミングについての方式の違いです。
ライトスルー方式には、はっきりとした利点と欠点があります。「常に一致させる」という性質の裏返しとして、書き込みが遅くなる、という関係です。
上のツールの「主記憶の書き込み完了を待つ」ステップが、まさに欠点を表しています。書き込みのたびに遅い主記憶アクセスが発生するため、書き込みが多いプログラムでは性能が落ちやすいのです。
この欠点を改善したのがライトバック方式です。ライトバックでは書き込みをいったんキャッシュだけに留め、そのデータがキャッシュから追い出されるときにまとめて主記憶へ書き戻します。書き込みは速くなりますが、追い出すまではキャッシュと主記憶の値が食い違うため、一貫性の管理が複雑になります。「一貫性のライトスルー」対「速度のライトバック」というトレードオフ(あちらを立てればこちらが立たない関係)として対比して覚えるとよいでしょう。
ライトスルーとライトバックは、「主記憶をいつ更新するか」という書き込み方式の違いです。どちらも「キャッシュに書く」という点は同じですが、そのあとの主記憶への反映タイミングが異なります。
| ライトスルー | ライトバック | |
|---|---|---|
| 主記憶の更新 | 書き込みと同時(毎回) | 後でまとめて(追い出し時) |
| 書き込み速度 | 遅い(主記憶を毎回待つ) | 速い(キャッシュだけで完了) |
| キャッシュと主記憶の一致 | 常に一致 | 追い出すまで不一致になる |
| 仕組みの複雑さ | シンプル | 複雑(ダーティフラグ管理が必要) |
| データの安全性 | 高い(停電でも主記憶に最新値) | 低い(キャッシュだけに最新値の期間がある) |
表中のダーティフラグ(=「キャッシュの内容が主記憶と食い違っている」という目印)は、ライトバックで使われる重要な概念です。キャッシュの各行に「まだ主記憶に書き戻していない」フラグを立て、追い出すときだけ主記憶に書き戻す仕組みです。ライトスルーにはこの管理が不要な分、仕組みがシンプルになります。
キャッシュ(cache)とは、CPUと主記憶の間に置かれた、小容量だが高速なメモリのことです。なぜ必要かというと、CPUと主記憶の間には大きな速度差があるからです。
速度差の理由を整理すると次のようになります。
・CPU:計算を行う装置。ナノ秒( ns =10億分の1秒)単位で動作する非常に高速な素子
・主記憶(メインメモリ):データを一時的に保持する場所。DRAM でできており、CPU に比べると数十〜数百倍遅い
この速度差のせいで、CPU が計算するたびに主記憶を読みに行くと、大部分の時間を「待ち」に費やしてしまいます。
身近な例で考えると、図書館の本棚(主記憶)から必要な本をいちいち取りに行く代わりに、机の上によく使う本を手元に置いておく(キャッシュ)イメージです。手元にある(キャッシュにヒット)なら一瞬でアクセスでき、手元にないときだけ本棚(主記憶)へ取りに行きます。このキャッシュがあるおかげで、CPU はほとんどの場合、主記憶を待たずに高速でデータを読み書きできます。