バッファとディスクブロックの同期

遅延書き込み指定のDirtyなバッファは、デーモンまたは明示的にsyncを行われることにより、同期がとられる。

kflushデーモンはlinuxカーネル起動時にカーネルスレッドとして実行を開始し、必要に応じてbdflush関数を実行している。kflushデーモンは以下の場合に起動される。

  • 遅延書き込み(Dirtyな)バッファが一定水準を越えた時(balance_dirty関数)
    • デフォルト設定では、全バッファに占める割合が20%を越えた時、 待ち合わせ無しでbdflushを起動し、全バッファに占める割合が40%を 越えた時は、bdflushの処理完了を待ち合わありでbdflushを起動する。
  • 空きバッファの確保に失敗したとき(refill_freelist関数)
  • 空きメモリが不足した時(filemap_swapout関数)一度kflushデーモンが起動されるとbdflush関数はある水準以下になるまで、次々と遅延書き込み(Dirtyな)バッファをディスクに書き込んで行く。bdflush関数はDirtyなバッファの一部のみのしか書き込まないことに注意しなければならない。

kupdateデーモンもlinuxカーネル起動時にカーネルスレッド*1として実行を開始し、必要に応じてkupdate関数を実行している。kupdateデーモンはデフォルト設定では5秒毎に動作する。kupdateデーモンはkflushデーモンと異なり、Dirtyな状態のまま一定時間以上過ぎてしまったバッファのみを書き込み対象としている)。またsync対象はバッファだけでなく後述するinode域やスーパブロック域も対象である。標準コンフィギュレーションでは30秒以上たったDirtyなバッファのみが対象となる。*2

syncシステムコールはDirtyなバッファ全てをディスクに書き込む。後述するinode域やスーパブロック域も対象である。

kflushがみる水準値および bdflushシステムコールが参照するコンフィギュレーション値は、bdflushシステムコールにより変更可能である。マニュアルを参照のこと。


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


  1. *1
  2. *2