Radix Tree
Rev.2を表示中。最新版はこちら。
1. 概要
Radix TreeのLinuxでの実装のメモ。Radix Treeの機能はlib/radix-tree.cで提供される。Linuxではページキャッシュのページを管理するのにRadix Treeを使っている。
2. データ構造
LinuxでのRadixツリーの構造を図1に示す。
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)