バッファ領域の拡張と解放

getblk処理においてバッファ域が不足すると、動的に1ページメモリを確保(alloc_page関数)し、それを幾つかに分割してバッファとして利用する。refill_freelist関数、grow_buffers関数、create_buffers関数がその処理を担当している。(このアルゴリズムは ページサイズ>=ブロックサイズ でなければならないことを意味している)バッファの確保が直ぐに行えない場合は、確保できるようになるまで待ちに入る。ただし、ページI/Oの場合は待ちに入れないことがあるため、このような状態に陥った場合に備え、専用のバッファヘッドが予約されている。

ここでは細かいアルゴリズムの説明は省略する。

linuxのバッファハントアルゴリズムは、基本的に確保する一方でありどんどんメモリを消費する。空きメモリがある一定の水準以下になると空きメモリをつくるために、try_to_free_buffers関数が呼び出される。この関数では指定されたページを構成するバッファの解放を行ない、空きメモリに戻す処理を行う。このとき、同じページを構成しているバッファを同時に解放しなければならないため、処理が少々ややこしくなっている。この解放処理のために、ページ構造体(次項を参照)とバッファの間は相互にリンクされている。

img22.gif

補足このアルゴリズムは、バッファのサイズ(つまりファイルシステムのブロックサイズ)は4Kbyteとすると、最も効率的に動作することがわかる。


(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1