`
pleasetojava
  • 浏览: 741535 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

[十月往昔]——Linux内核中的list.h浅谈

 
阅读更多

为什么要叫做“十月往昔”呢,是为了纪念我的原博客。

不知道为什么,突然想来一个新的开始——而那个博客存活至今刚好十个月,也有十个月里的文档。

十月往昔,总有一些觉得珍贵的,所以搬迁到这里来。

而这篇文章是在09.04.10里写的。

终归是一家之谈。

Jason Lee

————————————–cut-line

/*-------------------------------

include/linux/list.h -2.6.29

*/

该文件包含:

链表的初始化

19-21 行定义了一个list_head 结构,只有两个指向list_head 结构的指针,一个next ,一个prev ,作用显而易见。

23 行的宏LIST_HEAD_INIT(name)25 行的宏LIST_HEAD(name) 组合进行链表的初始化,即nextprev 都指向自身。

25 行的静态内联函数INIT_LIST_HEAD(struct list_head *list) 同样是用来初始化链表,效果同上述一点。GNU 下的C 语言对C 进行了扩充,不再是ANSI C ,它里面增添了很多C++ 的特性,所以对内核进行编译只能选用相应的GCC

INIT_LIST_HEAD 在有的文献中是以宏的形式出现:

链表的插入

这段程序在两个已知的节点中间插入一个新节点。这里选择的是条件编译,如果没有对CONFIG_DEBUG_LIST 进行宏定义,则定义了__list_add 这个静态内联函数,便于以下两个函数使用。

该函数在指定的head 节点后面插入一个新节点new

该函数将一个节点new 插在指定的节点head 之前。

链表的删除

该函数通过设置prevnext 指针指向彼此,实现了删除二者之间节点的功能。但是这里我有个疑惑,删除的指针的释放在哪里实现。

该函数通过调用上面的内联函数实现节点的删除,这里的LIST_POISON1 LIST_POISON2 是在linux / poison . h 定义的。此处仍然是条件编译。

链表节点的置换

静态内联函数list_replace 接受两个参数:oldnew ,并通过new 替换old 。而list_replace_init 函数则是通过调用list_replace 进行替换,之后调用INIT_LIST_HEAD 对被替换的old 进行链表初始化。

链表的移动

List_move 函数接受两个参数,第一个参数list 为想要移动的节点指针,第二个参数为目的地节点指针。该函数通过调用__list_del 函数实现list 节点的prevnext 两个指针互指实现删除list 节点的效果,并且调用list_addlist 节点插入到head 之后。

List_move_tail 函数将指定节点移到指定链表的尾部,成为尾节点。并且由于链表是循环的,所以移动的节点指向该链表head 节点。具体实现是通过目标节点的prevnext 互指实现从原始链表中删除list 节点,之后通过调用list_add_taillist 节点插入到以head 为表首的链表尾部。

判断节点是否为链表的最后一个

通过判断节点的next 指向是否为表首来确定是否为last

判断链表是否为空

通过判断head 节点是否指向自身来判断链表是否为空。

此处函数的作用并不十分理解,对于绿色注释说明部分的DescriptionNOTE 部分也是一知半解。单纯地翻一下NOTE 部分:如果没有经过同步化处理,那么如果要达到安全地使用list_empty_careful 这个函数必须限定当前能对指定节点发生的操作仅仅为list_del_init() ,比如当一个CPU 对它进行add 操作的时候不能使用该函数。

该函数能达到的效果是检查链表是否为空,并且检测是否有CPU 在修改当前指定节点的prevnext 指针。

这里引用一段解释,来自杨沙洲:

Linux 链表另行提供了一个 list_empty_careful() 宏,它同时判断头指针的 next prev ,仅当两者都指向自己时才返回真。这主要是为了应付另一个 cpu 正在处理同一个链表而造成 next prev 不一致的情况。但代码注释也承认,这一安全保障能力有限:除非其他 cpu 的链表操作只有 list_del_init() ,否则仍然不能保证安全,也就是说,还是需要加锁保护。

判断链表是否只有唯一的一个节点

空表并不是一个节点都没有,唯一的节点也不是指只有一个节点,具体看函数代码我们便可以了解。当一个节点指针被执行LIST_HEAD 了以后,它的prevnext 指针都指向自身,这便称为空表;而如果它的prevnext 指针都指向仅有的第二个节点,那么它便称为仅有一个节点。

链表的切割

这里有三个参数,list,head,entry

假设原先有链表:head <-> node1 <-> node2 <-> node3 <-> entry <-> node4 <-> head

那么最后会得到链表1head <-> node4 <-> head 和链表2list <-> node1 <-> node2 <-> node3 <-> entry <-> list

这里最好自己画图模拟一下。

链表的合并

假设有两条链表:head <-> node1 <-> node2 <-> node3 <-> head

和:last <-> list <-> first

那么合并的结果是取代了headlast <-> list <-> first <-> node1 <-> node2 <-> node3 <-> last

以下的合并函数都是调用第一个合并内联函数__list_splice ,区别只在于合并取代的位置以及是否对空出来的head 进行初始化,即调用INIT_LIST_HEAD 等宏。

分享到:
评论

相关推荐

    晏几道——《临江仙》.doc

    在中国古典文学的宝库中,宋代词作以其独特的韵味和深邃的内涵占有重要地位,其中晏几道的《临江仙》更是婉约词派的典范之作。通过梦后酒醒的场景,晏几道将个人情感与自然景物巧妙融合,以独特的艺术手法,展现了深...

    晏几道——《鹧鸪天》.doc

    《鹧鸪天》中所展现出的情感变化,反映了晏几道对美好往昔的怀旧和对现实命运的无奈。他性格中的独立和不羁,以及对世态炎凉的超然态度,都深深影响了他的文学创作。 在艺术风格上,晏几道的词作受到五代词人,尤其...

    《大堰河——我的保姆》教案.docx

    本文将根据《大堰河——我的保姆》教案的相关内容,深入分析这首诗的创作背景、人物关系、情感内核以及教学方法。 首先,《大堰河——我的保姆》是艾青以自己亲身经历为蓝本创作的一首诗。在这首诗中,艾青与...

    教师资格考试、教师招聘考试资料——细数往昔之教育法律法规时间考点.pdf

    教师资格考试、教师招聘考试资料——细数往昔之教育法律法规时间考点.pdf

    专题资料(2021-2022年)《忆往昔,展未来,共发展》——十七大演讲稿443.doc

    教育资料

    高中同学三十周年聚会致辞:重话往昔同学情(范文)..doc

    10. **感恩与敬意**:对老师们的敬意表达了对教育者无私付出的感激之情,他们的影响深远且持久。 这篇致辞提醒我们,尽管生活忙碌,但保持与旧友的联系,分享人生故事,对于个人的成长和情感满足至关重要。同时,它...

    陈与义——《临江仙》精选.doc

    他在“二十余年如一梦,此身虽在堪惊”中表达了对时代巨变的感慨,以及对于个人命运的深切思考。此时的陈与义,不再是那个满怀壮志的青年,而是一个经历了战乱,目睹了国家兴衰的诗人。他在“闲登小阁看新晴”中表现...

    李白——《梁园吟》精选.doc

    在游历大梁(今河南开封)和宋州(今河南商丘)的过程中,李白目睹了曾经辉煌一时的梁园(梁苑)与宋平公的平台,这些历史遗迹与它们往昔的繁荣形成鲜明对比,触发了李白的灵感与情感。 黄河,作为北方的巨川,见证...

    晏几道——《鹧鸪天》精选.doc

    《鹧鸪天》的第二首,晏几道则是在回忆和怀念中展现出了对往昔欢愉时光的无限眷恋。在这首词中,宴会上的热闹场景被生动地刻画出来:彩袖轻舞、杨柳月下,还有那悠扬的歌声,这一切美好的画面都勾起了词人对过去的...

    李清照——《菩萨蛮》精选.doc

    李清照,中国宋代杰出的女词人,以她的《如梦令》、《声声慢》等作品留名青史,而《苏幕遮》和《菩萨蛮》则是其词作中具有代表性的作品,展现了其深邃的艺术风格和复杂的情感世界。这两首词,一首写秋意愁思,一首写...

    jdk-8u181-linux-and-linux.zip

    首先,我们关注的是标题中的"jdk-8u181-linux-and-linux.zip",这表明这个压缩包包含了适用于两种操作系统的JDK版本——Windows和Linux。其中,"u181"是JDK 1.8的一个更新版本号,意味着它包含了自1.8发布以来的若干...

    纳兰性德词赏析——最美诗词.doc

    词中通过残雪、冷月等意象,营造出一种寂寞孤独的氛围,进而引出“知君何事泪纵横”,表达出词人在无尽的惆怅中回忆往昔,感叹人生的无奈。整首词情感深沉,语言优美,展现了纳兰性德词作的特色——情真意切,意蕴...

    填词指要[上卷]-非凡课件——语文PPT课件平台!.doc

    在浩瀚的中国古典诗词海洋中,小令是其中一颗璀璨的明珠,它以简短的篇幅和深邃的意境,传达出诗人的情感和对生活的观照。《填词指要[上卷]》作为一份专业指导文献,为我们揭开了小令这一独特诗歌形式的神秘面纱,让...

    运用科技手段监控 落实安全措施到位——谈太仓裕沁庭项目施工电梯司机指纹人脸识别控制系统的应用.pdf

    回顾往昔,2012年武汉“9·13”施工电梯事故的惨痛教训至今让人记忆犹新,该事件中操作不当导致的人员伤亡给整个建筑行业敲响了警钟。事故的背后暴露出一个共同的问题:非专属司机的操作隐患。在正常施工过程中,...

    辛弃疾——《夜行黄沙道中,》精选.doc

    而当词人行至“旧时茅店社林边,路转溪头忽见”时,一个熟悉的场景猝然出现在眼前,这种突如其来的喜悦和惊喜,不仅为词作增添了生机与活力,也表达了词人在战乱岁月中对往昔宁静生活的怀念。 辛弃疾的词,往往富有...

    浅谈古典诗词中的虚和实.docx

    李煜的《虞美人》中,“春花秋月何时了,往事知多少”便是将四季更替与人生过往相联系,实的景物唤起虚的记忆,表达出诗人对往昔岁月的无限留恋和感慨。 虚实结合的艺术表现手法不仅体现了古典诗词的艺术特色,也...

    七月你好——小清新文艺风工作总结报告ppt模板.zip

    随着七月的到来,我们站在半年的分界点,回顾往昔,展望未来。对于那些需要向团队、领导甚至客户展现自己或团队上半年工作成果的人来说,一份精美的工作总结报告至关重要。它不仅是对成果的展示,更是对个人或团队...

    诵读欣赏——词二首相见欢浣溪沙学习教案.pptx

    在中国古典文学的宝库中,诗词一直占据了极为重要的位置。它们以精炼的语言和深邃的情感,折射出作者的思想感情以及对自然和人生的独特体验。本篇学习教案主要围绕两首相见欢浣溪沙——李煜的《相见欢》和晏殊的...

    浅谈元散曲之蛤蜊味.docx

    在这个时期,很多知识分子失去了往昔的政治地位和社会影响力,转而在文学创作中寻求心灵的慰藉和自我价值的实现。元散曲的兴起和发展正是这一背景下文化表达方式转变的具体体现。 #### “蛤蜊味”的形成原因 元...

Global site tag (gtag.js) - Google Analytics