基本情報のキャッシュ書き込み方式で問われるのは、CPUがデータを更新したとき、その変更を主記憶へいつ反映するかです。ライトスルーは更新を主記憶にも反映し、ライトバックはまずキャッシュに書き、必要な時点で主記憶へ書き戻します。
二つの違いは「主記憶がいつ更新されるか」を時系列で追うと理解できます。この記事では、同じデータを繰り返し書き換える例と置換時の動作から、試験の選択肢を見分ける方法を解説します。
- キャッシュと主記憶が担当する役割
- 二つの方式で更新が伝わるタイミング
- 変更済みデータを置き換える際の書き戻し
- 転送回数の例題を解くときの前提条件
基本情報のキャッシュ書き込み方式の違い

キャッシュと主記憶の役割
キャッシュメモリは、CPUが繰り返し使う可能性のあるデータを近くに保持し、主記憶へのアクセスを減らすための記憶領域です。目的のデータがキャッシュにあればヒット、なければミスと呼びます。読み出しでは、ヒット率や各記憶装置のアクセス時間を使って平均時間を計算する問題があります。
書き込みでは、CPUが値を変更した後、キャッシュにあるデータと主記憶にある同じデータの関係をどう管理するかが問題になります。キャッシュだけを変更すると、しばらく主記憶に古い値が残る場合があります。両方へその都度反映すれば差を小さくできますが、主記憶側へ書く処理も発生します。
ここでは説明を明確にするため、キャッシュが一段で、CPUが書く対象のデータは既にキャッシュにあるとします。実際のコンピュータでは複数段のキャッシュ、書き込みバッファ、複数のコアなどを含みます。試験問題では、まず問題文が指定する構成と条件を優先し、記載されていない仕組みを勝手に前提にしないことが大切です。
ライトスルーの更新

ライトスルー方式では、CPUによる書き込みをキャッシュに反映するとともに、その書き込みを主記憶側にも伝えます。簡単な試験モデルでは、キャッシュと主記憶の両方を同じ更新内容にする方式として説明されます。書き込みが完了した後の主記憶に、キャッシュと対応する最新の値を反映しやすいことが特徴です。
例えば、両方の初期値が10のデータをCPUが20に変更するとします。ライトスルーの基本モデルでは、キャッシュの値を20にするとともに主記憶にも20を書きます。続けて30へ変更した場合も、その変更を主記憶へ伝えます。変更するたびに主記憶側への書き込みが必要になる点は、後でまとめて反映する方式と異なります。
「同時に書く」という説明は二つを更新するという方式の区別に役立ちますが、実機のすべての回路が文字どおり同じ瞬間に完了するという保証ではありません。書き込みバッファなどがあれば処理の進み方は変わります。ほかの装置やCPUが介在する環境では、可視性や整合性のための別の仕組みも必要です。試験の単純なモデルと実装上の保証を分けて読みましょう。
ライトバックの更新

ライトバック方式では、書き込み時にはまずキャッシュの内容を更新し、その変更をすぐには主記憶へ反映しない場合があります。変更されたキャッシュのブロックを追い出すときなど、必要なタイミングで主記憶側に書き戻します。その間は、キャッシュに新しい値、主記憶に古い値が存在することがあります。
先ほどと同様に初期値10から20、さらに30へ書き換える例では、どちらの更新もキャッシュ内で行い、同じブロックが置き換わるときに最終値30を主記憶へ反映できます。置換前に主記憶を確認すると10のままという状態があり得ます。同じブロックに何度も書き込む場合、主記憶への書き込みをまとめられることが利点です。
ただし「ライトバックは必ず置換時まで書き戻さない」と断定する必要はありません。明示的なフラッシュや、システムの整合性を保つ処理など、置換以外の契機で書き戻す実装もあります。試験で置換時のみの単純な動作を指定しているなら、その条件のもとで計算します。方式の基本と実際の多様な実装を区別することが、選択肢を読むときに役立ちます。
ダーティビットと置換

ライトバックでは、キャッシュ内のデータが主記憶側と比べて変更済みかどうかを示す情報が必要です。その代表がダーティビットです。キャッシュへ読み込んだ後に変更されていないブロックはクリーン、CPUによって変更され、まだ主記憶に反映されていないブロックはダーティとして考えます。
クリーンなブロックを置き換える場合、内容が主記憶側と同じという前提なら、通常は書き戻しが不要です。ダーティなブロックを置き換える場合は、変更を失わないように書き戻してから新しいブロックを利用します。ダーティビットはデータそのものの値ではなく、変更の有無を管理するための印です。
キャッシュライン、ブロック、主記憶への転送単位の呼び方は資料によって異なります。計算問題では、1回の書き戻しが何バイトか、複数のブロックに変更があるのかを確認します。1つのブロックを5回変更したことと、5つの異なるブロックを1回ずつ変更したことは、書き戻し回数の計算上同じではありません。
基本情報のキャッシュ書き込み方式を例題で判断する

同じブロックを3回更新
次の条件を置きます。データXの初期値はキャッシュと主記憶の両方で0です。Xのあるブロックは最初からキャッシュにあり、CPUはXを順に1、2、3へ書き換えた後、そのブロックを置き換えます。ほかの書き込みやフラッシュはなく、置換による書き戻しだけを考えます。
- ライトスルー:1、2、3の各更新を主記憶へ伝える
- ライトバック:キャッシュ内で1、2、3に更新し、置換時に3を書き戻す
- 置換前:ライトバックでは主記憶が0のままの場合がある
- 置換後:この前提ではどちらも主記憶が3になる
この単純なモデルでは、主記憶へ発生する書き込みはライトスルーが3回、ライトバックが置換時の1回です。CPUが行った書き込みの回数は、どちらも3回です。CPUの更新回数と主記憶への転送回数を分けずに数えると、「ライトバックではCPUの更新が1回しかない」と誤解しやすくなります。
この例の3対1は常に成立する性能値ではありません。書き込みバッファでの統合、キャッシュの置換順序、他のブロックへの書き込み、データの転送単位によって実際の動作は変わります。問題文が指示していない場合に、処理時間が必ず3分の1になるなどと結論付けないでください。
異なるブロックを更新
今度は、キャッシュ内にXとYという別々のブロックがあり、両方とも主記憶と同じ値で開始するとします。ライトバックでXを2回、Yを1回更新すると、XとYの両方がダーティになります。途中に書き戻しはなく、最後に両方がそれぞれ置き換えられるなら、主記憶への書き戻しはXについて1回、Yについて1回の計2回です。
Xを何回更新しても、同じXのブロックを追い出す前であれば、最後の値を1回の書き戻しにまとめられるモデルです。一方、Xを置換して書き戻した後に再び読み込み、さらに変更してもう一度置換すれば、Xについて2回目の書き戻しが発生します。単に「Xという名前が出た回数」ではなく、変更と置換の区間ごとに追いかけます。
また、読み込んだだけで一度も変更されていないZが置き換えられる場合は、Zがクリーンであるという前提なら書き戻しを数えません。表を作るなら、列を「操作」「対象ブロック」「変更済みか」「主記憶への書き込み回数」に分けます。置換の行では、対象のブロックを確認してからダーティの状態を参照します。
書き込みミス時の条件
ここまでの例は、書き込む対象が既にキャッシュにある状態でした。対象がキャッシュにない書き込みミスでは、主記憶からブロックを読み込んでキャッシュに置いてから書く方針や、キャッシュへ新たに置かず主記憶側へ書く方針があります。前者をライトアロケート、後者をノーライトアロケートと呼ぶことがあります。
ライトスルーとライトバックは更新を主記憶側へ反映するタイミングの区別であり、ライトアロケートとノーライトアロケートは書き込みミス時にキャッシュへ読み込むかの区別です。異なる観点なので、名称が似ていても同じ一組の選択肢として扱わないようにしましょう。ある組合せが一般的であることと、ほかの組合せが絶対に存在しないことは別です。
ミス時の処理を問題が指定していないなら、最初からヒットするという条件の例とは違い、追加の読み込みや書き込みを一意に数えられないことがあります。計算する前に、各アクセスがヒットかミスか、ミス時の割当方針は何か、何を1回の主記憶アクセスとして数えるかを確認します。
整合性と他の装置

キャッシュが複数ある場合、あるCPUが変更したデータを別のCPUが古いキャッシュから読まないよう、各キャッシュ間の整合性を管理する必要があります。これをキャッシュコヒーレンシといいます。ライトバックでは主記憶に古い値が残る場合があるため、どこに最新のデータがあるかを考慮した制御が必要になります。
また、DMAのようにCPUが一つずつデータを運ばずに主記憶と入出力装置の間で転送する仕組みでは、CPUのキャッシュと主記憶の内容が食い違うと、意図しない古いデータを扱う可能性があります。実際にはシステムが整合性を保つ仕組みや、必要な同期処理を備える場合があります。どの操作が必要かはハードウェアとOSの条件によって異なります。
「ライトスルーならどんな環境でも整合性対策が不要」「ライトバックなら必ずデータが失われる」という極端な結論は避けましょう。問われているのが方式の基本動作なら更新先とタイミングを答え、複数コアやDMAの設問なら、追加で示された同期や制御の条件を確認します。DMA自体の流れは基本情報のDMAとCPUの役割で確認できます。
選択肢の読み方
「書き込み時に主記憶にも反映する」とあればライトスルー、「キャッシュの変更を後で書き戻す」とあればライトバックが基本です。「変更していないブロックも、置換のたびに必ず書き戻す」といった選択肢は、ダーティの区別と矛盾しないかを確認します。設問が特定の実装を定義している場合は、その定義に沿って判断します。
読み出しのヒット率や平均アクセス時間を計算する問題と、書き込み方式の問題も区別しましょう。ヒット率だけから、ライトバック時のダーティな置換回数を一意に導くことはできません。書き込み割合や置換されるブロックの状態など、必要な条件が別途与えられているかを見ます。読み出し時間の公式は基本情報のキャッシュメモリとヒット率計算で整理できます。
書き込み方式の用語は、IPAの基本情報技術者試験シラバスの用語例にも掲載されています。仕組みのより詳しい説明を読む際は、CPUキャッシュを扱っているか、アプリケーションのデータキャッシュを扱っているかを確認してください。同じ名前が使われても、保証される動作や構成は同一とは限りません。
置換を挟む演習

ライトバックの条件で、ブロックAに書き込んだ後Aが置換され、後からAを再び読み込み、もう一度書き込んで置換されたとします。読み込み時はクリーン、書き込みでダーティになり、置換のたびに変更済みなら主記憶へ書き戻すものとします。途中に別のフラッシュはありません。
最初の書き込みでAがダーティになり、最初の置換で1回書き戻します。再読み込み後はクリーンから始まり、次の書き込みで再びダーティになります。2回目の置換でもう1回書き戻すため、主記憶への書き戻しは合計2回です。Aという同じ名前のブロックでも、置換を挟むと二つの期間に分かれます。
もし再読み込み後に書き込みがなければ、二度目の置換時はクリーンのままで、書き戻しは発生しません。読み込みのための主記憶アクセスは別途発生し得ますが、ここで数えている「変更を主記憶へ書く回数」には含めません。何を数える問題かを最初に囲むと、読み込みと書き込みを混ぜずに済みます。
転送量を比べるときの前提
書き込み回数が少なくなることと、転送する総バイト数が必ず少なくなることは同じではありません。例として、ライトスルーでは4バイトの変更をその都度4バイトずつ主記憶へ書き、ライトバックでは変更済みの64バイトのブロック全体を置換時に書き戻すと仮定します。両方式とも対象は既にキャッシュにあり、バッファや別の転送は数えません。
同じブロック内の4バイトを3回変更したなら、この仮定でライトスルー側は4×3=12バイト、ライトバック側は置換時に64バイトです。書き込みの回数は3回と1回ですが、数えたバイト数は12と64になります。繰り返しが多くなれば比較は変わります。これは転送単位を明示した練習であり、実機が常にこの単位で転送するという意味ではありません。
この例から分かるのは、回数だけで処理時間や通信量を断定できないという点です。バスの幅、書き込みの統合、待ち時間、キャッシュラインの大きさ、ほかの処理との重なりなどが性能に影響します。試験で「何回」と聞かれたら回数を、「何バイト」と聞かれたら転送単位を掛け合わせ、与えられていない値を推測で補わないようにします。
階層が複数ある場合
CPUキャッシュには、CPUに近い層とその下位の層が複数ある構成もあります。この場合、ある層が「次の記憶階層へ反映する」と説明されていても、その行き先が必ず物理的な主記憶とは限りません。例えば上位キャッシュから下位キャッシュへ更新が進む場合、さらに主記憶へ反映される時点は別の条件で決まります。
問題がキャッシュ一段と主記憶だけを示すなら、その二つを比べる単純なモデルで解きます。複数段が明記されていれば、各層の書き込み方式、変更されたデータがどの層にあるか、置換がどの階層で起きたかを区別します。上位層からの書き戻し1回を、ただちに主記憶への書き込み1回とみなせるかは問題の条件次第です。
問題を見直す際は、キャッシュに置かれたブロックについて、読み込み直後なのか、変更された後なのかを各時点で書き込みます。同じブロックに対する処理であっても、置換やフラッシュの前後では状態が変わります。主記憶へ反映された時点を線で区切ると、次の変更を新しい期間として数えられます。
基本情報のキャッシュ書き込み方式まとめ
ライトスルーは書き込みを主記憶にも反映し、ライトバックはまずキャッシュで更新して、変更済みのデータを必要に応じて書き戻します。置換の問題では、どのブロックがダーティかを確認し、書き戻し回数をブロックごとに数えましょう。
試験では、初期状態、ヒットかミスか、置換やフラッシュの条件、転送単位を先に読み取ると解きやすくなります。実行時間や整合性を比較する場合は、本文の単純な例だけで実機の挙動を断定せず、問題で指定された前提から判断してください。


コメント