嵌入式day39
内核链表:有头双向循环链表
内核链表中不在结点中存放数据,只有前驱结点和后驱结点
将节点存放在数据中
内核链表提供两个宏来获取结构体中的结点
offsetof
获取结构体成员到结构体开头的偏移量
contianer_of
通过偏移量获取结构体首地址
结构体第一个成员的首地址即为结构体的首地址,将结点放在结构体的成员的第一个位置,链表的首地址即为结构体的首地址,方便访问结构体的其他成员数据。
函数指针:指向函数的指针
返回值 (*函数指针名)(形参表)
使用:
函数指针(实参);
指针函数:返回值为指针的函数
1.返回的指针不能指向一个局部变量的空间
2.可以返回malloc、全局变量、静态变量
3.对指针的返回值进行判空
内核链表特点:
-
高效的数据组织
内核链表通过指针将一系列数据节点连接成链,这种结构允许在不需要预先知道数据总量的情况下,动态地分配空间。这使得内核能够高效地管理内存资源,特别适用于那些数据项数量不确定或经常变化的场景。 -
灵活的插入和删除操作
相比于数组等静态数据结构,内核链表在插入和删除数据项时更加灵活和高效。在链表中,可以在任意位置实时插入或删除数据项,而无需移动其他数据项,从而减少了操作的时间和空间复杂度。 -
双向循环链表的高效性
Linux内核中广泛使用的双向循环链表具有极高的效率。这种链表结构使得查找头节点、尾节点、直接前驱和直接后继的时间复杂度均为O(1),大大提升了链表操作的性能。 -
代码重用和模块化设计
内核链表的设计遵循了代码重用和模块化设计的原则。通过定义一个通用的list_head
结构,内核开发人员可以轻松地构造和操作不同对象的列表,而无需为每类对象编写专用的链表函数。这种设计不仅减少了代码的冗余,还提高了代码的可维护性和可扩展性。 -
良好的扩展性和通用性
内核链表本身不包含数据域,只包含指针域。这使得链表结构能够非常灵活地与各种数据类型结合使用。在需要组织数据时,只需在数据结构中添加一个list_head
成员即可将其纳入链表管理。这种设计使得内核链表能够适用于各种复杂的数据组织场景。 -
安全性考虑
在删除链表节点时,内核链表会将节点的prev
和next
指针分别设置为特定的“毒化”值(如LIST_POISON1
和LIST_POISON2
),以确保被删除的节点不会被意外访问,从而提高了链表操作的安全性。