Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
上記dentry操作関数群だけだと、基本的にどんどんdentryの領域が増えて行く。増えすぎたエントリは、prune_dcache関数により不必要そうなものから順番に解放される。prune_dcache関数は以下の処理から呼び出される。
prune_dcache(解放するdentryの希望数) while(dentry_unusedリストに継っている) { dentry_unusedリストの最後のdentryをはずす if(誰からも参照されてないなら) { dentryの解放(prune_one_dentry関数) } if(解放希望数を満たした) return; } prune_one_dentry(dentry) dentryのリンクを全てきる iノードを解放(dentry_iput関数) dentryのメモリ領域解放(d_free関数) 親ディレクトリのdentryの参照の終了(dput関数)
select_dcache(期待解放inode数, 期待解放page数) while(dentry_unusedの半分を逆順で検索) { if(参照されている) dentry_unusedから外し、continue; if(inodeが多くのページキャッシュを持っている) continue; if(inodeがDirty状態である) continue; if(inodeが参照されている) continue; dentryをdentry_unusedリストの最後に繋ぎ直す if(期待解放inode数か期待解放page数に達した) return; }
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:46:00, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members