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

Radix Tree


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

1. 概要

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

2. データ構造

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


図1 Radix Treeのデータ構造

2.1 Treeの管理データ

Radix Treeの管理の大元のデータとしてstruct radix_tree_rootがある。このデータはRadix Tree関連関数でどのTreeに対して操作を行うのか指定するのに使われる。

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

2.2 Treeのノード

Treeの各ノードはstruct radix_tree_nodeが使われる。

この構造体にはslots[]配列があり、子ノードへのポインタを保持している。末端のノードの場合はslots[]は検索対象のオブジェクト(item)へのポインタを格納している(*1)。子ノードやitemが無い場合はslots[]の該当要素にはNULLが格納されている。現状slots配列は64エントリ存在し、Radix Treeは64分木を構成することになる。

countフィールドは、そのノードに子がいくついるかを示すカウンタ。つまり、slots[]に有効なポインタがいくつ格納しているかを表している。

(*1) ページキャッシュのRadix Treeの場合は、itemはstruct pageになる。

2.3 検索キー

LinuxのRadix Treeでは検索キー(index)は32bit値に限定されている。

検索キーは図1に示すようにRADIX_TREE_MAP_SHIFT(6) bit毎に区切られる。

検索キーの区切られた部分の値がTree各段のノードのslots[]のインデクスとなり、Treeを下っていくことができる(*2)。

なお、6bit区切りだと端数がでるので、検索キーの上位は2bitのみになる。このため、図1では1段目でも64分岐するように描いているが、実際には4分岐しかしない。

(*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:32:27 - kztomita
(2007/06/06 16:57:27 作成)
添付ファイル
radix.png - kztomita
expand1.png - kztomita
expand2.png - kztomita
bitmaps.png - kztomita
bitmap_usage.png - kztomita


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