メモリとキャッシュと整合性。どうも、かわしんです。
最近「詳解 LINUX カーネル」という分厚い本を読んでいるのですが、割と序盤の第 2 章で気になったことがあったので調べてみました。
ライトスルーとライトバック
ご存知の通り、CPU にはキャッシュがあってメモリアクセスの遅延を高速化しています。 メモリの内容への書き込みではキャッシュとメモリを同時に書き換える「ライトスルー」方式とキャッシュの中身だけ書き換えてメモリへの書き込みは遅延させる「ライトバック」方式があります。
ライトスルーは書き込みのたびにメモリアクセスが発生し遅くなってしまうが簡単に実装できるし、複数段キャッシュの L1 キャッシュで使えばその書き込み遅延も軽減することができます。 一方で、ライトバック方式は高速に書き込みができるけど整合性を保つために実装が複雑になりがちだし、バグが起きやすいかもしれません。
とここまでは Wikipedia にも載っている話です。
世の中の文献ではこの二つの方式を比較して両方には一長一短があるよねという話を CPU を作るハードウェアベンダの視点から論じています。
OS がライトスルー方式を選ぶ理由はあるのか
ところが、「詳解 LINUX カーネル」によるとページテーブルエントリには PWT (Page Write-Through) フラグがあり、Pentium では OS がライトスルー方式かライトバック方式かを選ぶことができるらしいです。
僕の認識ではメモリのキャッシュは透過的なモノです。ライトバック方式のデメリットは CPU の実装上のデメリットであり、CPU の利用者である OS の立場からは、ライトバック方式のデメリットはなく高速なライトバック方式を採用しない理由がないです。 実際に Linux では全てのページフレームでキャッシュは有効であり書き込みの際には常にライトバック方式が設定されるそうです。
では逆に、なぜPentium などの CPU はライトバック方式のみではなくライトスルー方式も選択可能な形で実装しているのか、OS がわざわざライトスルー方式を採用するケースがあるのかどうかが気になります。
ということでざっくり調べてみましたが、軽く調べてみた限り CPU を作る立場から比較する記事が多かったです。
論点
- mmaped IO
- cpu architecture - Write-back vs Write-Through caching? - Stack Overflow
- mmaped IO の時はキャッシュをそもそも無効化するらしい?そのため関係なさそう
- ボードが CPU 内部のキャッシュでのライトバックをサポートしていない
- Write-Back/Write-Through Cache on Intel P24T Overdrive CPU's
- 確かにこれは OS がライトバックをそもそも使えないのでライトスルーを明示的に利用する理由にはなりそうです。
- DMA
- 僕の予想ですが、DMA (Direct Memory Access) はキャッシュ関係なくメモリを直接触るからキャッシュの中身は転送される前に Flush などしてメモリに明示的に書き出す必要があります。実装の簡略化や無駄な Flush 命令を省いて高速化する観点からライトスルー方式を採用する理由にはなりそうかなと思いました。
- DMAとキャッシュの関係 | 学校では教えてくれないこと | 技術コラム集組込みの門 | ユークエスト
結論
はっきりとはわからなかったですが、いい線いってるんじゃないかなと思います。詳しい人いたら教えてください。