🐡

【OS】バッファキャッシュとは

に公開

はじめに

コンピュータシステムにおいて、ストレージデバイス(HDDやSSD)へのアクセスは処理速度のボトルネックになりがちです。この課題を解決するために、OSは「バッファキャッシュ」という仕組みを採用しています。
本記事では、このバッファキャッシュの働きと重要性について、初心者にもわかりやすく解説していきます。

バッファキャッシュ(Buffer Cache)とは

バッファキャッシュは、OSが管理するメモリ領域の一部で、最近アクセスしたディスクブロックの内容を保持するための一時的な保存場所です。ブロックデバイス(例:ディスク)へのアクセスを高速化するために、カーネルがメモリ上に設けたキャッシュ領域とも言えます。


https://medium.com/@leesu0816/apue-14-file-i-o-9a6d3545e4e7 より引用

この技術は、CPUとストレージデバイス間の速度差を埋めるために開発されました。現代のCPUはナノ秒単位で処理を行なうのに対し、HDDはミリ秒単位のアクセス時間を要します。この100万倍もの速度差を緩和するのがバッファキャッシュの主な役割です。

バッファキャッシュが必要な理由

ストレージデバイスへのアクセスが遅い理由は物理的な制約にあります。
HDDでは磁気ヘッドの移動(シーク時間)とディスクの回転待ち時間(レイテンシ)が発生し、SSDでもフラッシュメモリの特性上、読み書きにはある程度の時間がかかります。
一方、メモリへのアクセスはこれらのストレージデバイスに比べて桁違いに高速です。バッファキャッシュはこの速度差を利用し、頻繁にアクセスされるデータを高速なメモリ上に保持することで、システム全体のパフォーマンスを向上させます。

バッファキャッシュの動作原理

アプリケーションがファイルの読み込みを要求すると、OSはまずバッファキャッシュをチェックします。要求されたデータがキャッシュ内に存在する場合(キャッシュヒット)、OSはストレージデバイスにアクセスすることなく、即座にデータを返します。これがバッファキャッシュが性能向上に寄与する主要なメカニズムです。

データがキャッシュにない場合(キャッシュミス)、OSはストレージから必要なデータを読み込み、今後のアクセスに備えてそのデータをバッファキャッシュに保持します。この時、キャッシュがいっぱいであれば、LRU(Least Recently Used)などのアルゴリズムを使用して、最も長く使われていないデータを削除し、新しいデータのために領域を確保します。

書き込み操作においても、バッファキャッシュは重要な役割を果たします。アプリケーションがファイルに書き込む際、データは直接ストレージデバイスに書き込まれるのではなく、一旦バッファキャッシュに保持されます。この遅延書き込み(ライトバック)により、アプリケーションは書き込み操作が完了したとすぐに認識でき、処理を続行できます。実際のストレージへの書き込みは後でバックグラウンドで行われます。

バッファキャッシュのメリット

バッファキャッシュを利用する主な利点は、ディスクI/Oの回数を大幅に削減できることです。
同じデータに繰り返しアクセスする場合、バッファキャッシュがあることで毎回ストレージデバイスにアクセスする必要がなくなります。

また、書き込み操作をまとめて行なうことで、ディスクへのアクセスパターンが最適化されます。ランダムな書き込み要求も、バッファキャッシュ内で整理され、連続したブロックへのシーケンシャル書き込みとして実行可能になります。これは特にHDDのようなシーク時間が性能に大きく影響するストレージデバイスで効果的です。

さらに、バッファキャッシュはメモリの未使用領域を有効活用します。アプリケーションが使用していないメモリ領域をバッファキャッシュとして利用することで、貴重なメモリリソースを無駄にしません。必要に応じて、アプリケーションがより多くのメモリを要求した場合、バッファキャッシュ用の領域は解放され、アプリケーションに割り当てられます。

バッファキャッシュの注意点

ライトバックキャッシュを使用している場合、システムクラッシュや電源断が発生すると、キャッシュ内のデータが失われる可能性があります。これはバッファキャッシュがメモリ上にあるためです。
そのため、重要なデータベーストランザクションなどでは、アプリケーションが明示的にfsync()などのシステムコールを使用して、データが確実にストレージに書き込まれるようにする必要があります。

また、大量のデータを初めて読み込む場合や、ランダムアクセスパターンが支配的なワークロードでは、バッファキャッシュの効果が限定的になることがあります。このような場合、アプリケーションレベルでのキャッシングやアルゴリズムの最適化がより重要になります。

ページキャッシュとの違い

ページキャッシュは、主にファイルの中身データ)を扱います。ファイルの中身をメインメモリ(RAM)にキャッシュしておくことで、2回目以降のアクセスを高速化します。

それに対して、バッファキャッシュは、ディスクのブロックメタデータや構造)(ディスクのブロック単位のデータやメタ情報のキャッシュ)を扱います。キャッシュされるのはブロック装置の読み書きデータです。

まとめ

OSのバッファキャッシュは、ストレージデバイスの物理的な制約をソフトウェアで克服する画期的な仕組みです。メモリの未使用領域を有効活用し、頻繁にアクセスされるデータを高速に提供することで、システム全体の応答性とスループットを向上させます。現代のコンピューティングにおいて、このような階層化された記憶領域の管理は、パフォーマンス最適化の基本技術として重要な役割を果たし続けています。

最後までお読みいただき、ありがとうございました。

参考・画像引用元URL

https://medium.com/@leesu0816/apue-14-file-i-o-9a6d3545e4e7
https://blog.framinal.life/entry/2020/04/23/051208
https://blog.tai2.net/buffer_cache_experiment.html

Discussion