FE EXAM

ライトバック方式(write-back)

キャッシュにだけ書き込み、追い出し時にまとめて主記憶へ書き戻す方式

INTERACTIVE VISUALIZATION
キャッシュダーティ主記憶
シナリオ
ステップ1 / 6
STEP 1/6初期状態 — ブロック10がキャッシュに載っているキャッシュにはブロック10のデータ(値=50)が入っています。ダーティビット=主記憶とキャッシュの値がずれているかを示す印は、いまは0(クリーン)です。主記憶のブロック10も同じ50なので、両者は一致しています。
CPU読み書きの主体キャッシュブロック 1050dirty = 0主記憶ブロック 1050ブロック 2599
解説

📌
ライトバック方式とは

CPUキャッシュここだけ更新主記憶後でまとめて書込みはキャッシュまで、主記憶は遅延追い出し時にまとめて主記憶へ書き戻す

ライトバック方式とは、CPU がデータを書き込むとき、速いキャッシュにだけ書き込んで主記憶(メインメモリ)への反映を後回しにする方式のことです。キャッシュ=CPU のすぐそばにある小さくて高速な記憶のこと、主記憶=容量は大きいが少し遅いメインメモリのことです。

キャッシュだけ更新すると、キャッシュの値と主記憶の値が一時的にずれます。そこで、更新した行にダーティビット(=「この行はキャッシュ側が新しい」という1ビットの印)を立てておき、その行が追い出されるときに初めて主記憶へ書き戻します。上のツールで▶ボタンを押すと、書込み → ダーティ印 → 追い出し → 書き戻し、の流れを順番に確認できます。

身近な例で言うと、レジ係が会計のたびに金庫まで走るのではなく、手元のレジ(キャッシュ)にお金をためておき、引き継ぎ(追い出し)のときに金庫(主記憶)へまとめて入れるイメージです。何度も金庫へ往復しないぶん、会計(書込み)が速く回ります。

🔄
動作の流れ

ライトバックの動作は、大きく分けて「書込み時」と「追い出し時」の2つの場面に分かれます。それぞれで主記憶に触れるかどうかが変わります。

書込みが起きたときの流れは次のとおりです。
キャッシュにヒット:キャッシュ内の値だけを書き換える(主記憶には書かない)
ダーティビットを1にする:「この行はキャッシュ側が新しい」と印を付ける
主記憶はそのまま:何度書き込んでも、毎回は主記憶へ行かない

その行が追い出される(別のブロックを入れるため場所を空ける)ときの流れは次のとおりです。
ダーティビットが0なら:主記憶とすでに一致しているので、そのまま捨てる
ダーティビットが1なら:捨てる前に主記憶へ書き戻し、値を一致させてから捨てる

例: 同じ行に 5 回書き込んだ場合
─────────────────────
ライトバック : 主記憶への書込み = 追い出し時の 1 回
ライトスルー : 主記憶への書込み = 書込みのたび 5 回

このように、同じ行を何度も書き換えるほど、ライトバックは主記憶への書込み回数を大幅に減らせます。上のツールでは最後のステップで「主記憶への書込みは追い出し時の1回だけで済んだ」ことを確認できます。

🔵
ダーティビットの仕組み

書込み前キャッシュ行値 = 10dirty = 0(きれい)書込書込み後キャッシュ行値 = 99dirty = 1(汚れた)dirty=1 のとき主記憶の値とずれている追い出し前に必ず主記憶へ書き戻す

ダーティビットとは、キャッシュの各行に付いている1ビットの「フラグ(目印)」で、「この行は主記憶より新しい値を持っている」を意味します。ダーティ=「汚れた(更新済み)」という意味です。

なぜダーティビットが必要か。ライトバックでは書込みのたびに主記憶へ反映しません。そのため、「キャッシュ側だけ値が新しい行」と「両方が同じ値の行」が混在します。追い出し時にdirty=1の行だけ主記憶へ書き戻せば済み、dirty=0の行は書き戻し不要でそのまま破棄できます。ダーティビットがあるから「書き戻しが必要かどうか」を瞬時に判断できるのです。

身近な例で言うと、メモ帳(キャッシュ)に書いたら付箋(ダーティビット)を貼るイメージです。付箋が貼ってあるページだけを清書(主記憶へ書き戻し)し、付箋のないページはそのまま捨てます。付箋のおかげで「全部清書」という無駄をなくせます。

⚠️
ライトバックのリスクと使いどころ

キャッシュ(新)値 = 99電源断主記憶(旧)値 = 10書き戻し前に電源断 → 更新が消える

ライトバックの最大のリスクは、ダーティな行を主記憶へ書き戻す前に電源が切れると、キャッシュ上の新しいデータが失われることです。電源が切れれば揮発性のキャッシュの中身は消えてしまいます。その時点で「主記憶にはまだ古い値しかない」という状態になり、書き込んだはずのデータが消失します。

それでもライトバックが広く使われる理由は、書込み性能が大幅に向上するからです。
向いている場面:同じデータを何度も書き換える処理(ループ内の変数更新など)。書込みのたびに主記憶へ行かずに済み、CPUの処理が速く回る
向いていない場面:別の装置(DMAコントローラ=CPUを介さずに記憶装置とメモリを直接転送する仕組み)が主記憶を直接読む場合。主記憶の値が古いままだと誤ったデータを読んでしまう

身近な例で言うと、下書き保存(キャッシュ)だけしておいて、後でまとめて本保存(主記憶)する文書アプリのようなものです。作業中は速いですが、本保存する前にアプリが強制終了すると変更が消えます。これと同じトレードオフがライトバックにもあります。

⚖️
ライトスルーとの違い

キャッシュへの書込みには、もう1つライトスルー方式があります。ライトスルーは「キャッシュと主記憶の両方に同時に書き込む」方式で、ライトバックとは正反対の考え方です。

項目ライトバックライトスルー
書込み先キャッシュのみキャッシュ+主記憶(両方)
主記憶への反映追い出し時にまとめて書込みのたびにすぐ
書込み速度速い遅め(主記憶に律速される)
ダーティビット必要不要
主記憶との一致ずれる時間がある常に一致

それぞれに向き不向きがあります。
ライトバックが有利な場面:同じデータを繰り返し書き換える処理。主記憶への往復が減り高速
ライトスルーが有利な場面:主記憶と常に一致していてほしい場面。データの整合性管理がシンプル

ライトバックの弱点は、主記憶へ書き戻す前に電源が落ちると、キャッシュ側の新しいデータが失われることです。一方ライトスルーは常に主記憶へも書くため、この心配がありません。「速さを取るライトバック」「確実さを取るライトスルー」と整理すると分かりやすいです。

関連コンテンツ