关于pidhash_next与pidhash_prev的理解
来源:互联网 发布:怎么下载淘宝客户端 编辑:程序博客网 时间:2024/05/21 19:37
在linux内核源码中,关于task_struct有一部分关于hash表的结构,大略的定义如下:
哈希表定义:
extern struct task-struct *pidhash[HASH_SZ];
struct task_struct{
......
struct task_struct *pidhash_next;
struct task-struct **pidhash_prev; //关于这部分为什么要这样定义想了很久
......
}
想了很长时间才想明白,pidhash_next指的是hash冲突中,下一个节点的指针,这里很明显,关键是pidhash_prev的意思,后来看了源码后发现,这个pidhash_prev保存的就是当前task_struct指针的地址,这样在删除节点的时候就更加快了。
比如一个链表list,要删除一个节点p,那么需要知道p->prev与p->next的节点,但在这个地方设计的就很巧妙了,可以看看源码的实现:
static inline void unhash_pid(struct task_struct *p){
if(p->pidhash_next) //存在hash冲突
//直接把p的地址赋值给next的pidhash_prev,之前说过pidhash_prev保存的是当指针的地址
p->pidhash_next->pidhash_prev = p->pidhash_prev;
//这一步就是关键点了,这里不用去寻找前一个节点了,直接指针p的地址的值改变了,p前一个节点指向的地址本来就是p的地址这样就实现了链表的删除功能,
*(p->pidhash_prev) = p->pidhash_next;
}
最后总结下:
node1 -> node2 ->node3
一般删除node2的方法是node1->node3,但是在linux的内核中,他是把node2的地址保存为node3,这样就不用修改node1的next域了.
哈希表定义:
extern struct task-struct *pidhash[HASH_SZ];
struct task_struct{
......
struct task_struct *pidhash_next;
struct task-struct **pidhash_prev; //关于这部分为什么要这样定义想了很久
......
}
想了很长时间才想明白,pidhash_next指的是hash冲突中,下一个节点的指针,这里很明显,关键是pidhash_prev的意思,后来看了源码后发现,这个pidhash_prev保存的就是当前task_struct指针的地址,这样在删除节点的时候就更加快了。
比如一个链表list,要删除一个节点p,那么需要知道p->prev与p->next的节点,但在这个地方设计的就很巧妙了,可以看看源码的实现:
static inline void unhash_pid(struct task_struct *p){
if(p->pidhash_next) //存在hash冲突
//直接把p的地址赋值给next的pidhash_prev,之前说过pidhash_prev保存的是当指针的地址
p->pidhash_next->pidhash_prev = p->pidhash_prev;
//这一步就是关键点了,这里不用去寻找前一个节点了,直接指针p的地址的值改变了,p前一个节点指向的地址本来就是p的地址这样就实现了链表的删除功能,
*(p->pidhash_prev) = p->pidhash_next;
}
最后总结下:
node1 -> node2 ->node3
一般删除node2的方法是node1->node3,但是在linux的内核中,他是把node2的地址保存为node3,这样就不用修改node1的next域了.
- 关于pidhash_next与pidhash_prev的理解
- 关于task_struct 中*pidhash_next和**hash_prev的详细图解
- 关于split与StringTokenizer的理解
- 关于Makefile与Kconfig的理解
- 关于c# 栈与堆的理解
- 关于池化与非池化的理解
- 关于strdup的使用与理解
- 关于ContentProvider的理解与简单应用
- 关于知识的理解与忘却
- 关于delegate 与 protocol 的理解 iOS
- 关于二跳率与跳出率的理解
- 关于argc与argv的理解
- 关于编程范式的分析与理解
- 关于split与StringTokenizer的理解
- 关于split与StringTokenizer的理解
- 关于KVC与KVO的理解应用
- 关于static与堆栈的简单理解
- 个人关于java与指针的理解
- 近期英语学习规划
- 经典SQL语句汇总-1
- ubuntu rc启动过程
- 七大实战技巧经验助力网络管理
- 解决方案:Can not find the tag library descriptor for "http://java.sun.com/j...
- 关于pidhash_next与pidhash_prev的理解
- 想要一飞冲天,必先沉得下去
- 一元多项式的运算(加、减、乘)C 实现
- 模板元编程递归解析
- 一致性Hash算法(转)
- 计算机基础之进制转换
- 博文荟萃
- JavaScript Date内置对象小总结
- CSharp将任何文件转成字符串保存到数据