`
javababy1
  • 浏览: 1251302 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

双向链表在内核中的超然地位

阅读更多

玩过内核的人都知道,linux内核中的链表是比较有特色的。利用一个container_of宏来实现链表到数据的计算,不可谓不精妙。(如果不知道的同志赶快上网看看)为什么linux内核要用双向链表?为什么不用单向链表?这是因为双向链表的灵活性,两边都有指针域,更方便增加与删除。有的同志可能会说只要存了单向链表上一步的指针,一样可以删,双向链表没必要。还是那句话,请先看看linux内核中的代码,再来评论。以linux内核中的SKB为例。在传入的时候传的是SKB的指针,传的不是链表,这样反着找前一个就很麻烦了,为什么不用链表?因为SKB才是数据,链表只是用来把SKB串起来,大多数情况下我们是操作SKB的成员,而不是链表,因此,用SKB指针可以更直接的操作数据。我们可以发现在linux内核中除了在一定的条件下将数据插入我们需要管理的链表,在一定的条件下再将数据从链表中删掉以外,更多的是操作我们的数据。这给我们提供了很多指引,教导我们怎么样设计更好的软件,写出更牛X的代码。为什么我之前有篇文章一再谈到悟性很重要,天赋很重要,兴趣很重要,代码就扔那,关键看你能看到多少。各位同志千万不要将身边的所谓高手当作自已的目标,我们要以世界顶级高手为目标,这样就算达不到,也不会太挫。有些东西无论是书,还是BLOG中,是不会说的太明白的,更多的是靠自已领悟,自已去动脑子。

linux内核中有用到hash链表,就我所看到的,也全是一个哈希表再加双向链表来实现的。有时候发现,想从难处想,做从易处做不是没道理的。linux内核的作者们就从活生生的事例向我们证明了这一点。

分享到:
评论

相关推荐

    Linux内核双向链表简单分析

    ### Linux内核双向链表简单分析 #### 链表数据结构简介 链表作为一种基本且重要的数据结构,在操作系统及各种软件系统中扮演着至关重要的角色。尤其在Linux内核中,链表更是广泛应用于内存管理、进程调度、文件...

    支持类模版的C++双向链表

    在C++编程中,双向链表是一种非常重要的数据结构,它允许在列表的任一位置进行插入和删除操作,而不必像数组那样依赖于索引。在这个“支持类模版的C++双向链表”中,我们将探讨如何利用C++的模板特性来实现一个灵活...

    java 单链表和双向链表的实现

    本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...

    创建双向链表_双向链表_

    3. 插入节点:在双向链表中插入节点有两种情况:在头部插入和在尾部插入。在头部插入时,新节点的`next`指针应指向当前头节点,而原头节点的`prev`指针则应指向新节点。在尾部插入时,需要找到当前尾节点,新节点的`...

    数据结构-双向链表

    1. 插入操作:在双向链表中插入节点,需要考虑插入位置,可能是表头、表尾或者中间某个位置。插入操作涉及修改插入点的前后节点的指针,以确保链表的完整性。 2. 删除操作:删除节点同样需要考虑位置,需要更新被...

    深入浅出linux内核源代码之双向链表list_head(list.h).pdf

    双向链表是一种常见的数据结构,在计算机科学中被广泛使用,尤其是在操作系统领域,如Linux内核中。与单向链表相比,双向链表的每个节点不仅包含指向下一个节点的指针,还包含一个指向前一个节点的指针,从而提供更...

    stm32f103 双向链表

    在这个项目中,我们讨论的是如何在STM32F103上实现一个双向链表的数据结构。双向链表是一种特殊的数据结构,它允许我们在列表中的节点之间进行前向和后向的移动,这在处理动态数据集合时非常有用。 首先,我们要...

    双向链表双向链表双向链表

    在双向链表中,每个节点通常包含三个部分:数据部分,用于存储实际的数据;后继指针,指向链表中的下一个节点;以及前驱指针,指向链表中的前一个节点。这种结构允许我们从任意位置快速访问相邻的节点,而不需要像在...

    双向链表的操作

    建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成,数据类型为整型。) Input 第一行:双向表的长度; 第二行:链表中的数据元素。 Output 输出双向链表中...

    C++双向链表统计文章单词出现频率

    双向链表作为数据结构的核心,其特点是每个节点都有指向前后节点的指针,这种特性使得在链表中的插入和删除操作相对高效。 首先,我们要了解双向链表的基础知识。在C++中,标准模板库(STL)提供了一个名为`list`的...

    数据结构 双向链表(C++)

    - **插入节点**:在双向链表中,可以在任何位置插入节点,包括链表的头部和尾部。插入操作需要更新前后节点的指针。 - **删除节点**:同样,删除节点需要考虑调整被删除节点前后节点的指针。 - **遍历链表**:...

    数据结构源代码之双向链表

    // 删除双向链表中的第i个结点 int DLinkListDelete(DNode *L, int i, char *elem); ``` #### DLinkList.cpp - 双向链表的操作实现 ##### 1. 创建双向链表 ```c DNode* CreateDLinkList(DNode *L) { DNode *r, *s...

    操作系统课设-线程安全的双向链表

    在双向链表中实现线程安全,通常需要使用同步原语来保护对链表的操作。在Windows系统中,如VC6.0环境,我们可以使用互斥量(Mutex)、临界区(Critical Section)或信号量(Semaphore)等机制来确保同一时间只有一个...

    双向链表的增删改查

    5. 查找操作:返回链表中第一个匹配给定值的节点,如果没有找到则返回NULL。 ```cpp Node* search(int value) { Node* current = head; while (current) { if (current->data == value) return current; ...

    list_list_

    在Linux内核中,`list`是一个非常重要的数据结构,用于实现高效的双向链表。这个数据结构被广泛应用于内核的各个部分,如内存管理、文件系统、网络协议栈等,因为它提供了灵活且高效的数据组织方式。下面我们将深入...

    C++经典算法 双向链表

    常用的排序方法之一是在链表中插入节点时保持已插入节点的有序性,从而实现整个链表的排序。 #### 交换两个节点 给定代码中的`linkySwap(linky head, linky one, linkytwo)`函数用于交换链表中任意两个节点的位置...

    用双向链表做的n的阶乘

    每个新的乘积会成为链表中的新节点。这样,链表的长度就等于阶乘的阶数,最后一个节点的值就是n的阶乘。 在C语言中,这可以通过定义一个自定义的链表节点结构体来实现,如`struct Node {int data; struct Node* ...

    链存储结构-双向链表

    在"单链表"中,节点仅有一个指针指向下一个节点,这使得在链表中只能从前往后进行线性遍历。而"循环链表"是单链表的一种变体,它的最后一个节点的指针不再为null,而是指向链表的第一个节点,形成一个环状结构,使得...

    双向链表的实现

    与单链表不同,双向链表的每个节点不仅包含指向下一个节点的指针,还包含一个指向前一个节点的指针,这使得在链表中的前向和后向遍历都变得简单高效。 双向链表的主要优点在于它的灵活性。由于每个节点都有前向和后...

Global site tag (gtag.js) - Google Analytics