Linux2.6内核中链表的实现
来源:互联网 发布:网上销售软件 编辑:程序博客网 时间:2024/06/06 00:06
对于一个计算机专业的学生,链表这种数据结构对我们来说再熟悉不过了,毕竟在大学的《数据结构》中就讲解过,相信你也自己实现过,它实现起来可能是这个样子:(这里的例子都来自《Linux内核设计与实现》第三版)
假定我们有一个数据结构来描述犬科动物中的一员
struct fox{unsigned long tail_length;unsigned long weight;bool is_fantastic;}存储这个结构到链表里的通常方法是在数据结构中嵌入一个链表指针,比如:
struct fox{unsigned long tail_length;unsigned long weight;bool is_fantastic;struct fox *next;struct fox *prev;}
Linux内核方式与众不同,它不是将数据结构塞入链表,而是将链表节点塞入数据结构!
1.链表数据结构
在过去,内核中有很多链表的实现,该选一个既简单,又高效的链表来统一它们了。
链表代码在头文件<linux/list.h>中声明,其数据结构很简单:
struct list_head{struct list_head *next;struct list_head *prev;}next指针指向下一个链表节点,prev指针指向前一个。然而,似乎这里还看不出它们有多大的作用。到底声明才是链表存储的具体内容呢?其实关键在于理解 list_head 结构是如何使用的。
struct fox{unsigned long tail_length;unsigned long weight;bool is_fantastic;struct list_head list;}上述结构中,fox 中的list.next指向下一个元素,list.prev 指向前一个元素。现在链表已经能用了,但是显然还不够方便。因此内核又提供了一组链表操作例程。比如list_add()方法加入一个新的节点到链表中。但是,这些方法都有一个统一的特点:它们只接受 list_head 结构作为参数。使用宏 container_of() 我们可以很方便的从链表指针找到父结构中包含的任何变量。这是因为在 C 语言中,一个给定结构中的变量偏移在编译时地址就被ABI固定下来了。
- Linux2.6内核中链表的实现
- Linux2.6内核中链表的实现
- Linux2.6内核的原子操作的实现
- Linux2.6内核的原子操作的实现
- Linux2.6内核下键盘输入设备驱动的实现
- linux2.6 内核的 initrd
- linux2.6.32内核信号量的实现
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- Linux2.6 内核的 Initrd 机制解析
- OAuth2.0
- SimpleWebRTC
- 导入JavaWeb工程出现很多报错
- IE8打开时自动弹出“开发人员工具”窗口的解决方案
- 《Python核心编程》第二版课后习题——第二章 (记录自己做的习题,可能有误)
- Linux2.6内核中链表的实现
- surf源码解析,附加源码下载链接
- 在Maven中怎么配置外部Jar
- HTTP协议头部详解
- 基本网络设备简介
- C语言笔记2
- context-param元素 与listener解释
- 非常实用的织梦dede所有标签调用方法大全
- iOS中的系统通知