キャッシュにだけ書き込み、追い出し時にまとめて主記憶へ書き戻す方式
ライトバック方式とは、CPU がデータを書き込むとき、速いキャッシュにだけ書き込んで主記憶(メインメモリ)への反映を後回しにする方式のことです。キャッシュ=CPU のすぐそばにある小さくて高速な記憶のこと、主記憶=容量は大きいが少し遅いメインメモリのことです。
キャッシュだけ更新すると、キャッシュの値と主記憶の値が一時的にずれます。そこで、更新した行にダーティビット(=「この行はキャッシュ側が新しい」という1ビットの印)を立てておき、その行が追い出されるときに初めて主記憶へ書き戻します。上のツールで▶ボタンを押すと、書込み → ダーティ印 → 追い出し → 書き戻し、の流れを順番に確認できます。
身近な例で言うと、レジ係が会計のたびに金庫まで走るのではなく、手元のレジ(キャッシュ)にお金をためておき、引き継ぎ(追い出し)のときに金庫(主記憶)へまとめて入れるイメージです。何度も金庫へ往復しないぶん、会計(書込み)が速く回ります。
ライトバックの動作は、大きく分けて「書込み時」と「追い出し時」の2つの場面に分かれます。それぞれで主記憶に触れるかどうかが変わります。
書込みが起きたときの流れは次のとおりです。
・キャッシュにヒット:キャッシュ内の値だけを書き換える(主記憶には書かない)
・ダーティビットを1にする:「この行はキャッシュ側が新しい」と印を付ける
・主記憶はそのまま:何度書き込んでも、毎回は主記憶へ行かない
その行が追い出される(別のブロックを入れるため場所を空ける)ときの流れは次のとおりです。
・ダーティビットが0なら:主記憶とすでに一致しているので、そのまま捨てる
・ダーティビットが1なら:捨てる前に主記憶へ書き戻し、値を一致させてから捨てる
例: 同じ行に 5 回書き込んだ場合
─────────────────────
ライトバック : 主記憶への書込み = 追い出し時の 1 回
ライトスルー : 主記憶への書込み = 書込みのたび 5 回
このように、同じ行を何度も書き換えるほど、ライトバックは主記憶への書込み回数を大幅に減らせます。上のツールでは最後のステップで「主記憶への書込みは追い出し時の1回だけで済んだ」ことを確認できます。
ダーティビットとは、キャッシュの各行に付いている1ビットの「フラグ(目印)」で、「この行は主記憶より新しい値を持っている」を意味します。ダーティ=「汚れた(更新済み)」という意味です。
なぜダーティビットが必要か。ライトバックでは書込みのたびに主記憶へ反映しません。そのため、「キャッシュ側だけ値が新しい行」と「両方が同じ値の行」が混在します。追い出し時にdirty=1の行だけ主記憶へ書き戻せば済み、dirty=0の行は書き戻し不要でそのまま破棄できます。ダーティビットがあるから「書き戻しが必要かどうか」を瞬時に判断できるのです。
身近な例で言うと、メモ帳(キャッシュ)に書いたら付箋(ダーティビット)を貼るイメージです。付箋が貼ってあるページだけを清書(主記憶へ書き戻し)し、付箋のないページはそのまま捨てます。付箋のおかげで「全部清書」という無駄をなくせます。
ライトバックの最大のリスクは、ダーティな行を主記憶へ書き戻す前に電源が切れると、キャッシュ上の新しいデータが失われることです。電源が切れれば揮発性のキャッシュの中身は消えてしまいます。その時点で「主記憶にはまだ古い値しかない」という状態になり、書き込んだはずのデータが消失します。
それでもライトバックが広く使われる理由は、書込み性能が大幅に向上するからです。
・向いている場面:同じデータを何度も書き換える処理(ループ内の変数更新など)。書込みのたびに主記憶へ行かずに済み、CPUの処理が速く回る
・向いていない場面:別の装置(DMAコントローラ=CPUを介さずに記憶装置とメモリを直接転送する仕組み)が主記憶を直接読む場合。主記憶の値が古いままだと誤ったデータを読んでしまう
身近な例で言うと、下書き保存(キャッシュ)だけしておいて、後でまとめて本保存(主記憶)する文書アプリのようなものです。作業中は速いですが、本保存する前にアプリが強制終了すると変更が消えます。これと同じトレードオフがライトバックにもあります。
キャッシュへの書込みには、もう1つライトスルー方式があります。ライトスルーは「キャッシュと主記憶の両方に同時に書き込む」方式で、ライトバックとは正反対の考え方です。
| 項目 | ライトバック | ライトスルー |
|---|---|---|
| 書込み先 | キャッシュのみ | キャッシュ+主記憶(両方) |
| 主記憶への反映 | 追い出し時にまとめて | 書込みのたびにすぐ |
| 書込み速度 | 速い | 遅め(主記憶に律速される) |
| ダーティビット | 必要 | 不要 |
| 主記憶との一致 | ずれる時間がある | 常に一致 |
それぞれに向き不向きがあります。
・ライトバックが有利な場面:同じデータを繰り返し書き換える処理。主記憶への往復が減り高速
・ライトスルーが有利な場面:主記憶と常に一致していてほしい場面。データの整合性管理がシンプル
ライトバックの弱点は、主記憶へ書き戻す前に電源が落ちると、キャッシュ側の新しいデータが失われることです。一方ライトスルーは常に主記憶へも書くため、この心配がありません。「速さを取るライトバック」「確実さを取るライトスルー」と整理すると分かりやすいです。