Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
次に、ページ書き込み要求処理のアルゴリズムに関して説明する。ページ書き込み処理は二段階で行われる。
block_prepare_write(iノード、I/O領域、読み込むページ, getblock関数) ページにまだバッファヘッドが割り付けられていなければ、 バッファヘッドを確保しページとリンク(create_empty_buffer関数) for (バッファのある間) { I/O完了コールバック関数としては、end_buffer_io_syncを登録。 if(バッファがブロックと対応付けられていない) { getblock関数を利用し、inodeとファイルオフセットから ブロック番号を求める。 if (新規確保したバッファなら) { もしバッファキャッシュにキャッシュが残っていれば そいつの解放を行う(unmap_underlying_metadata関数) 0クリアする。 } if (バッファがまだ有効でないなら) I/O要求の発行(ll_rw_block関数) } } I/O完了を待ち合わせる(wait_on_buffer関数)
上記関数で用意ができた後、書き込み要求のあったデータをページに書き込み下記関数を発行する。
generic_commit_write(iノード、I/O領域、読み込むページ) for (ページに対応づけられたバッファ群に対し) { バッファを有効状態(BH_Uptodate)にし、 かつバッファをDirtyな状態にする(__makr_dirty関数) } Dirtyなバッファが多いようならkflushデーモンを起動する(balance_dirty関数) ページを有効にする(SetPageUptodate関数)
(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST1
[ページ情報]
更新日時: 2008-08-27 14:18:57, 更新者: hiromichi-m
[権限]
表示:無制限, 編集:ログインユーザ, 削除/設定:メンバー