ディレクトリエントリキャッシュ

linuxではdentryという構造体に、ファイルパス名の情報を格納しメモリ上にキャッシングしている。パス検索の高速化が目的である。一度ディレクトリやファイルにアクセスすると、一つのdentryが確保され、キャッシュされる。

各dentryは、下図のようにディスク上のパスのイメージを再現している。パス名検索時に、dentry上でヒットしなかった場合に限り、ディスクからパス情報を読みだすこととなる。一度読み出したパス情報はdentry上に載るため、二度目以降のパス検索は高速化される。

img29.gif

dentryは下図のようにiノードと相互リンクしており、dentryから簡単にiノードを求めることができる。一つのファイルが複数の名前を持っている(ハードリンク)場合は、以下のように一つのiノードに対し、二つのdentryが割り当てられている。ファイル名が短い場合(16文字以内)は dentry内にファイル名を格納するが、それ以上の長いファイル名の場合はファイル名を格納する領域を別途用意している。

img30.gif

dentryも、iノードやバッファと同様に、以下のようなhashにキャッシュされている。hash値はファイル名と親dentryのアドレスとを組み合わせて作っているため、ほどほどに分散した値が求まっているものと思われる。現時点で誰からも参照されていないdentryはdentry_unusedにリンクされており、解放の対象とされる。

dentryの参照カウントが以下の場合に1加えられる。これ以外の場合は参照数は0となり、全てdentry_unusedに登録される。ただし、登録の並びは再利用の可能性の低そうな順になる。ディレクトリの参照カウントは0となる可能性は低くパス検索でディレクトリがミスヒットとなる可能性は低い

  • まさにそのdentry経由でファイルをアクセスしているとき
  • そのdentryのd_subdirsに子dentryがリンクされているとき
img31.gif

 

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