内核的hash node结构为啥不是普通链表,而是包含**pprev这样一个成员。

内核编译和嵌入式产品的设计与开发
回复
mll
帖子: 18
注册时间: 2012-09-09 19:57
系统: ubuntu

内核的hash node结构为啥不是普通链表,而是包含**pprev这样一个成员。

#1

帖子 mll »

如下是内核中hash node的结构,为什么不用普通链表的结构,而是使用**pprev的方式,这样有什么好处?

struct hlist_node {
struct hlist_node *next, **pprev;
};
mll
帖子: 18
注册时间: 2012-09-09 19:57
系统: ubuntu

Re: 内核的hash node结构为啥不是普通链表,而是包含**pprev这样一个成员。

#2

帖子 mll »

我自己来回答一下吧:
1 hash表中每个bucket的head只有一个指针,可以节省 4*hashsize 字节的空间。
2 一般hash遍历在出现冲突时都是顺序遍历,极少有需要直接获取链表最后一个节点的场景。
而且一个好的设计,冲突的链表应该都比较短。
3 使用**pprev指针的好处是,删除节点时候处理简单一致,删除最后一个节点不需要特别判断(自己演练一下就明白了)。

主要就是这些原因。linux内核确实非常精致,值得下功夫学习。
回复