Linux内核链表
来源:互联网 发布:电脑软件如何加密 编辑:程序博客网 时间:2024/04/30 19:19
2.4内核中的链表结构核2.6并没有太大区别。二者不同之处在于2.6扩充了两种链表数据结构:链表的读拷贝更新(rcu)和HASH链表(hlist)。这两种扩展都基于最基本的list结构。
链表数据结构定义:
这里的list_head没有数据域。在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点。
Linux内核链表接口
(1)声明和初始化
实际上Linux只定义了链表节点,并没有专门定义链表头,那么一个链表结构是如何建立起来的呢?这里是使用LIST_HEAD()这个宏来构建的。
这样,当需要用LIST_HEAD(nf_sockopts)声明一个名为nf_sockopts的链表头时,它的next、prev指针都初始化为指向自己。这样就构建了一个空链表,因为Linux用头指针的next是否指向自己来判断链表是否为空。
除了用LIST_HEAD()宏在声明的时候初始化一个链表以外,Linux还提供了一个INIT_LIST_HEAD宏用于运行时初始化链表:
(2)插入
对链表的插入操作有两种:在表头插入和在表尾插入。Linux为此提供了两个接口:
因为Linux链表是循环表,且表头的next、prev分别指向链表中的第一个和最后一个节点,所以,list_add和list_add_tail的区别并不大,实际上,Linux分别用以下两个函数来实现接口。
(3)删除
从接口函数中可以看到,被删除下来的prev、next指针分别被设为LIST_POISON1和LIST_POISON2两个特殊值,这样设置是为了保证不在链表中的节点项不可访问,对LIST_POISON1和LIST_POISON2的访问都将引起页故障。与之相对应,list_del_init()函数将节点从链表中解下来之后,调用LIST_INIT_HEAD()将节点置为空链状态。
- linux内核链表
- linux内核链表
- Linux内核链表
- linux内核链表
- linux内核链表
- Linux内核链表
- linux内核链表
- Linux内核链表
- linux内核链表
- linux内核链表
- Linux内核链表
- linux内核链表
- linux内核链表
- Linux内核链表
- linux内核链表
- Linux内核链表
- linux内核链表
- linux 内核链表
- Android如何生成设备节点
- 功能强大易用的Web视频播放器——Flowplayer(使用方法及演示)
- Ubantu10.04 不能升级解决办法
- 新年快乐^_^
- CF
- Linux内核链表
- 祝大家新年快乐,我的博客搬家了,欢迎大家访问(http://blog.fwhyy.com)
- 不成熟的linux程序
- 局域网模拟网络存储:linux iscsi store windows/linux client
- 系统调用
- 经典算法研究系列:四、教你通透彻底理解:BFS和DFS优先搜索算法
- ESET NOD32 从细节到整体的全面防护
- 循环队列
- 2011