内核中常见的数据结构链表之分析及应用.docVIP

内核中常见的数据结构链表之分析及应用.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内核中常见的数据结构链表之分析及应用 ? 作为实现Linux内核代码的主体语言C,它是朴素的、直接的,直接到你可以对硬件寄存器的某一位进行操作,C语言又是原始的,基本的,基本的就像构建大厦的一块块砖,运用它,你可以随意地建造自己梦想中的大厦。 ?? 但是,与其他语言不同,C语言标准库中并没有对数据结构的支持函数,比如,没有对链表、队、栈、树等数据结构操作的函数集合,但在Linux内核代码中,随处都可以觅见这些数据结构的踪影。 ? 现实世界中数据的组织形式逃脱不出数据结构课程所涵盖的那些结构,相对于其他数据结构而言,链表这种组织方式更常用和灵活,或者说,其他数据结构,都可以从链表衍生而来。 ? 在Linux内核源代码树中,include/linux/list.h??文件中用C语言实现了封装好的、易用的双向链表函数集合,这种实现是高效和可移植的--否则,这些代码也进不了内核,同时,这种实现又是巧妙和可见的,赏析这些代码,让我们领悟代码设计之美妙。 链表及衍生 ? 为什么链表是数据组织的根本形式? ? 最简单的数组组织形式是数组,它在内存顺序存放,其存取效率无疑是高效的,但除非你存放的数据是静态的,否则,增加和删除一个元素的代价是不可小估的。而链表,在建立之初,无需知晓其节点是多少,在构建过程中,增加和删除一个节点与链表的长度无关,主要开销为访问的顺序性和链表节点所占的空间。 ?? 尽管链表可以分类为单链表、双链表和循环链表,但在此,以分析双链表为基点,从而退化或者衍生出其他数据结构。 ??? ?? 在C 语言中,一个基本的双向链表定义如下: struct my_list{ void *mydata; struct my_list *next; struct my_list *prev; }; ??? ??? ????????????????????????? 图1? 双链表 ??? 通过前趋(prev)和后继(next)两个指针字段,就可以从两个方向遍历双链表,这使得遍历链表的代价减少。如果打乱前驱、后继的依赖关系,就可以构成二叉树;如果再让首节点的前趋指向链表尾节点、尾节点的后继指向首节点(如图1中虚线部分),就构成了循环链表;如果设计更多的指针字段,就可以构成各种复杂的树状数据结构。 ?? 如果减少一个指针域,就退化成单链表,如果只能对链表的首尾进行插入或删除操作,就演变为队结构,如果只能对链表的头进行插入或删除操作,就退化为栈结构。?? ?? 如此看来,双链表,是演化各种数据结构的基石。链表实现 ? 抽象是软件设计中一项基本技术,如上所述,在众多数据结构中,选取双向链表作为基本数据结构,这就是一种提取和抽象。 1简约而又不简单的链表定义 于双向链表而言,内核中定义了如下简单结构: ??struct list_head {?? ??? ??? ??? ??? ?? ?? ?struct list_head *next, *prev;?? ?};??? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ??? ?这个不含任何数据项的结构,注定了它的通用性和未来使用的灵活性,例如前面的例子就可以按如下方式定义:? struct my_list{ void *mydata; struct list_head list; }; ? 在此,进一步说明几点: ? list字段,隐藏了链表的指针特性,但正是它,把我们要链接的数据组织成了链表。 struct list_head可以位于结构的任何位置可以给struct list_head起任何名字。在一个结构中可以有多个list? 简约而又不简单struct list_head,以此为基本对象,就衍生了对链表的插入、删除、合并以及遍历等各种操作:2)链表的声明和初始化宏??? ?? 实际上, struct list_head只定义了链表节点,并没有专门定义链表头,那么一个链表结构是如何建立起来的?让我们来看看下面两个宏: #define LIST_HEAD_INIT(name) { (name), (name) } #define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name) ?? 如果我们要申明并定义自己的链表头mylist,直接调用LIST_HEAD: ??? LIST_HEAD(mylist) ?? ?则mylist的next、prev指针都初始化为指向自己,这样,我们就有了一个空链表,如何判断链表是否为空,自己写一下这个简单的函数list_empty?,也就是让头指针的next指向自己而已。 3staitic inline函数-隐藏并展开 ?? 在

文档评论(0)

白领文档(原创) + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档