Linux Kernel(2.6)の実装に関するメモ書き

Radix Tree


Rev.2を表示中。最新版はこちら

1. 概要

Radix TreeのLinuxでの実装のメモ。Radix Treeの機能はlib/radix-tree.cで提供される。Linuxではページキャッシュのページを管理するのにRadix Treeを使っている。

2. データ構造

LinuxでのRadixツリーの構造を図1に示す。


図1 Radix Treeのデータ構造

Radix Treeの管理の大元のデータとしてstruct radix_tree_rootがある。このデータのrnodeがルートノード(Treeトップのノード)を指している。heightはTreeの高さを表しており、例えばheight=1だと、ルートノードのみの1段のTreeであることを意味する。

Treeの各ノードはstruct radix_tree_nodeが使われる。この構造体にはslots[]配列があり、子ノードへのポインタを保持している。末端のノードの場合はslots[]は検索対象のオブジェクト(item)へのポインタを格納している(*1)。子ノードやitemが無い場合はslots[]の該当要素にはNULLが格納されている。現状slots配列は64エントリ存在し、Radix Treeは64分木を構成することになる。countフィールドは、そのノードに子がいくついるかを示すカウンタ。つまり、slots[]に有効なポインタがいくつ格納しているかを表している。

LinuxのRadix Treeでは検索キーは32bit値に制限されている。検索キーはRADIX_TREE_MAP_SHIFT(6) bit(*2)に区切られて各段のノードのslots[]のインデクスとして使われる。6bit区切りだと端数がでるので、検索キーの上位は2bit区切りになる。図1では1段でも64分岐しているが、実際には4分岐しかしない。

(*1) ページキャッシュのRadix Treeの場合は、itemはstruct pageになる。
(*2) 6bitで取り得る値は0〜63なので、slots[]は64エントリとなり64分木となる。

Treeの拡張

タグ

関連関数

radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
radix_tree_insert(struct radix_tree_root *root, unsigned long index, void *item)


最終更新 2007/06/06 17:21:24 - kztomita
(2007/06/06 16:57:27 作成)
添付ファイル
radix.png - kztomita
expand1.png - kztomita
expand2.png - kztomita
bitmaps.png - kztomita
bitmap_usage.png - kztomita


リンク
最近更新したページ
検索