Linuxのカーネルの開発に関する世界観(ディスクの読み書き)です。
(以下は詳解 Linuxカーネル 第2版を参考に執筆しました。)
カーネルは、できるだけ低速なディスクにアクセスしないように、ディスクの内容をキャッシュしている。
バッファキャッシュは、その名の通りバッファによるキャッシュのこと。
これとは別に、ページによるディスクキャッシュであるページキャッシュがある。
メモリをディスクの代わりに使って高速にアクセスするディスクキャッシュとは逆に、ディスクをメモリの代わりに使ってメモリの空き容量を拡大させるスワップという処理がある。
スワップでは、空きメモリが不足した際、ディスクをメモリの「避難場所」として使うことができる。
後日注記:Linux 2.6では、バッファキャッシュは廃止され、ディスクキャッシュはページキャッシュに統合された。
(以下はVFSとファイルシステムの基礎技術:Linuxファイルシステム技術解説(1)(2/2 ページ) - @ITを参考に執筆しました。)
i-nodeは、次の3つの双方向リストのうち、常にどれかに入っている。
リスト | 説明 |
---|---|
UNUSED | 未使用 |
USED | 使用中 |
DIRTY | 書き込み中 |
ダーティとは「書き込み中」の意味。
メモリ上のファイルのキャッシュに書き込みが行われた場合、i-nodeにはダーティビットがつけられ、ダーティリストに追加される。
ダーティリストに追加されたi-nodeは、I/Oリクエストキューに書き込みI/Oを待つバッファキャッシュとして追加され、ディスクに順次書き込みがなされる。
syncコマンドは、キャッシュの中身をディスクに書き込むコマンド。
カーネルはディスクの内容をキャッシュしているが、これが書き込まれずにシステムがなんらかの原因で停止すると、データが失われてしまう。
長い時間稼働しているシステムで、停電などなんらかのリスクがある時には、syncコマンドを実行すればその場でキャッシュをディスクに書き込んでくれる。
(以下は詳解 Linuxカーネル 第2版を参考に執筆しました。)
ファイルの読み取りを行う際に、カーネルが行うことは以下のような流れになる。
まず、ディスク上にそのファイルがどこに存在するかを突き止めるために、i-nodeを探索する。
ディスクからファイルを読み込む前に、まず、先読みウィンドウあるいはページキャッシュの中にデータが存在しないかどうかを確認する。
実際にディスクからファイルを読み込む際には、新しいページフレームを確保し、ここにディスクからデータを読み込む。読み込みが終わったら、ページをページキャッシュに追加する。
そして、最後に、データを要求されたプロセスアドレス空間にコピーして転送する。
ファイルの書き込みの場合は、ファイルのサイズが変わる場合があるため、もう少し複雑になる。サイズが変わった場合、ディスク上の物理ブロックの確保や解放をしなければならない。この操作はファイルシステムの種類によって異なる。
(以下は詳解 Linuxカーネル 第2版を参考に執筆しました。)
ファイルシステムにおいて、先読み技術を使うことで、ファイルの読み取りが高速になることがある。
先読みとは、ファイルを読んだ際に、隣接するデータのページを必要とされる前に読み込んでおく技術。
先読みアルゴリズムでは、隣接したページのことを「先読みウィンドウ」と呼び、前回の先読みページと合わせて「先読みグループ」と呼ばれる。