PUB:20151123 Data Structures in the Linux Kernel

@cposture @tinyeyeser
This commit is contained in:
wxy 2016-05-18 08:59:30 +08:00
parent 9eba143b08
commit 917ea80685

View File

@ -1,4 +1,4 @@
Linux内核中的数据结构 —— 基数树
Linux 内核里的数据结构 —— 基数树
================================================================================
基数树 Radix tree
@ -11,35 +11,35 @@ Linux内核中的数据结构 —— 基数树
让我们先说说什么是 `基数树` 吧。基数树是一种 `压缩的字典树 (compressed trie)` ,而[字典树](http://en.wikipedia.org/wiki/Trie)是实现了关联数组接口并允许以 `键值对` 方式存储值的一种数据结构。这里的键通常是字符串,但可以使用任意数据类型。字典树因为它的节点而与 `n叉树` 不同。字典树的节点不存储键,而是存储单个字符的标签。与一个给定节点关联的键可以通过从根遍历到该节点获得。举个例子:
```
+-----------+
||
|" "|
+-----------+
| |
+------+-----------+------+
||
||
+----v------++-----v-----+
||||
|g||c|
| " " |
| |
+------+-----------+------+
| |
| |
+----v------+ +-----v-----+
| | | |
+-----------++-----------+
||
||
+----v------++-----v-----+
||||
|o||a|
| g | | c |
| | | |
+-----------++-----------+
|
|
+-----v-----+
||
|t|
+-----------+ +-----------+
| |
| |
+----v------+ +-----v-----+
| | | |
| o | | a |
| | | |
+-----------+ +-----------+
|
|
+-----v-----+
| |
+-----------+
| t |
| |
+-----------+
```
因此在这个例子中,我们可以看到一个有着两个键 `go``cat``字典树` 。压缩的字典树或者说 `基数树` ,它和 `字典树` 的不同之处在于,所有只有一个孩子的中间节点都被删除。
因此在这个例子中,我们可以看到一个有着两个键 `go``cat``字典树` 。压缩的字典树也叫做 `基数树` ,它和 `字典树` 的不同之处在于,所有只有一个子节点的中间节点都被删除。
Linux 内核中的基数树是把值映射到整形键的一种数据结构。[include/linux/radix-tree.h](https://github.com/torvalds/linux/blob/master/include/linux/radix-tree.h)文件中的以下结构体描述了基数树:
@ -86,10 +86,10 @@ struct radix_tree_node {
unsigned long tags[RADIX_TREE_MAX_TAGS][RADIX_TREE_TAG_LONGS];
};
```
这个结构体包含的信息有父节点中的偏移以及到底端(叶节点)的高度、子节点的个数以及用于访问和释放节点的字段成员。这些字段成员描述如下:
这个结构体包含的信息有父节点中的偏移以及到底端(叶节点)的高度、子节点的个数以及用于访问和释放节点的字段成员。这些字段成员描述如下:
* `path` - 父节点中的偏移和到底端(叶节点)的高度
* `count` - 子节点的个数;
* `count` - 子节点的个数;
* `parent` - 父节点指针;
* `private_data` - 由树的用户使用;
* `rcu_head` - 用于释放节点;
@ -188,9 +188,9 @@ unsigned int radix_tree_gang_lookup(struct radix_tree_root *root,
--------------------------------------------------------------------------------
via: https://github.com/0xAX/linux-insides/edit/master/DataStructures/radix-tree.md
via: https://github.com/0xAX/linux-insides/blob/master/DataStructures/radix-tree.md
作者:[0xAX]
作者0xAX
译者:[cposture](https://github.com/cposture)
校对:[Mr小眼儿](https://github.com/tinyeyeser)