Linux内核hlist数据结构分析

本文深入剖析了Linux内核中的hlist数据结构,包括hlist_head和hlist_node的定义,以及它们在哈希表中的应用。介绍了hlist的初始化、插入、删除和遍历等操作,强调了hlist在节省空间和提高效率上的设计巧思。
摘要由CSDN通过智能技术生成

     在内核编程中哈希链表hlist使用非常多,比如在openvswitch中流表的存储中就使用了(见[1])。 hlist的表头仅有一个指向首节点的指针,而没有指向尾节点的指针,这样在有很多个buckets的HASH表中存储的表头就能减少一半的空间消耗。
     和hlist相关的数据结构如下,桶中存储的 hlist_head 是具有相同hash值的entry构成的链表,每个entry包含一个 hlist_node 成员,通过它链入到这个哈希链表中。
struct  hlist_head {
       struct  hlist_node *  first ;
};

//next指向下一个节点
// pprev指向前一个节点的next域
struct  hlist_node {
       struct  hlist_node *  next , **  pprev ;
};

结构图为:


由于头结点和其他节点的类型不一致,这样就不能使用普通的prev指针指向前一个节点(否则处理的时候还要讨论是否是第一个节点,没有通用性),这里设计者的巧妙之处就是pprev指针指向前一个节点的next,统一了后续所有的节点。

一些有用的宏:
//头结点初始化
#define  HLIST_HEAD_INIT { .first = NULL }
//构造一个名为name的头结点
#define  HLIST_HEAD(name)  struct  hlist_head name = {  .first = NULL }

//初始化头指针,链表指针
#define  INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
#define  INIT_HLIST_NODE(ptr) ((ptr)->next = NULL, (ptr)->pprev = NULL)

1.删除节点
next得到当前节点的下一个节点,pprev是前一个节点的next字段的地址,那么*pprev就指向的是当前这个节点,那么  *pprev=next 就把当前节点更新为下一个节点了,如果n不是最后一个节点,还要设置next->pprev.
static   inline  void  __hlist_del ( struct 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值