Show page source of internal22-91-dentryのメモリ領域の強制解放 #25482

[[PageNavi(internal22-navi)]]

{{{ comment
h2w-title:dentryのメモリ領域の強制解放
}}}
 

= dentryのメモリ領域の強制解放 = #SECTION03540000000000000000

上記dentry操作関数群だけだと、基本的にどんどんdentryの領域が増えて行く。増えすぎたエントリは、prune_dcache関数により不必要そうなものから順番に解放される。prune_dcache関数は以下の処理から呼び出される。

  *  メモリiノード領域が不足した時(try_to_free_inodes関数、	grow_inodes関数から呼ばれる). iノード領域とdentryは必ずペアで	管理されているため、iノード領域を回収するには、dentryの	解放が必要不可欠である。
  *  swap処理からの呼び出し。メモリ不足のときに少しでも	空きメモリを作ろうということらしい。
  *  ディレクトリのdentry削除時に、ゴミの子ファイルの dentryが残っていた場合、select_parent関数で ゴミdentryをdentry_unusedリストの最後に繋ぎ、 prune_dcache関数を呼び出す。(shrink_dcache_parent) ファイルの削除時にdentryをきちんと整理していない為、 おかしな処理が必要となっている。

{{{
      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関数)
}}}

 メモリiノード領域が不足した時(try_to_free_inodes関数) から、上記prune_dcache関数を呼ぶに先立ち以下のselect_dcache 関数を呼び出している。 dentry_unusedリストは原則LRUであるが、この関数は、 dentry_unusedに継っているdentryのうち、 再利用の価値の高そうなものの順序を入れ換える。
{{{
      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 [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1

[[PageNavi(internal22-navi)]]