Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
以下にその大雑把なアルゴリズムを示す。アルゴリズム中に付いている◆印は同期書き込みを、◇印は遅延書き込みを表す。
ext2_new_block(iノード, ヒント値, ....) (上記アルゴリズムを用いて、空きブロックを検索) 候補のブロックグループのブロックビットマップを読み込む(load_block_bitmap関数) ブロックビットマップ内のビットを予約する。 プリアロケートの処理(後述のプリアロケート機能に関する説明参照) ◇ブロックビットマップの遅延書き込み要求 if(SYNCマウント?) { ◆ブロックビットマップをディスクに書き込む(ll_rw_block関数、wait_on_buffer関数) } 上記ブロックに対応するバッファの確保(getblk関数) 確保したバッファのクリア 確保したバッファを有効にする(mark_buffer_uptodate関数) ◇このバッファの遅延書き込み要求(mark_buffer_dirty関数) 確保したバッファの解放(brelse関数) ブロックグループディスクリプタが管理するフリーブロック数を1減らす ◇ブロックグループディスクリプタの属するバッファを遅延書き込み要求(mark_buffer_dirty) スーパブロックが管理するフリーブロック数を1減らす ◇スーパブロックを遅延書き込み要求(mark_buffer_dirty)
データブロックの解放は連続したブロックをまとめて行う。
ext2_free_blocks(iノード, ブロック番号, ブロック数) ブロックが属するブロックビットマップを読み込む ブロックビットマップ内のビットを解放する ブロックグループディスクリプタが管理するフリーブロック数を1増やす ◇ブロックグループディスクリプタの属するバッファを遅延書き込み要求(mark_buffer_dirty) スーパブロックが管理するフリーブロック数を1増やす ◇スーパブロックを遅延書き込み要求(mark_buffer_dirty) if(SYNCマウント?) { ◆ブロックビットマップをディスクに書き込む(ll_rw_block関数、wait_on_buffer関数) }
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:45:29, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members