当前位置: > Linux编程 >

多级hash在内核中应用: 变种radix tree在page cache中的应用

时间:2014-12-30 12:46来源:linux.it.net.cn 作者:IT
参考:
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的示意图.
(责任编辑:IT)
------分隔线----------------------------