内核链表

内核链表:有头双向循环链表

内核链表中不在结点中存放数据,只有前驱结点和后驱结点

将节点存放在数据中

内核链表提供两个宏来获取结构体中的结点

offsetof

获取结构体成员到结构体开头的偏移量

contianer_of

通过偏移量获取结构体首地址

结构体第一个成员的首地址即为结构体的首地址,将结点放在结构体的成员的第一个位置,链表的首地址即为结构体的首地址,方便访问结构体的其他成员数据。

函数指针:指向函数的指针

返回值 (*函数指针名)(形参表)

使用:

函数指针(实参);

指针函数:返回值为指针的函数

1.返回的指针不能指向一个局部变量的空间

2.可以返回malloc、全局变量、静态变量

3.对指针的返回值进行判空

内核链表特点:

高效的数据组织

内核链表通过指针将一系列数据节点连接成链,这种结构允许在不需要预先知道数据总量的情况下,动态地分配空间。这使得内核能够高效地管理内存资源,特别适用于那些数据项数量不确定或经常变化的场景。
灵活的插入和删除操作

相比于数组等静态数据结构,内核链表在插入和删除数据项时更加灵活和高效。在链表中,可以在任意位置实时插入或删除数据项,而无需移动其他数据项,从而减少了操作的时间和空间复杂度。
双向循环链表的高效性

Linux内核中广泛使用的双向循环链表具有极高的效率。这种链表结构使得查找头节点、尾节点、直接前驱和直接后继的时间复杂度均为O(1),大大提升了链表操作的性能。
代码重用和模块化设计

内核链表的设计遵循了代码重用和模块化设计的原则。通过定义一个通用的list_head结构,内核开发人员可以轻松地构造和操作不同对象的列表,而无需为每类对象编写专用的链表函数。这种设计不仅减少了代码的冗余,还提高了代码的可维护性和可扩展性。
良好的扩展性和通用性

内核链表本身不包含数据域,只包含指针域。这使得链表结构能够非常灵活地与各种数据类型结合使用。在需要组织数据时,只需在数据结构中添加一个list_head成员即可将其纳入链表管理。这种设计使得内核链表能够适用于各种复杂的数据组织场景。
安全性考虑

在删除链表节点时,内核链表会将节点的prev和next指针分别设置为特定的“毒化”值(如LIST_POISON1和LIST_POISON2),以确保被删除的节点不会被意外访问,从而提高了链表操作的安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值