多級hash在內核中應用: 變種radix tree在page cache中的應用

參考:
radix tree in kernel : Trees I: Radix trees
http://lwn.net/Articles/175432/

普通的radix tree(注意,這不是內核中用的radix tree哦)
http://en.wikipedia.org/wiki/Radix_tree

這裏討論的是變種的radix tree,請知悉.
radix tree的核心思想是什麼?
    內核中用到的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的示意圖.

radix-tree-2.png
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章