Show page source of internal22-87-ディレクトリエントリキャッシュ #25319

[[PageNavi(internal22-navi)]]

{{{ comment
h2w-title:ディレクトリエントリキャッシュ
}}}
 

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

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

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

 [[Embed(internal22-images:img27.gif)]]
 

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

 [[Embed(internal22-images:img28.gif)]]
 

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

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

 [[Embed(internal22-images:img29.gif)]]
 

----

{{{ html
<A NAME="CHILD_LINKS">&#160;</A>
}}}

  *  [internal22-88-ディレクトリエントリキャッシュの検索と登録#SECTION03510000000000000000 ディレクトリエントリキャッシュの検索と登録]
  *  [internal22-89-dentryの参照要求と参照の終了#SECTION03520000000000000000 dentryの参照要求と参照の終了]
  *  [internal22-90-dentryのメモリ領域の拡張と解放#SECTION03530000000000000000 dentryのメモリ領域の拡張と解放]
  *  [internal22-91-dentryのメモリ領域の強制解放#SECTION03540000000000000000 dentryのメモリ領域の強制解放]
  *  [internal22-92-その他の主なdentry操作関数#SECTION03550000000000000000 その他の主なdentry操作関数]
  *  [internal22-94-キャッシュの相互関係#SECTION03560000000000000000 キャッシュの相互関係]

----

''(NIS)HirokazuTakahashi [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1

[[PageNavi(internal22-navi)]]