关于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域了.
原创粉丝点击