內核中用到的radix tree並非嚴格的radix tree, 而是變種的radix tree.
本質上多級hash. linux內核中使用radix tree來組織page cache, 以便快速的查找一個地址是否在page cache中.
hash的衝突處理策略是拉鍊.
hash的key是整型值(地址), value是個指針, 算是個多級hash_map.
多級hash的實現方式是, 整型值的前幾位(1~6bit)用來做一級hash, 中間幾位(7~12)用來做二級hash, 接下來的幾位(13~18)來做三級hash
因爲是hash,所以,其查找的速度極快. 因爲樹的高度只有3層, 所以一般只需要三次查找即可(不考慮hash衝突).
爲什麼要用多級hash? 而不是常見的一級hash? 因爲, 如果用一級hash, 內核中的hash的算法的長度是一開始就固定的. 如果設的過小, 當page cache變大時, 衝突會變得很多.
如果設置的過大, 則當page cache很小時又有些浪費!
所以, 內核使用了多級hash. 多級hash的好處時, 面對稀疏的page cache, 存儲效率極高, 不浪費空間. 因爲大部分孩子節點都是空的, 也就是說沒有孩子分支. 比 舉個極端的例子, 當page cache中只有一個page時, 那麼radix tree只需要三個內部結點, 第一層一個結點:root, 第二層也只有一個結點, 第三層也只有一個結點!!
如下圖是一個運行中的內核的radix tree的示意圖.