linux内核链表---挑战常规思维

时间:2021-09-01 11:06:46

一.普通链表

1.一般教材上的链表定义如下:

struct node{ 
int content;
node *next;
};

它将指针域放在链表节点中,上一个节点指针域中的值指向下一个节点的首地址,以此将a1,到an这n个在内存地址中分布不连续的值连接起来,构成顺序表。

linux内核链表---挑战常规思维

2.链表作为一种数据结构,自然需要为它实现一些函数,比如插入节点,搜索和删除节点等,用来维护它的数据集。

(1).创建链表  node *create(...){...}

(2).插入节点  node *insert(...){...}

(3).删除节点  node *delete(...){...}

...

3.如果在一个程序中需要使用两种类型的链表,如下所示

struct node1{             
int data;              
node1 *next;           
};
struct node2{
int data;
node2 *next;
};

那么当我们在定义它们各自的操作的时候,就需要为每个链表各自定义一套方法。比如说创建链表的操作:

node1 *create(...){...};
node2 *create(...){...};

这样就大大增加了代码量,并且较多的指针操作容易带来隐患。

二. linux的内核链表

  链表在linux内核中是很常用的数据结构,在进程管理,内存管理等很多地方都有使用。比如著名的task_struct就是用链表组织的。在这样一个使用很多链表的系统中,为每个链表定义自己的一套方法是不现实的。因此使用了一种统一的组织形式。

1.内核链表定义

struct list_head{
struct list_head *next,*prev;
};

它是一个不含数据域的节点,用来将含有数据域的节点“串”起来。

2.一个例子如下

struct my_struct{
int data;
list_head *mylist;
};

如果用它创建一个节点


struct my_struct first = {
.data = 10,
   .mylist = LIST_HEAD_INIT(first.mylist)
} ;

创建四个节点并对节点中的数据成员和链表节点成员进行初始化,如下图所示

linux内核链表---挑战常规思维

  可以看到,这种组织形式将节点链域与数据域分离开来,节点中的mylist域的作用就是将各个分离的节点穿起来,而mylist使用统一的list_head类型,对链表进行操作时只需要修改节点中的mylist域,而与整个结构体的类型无关,这样就不需要为每一个链表都定义一套自己的操作函数。

为了更好地理解内核链表的优点,画为如下的形式,可以当数据域是附着在list_head类型的节点域上的,将数据域与指针域分离。当我要增加或删除节点时,只需要改动节点中的指针域即可,而这样的指针就像一根线,如果在系统中只有一种线,那么就只需要定义一套链表操作函数

linux内核链表---挑战常规思维

三.总结

  书本上的知识一般只是讲述原理,技巧性的东西不会涉及太多。在实际应用中,可能一般的套路是行不通的。linux内核中的链表的实现,的确让人觉得是极为精巧的设计。不仅能大大减少代码量,还方便维护。

linux内核链表---挑战常规思维的更多相关文章

  1. linux内核链表分析

    一.常用的链表和内核链表的区别 1.1  常规链表结构        通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节 ...

  2. C语言 Linux内核链表(企业级链表)

    //Linux内核链表(企业级链表) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> ...

  3. 深入分析 Linux 内核链表--转

    引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...

  4. Linux 内核链表

    一 . Linux内核链表 1 . 内核链表函数 1.INIT_LIST_HEAD:创建链表 2.list_add:在链表头插入节点 3.list_add_tail:在链表尾插入节点 4.list_d ...

  5. 深入分析 Linux 内核链表

    转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/   一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...

  6. Linux 内核 链表 的简单模拟(2)

    接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the &amp ...

  7. Linux 内核 链表 的简单模拟(1)

    第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...

  8. linux内核链表的移植与使用

    一.  Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /********************* ...

  9. &lbrack;国嵌攻略&rsqb;&lbrack;108&rsqb;&lbrack;Linux内核链表&rsqb;

    链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入 ...

随机推荐

  1. out 和 ref 参数修饰符

    整理自MSDN out: out 关键字通过引用传递参数.这与 ref 关键字相似,只不过 ref 要求在传递之前初始化变量.若要使用 out 参数,方法定义和调用方法均必须显式使用 out 关键字. ...

  2. Linux下tomcat作为守护进程运行(开机启动、以指定的用户运行、解决非root身份不能绑定1024以下端口的问题)的配置方法

    如题. 参考资料: http://www.jdiy.org/read.jd?id=y0haaynq1w http://blog.csdn.net/shw2004/article/details/578 ...

  3. ES6生成器基础

    ES6引进的最令人兴奋的特性就是一种新的函数生成方式,称为生成器(generator).名称有点奇怪,但是第一眼看上去行为更加奇怪.文章主要介绍生成器如何工作,然后让你明白为什么他们对于未来的JS会有 ...

  4. BZOJ3403&colon; &lbrack;Usaco2009 Open&rsqb;Cow Line 直线上的牛

    3403: [Usaco2009 Open]Cow Line 直线上的牛 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 48  Solved: 41[S ...

  5. 关于Struts2的类型转换详解

    详细出处参考:http://www.jb51.net/article/35465.htm 一.类型转换的意义 对于一个智能的MVC框架而言,不可避免的需要实现类型转换.因为B/S(浏览器/服务器)结构 ...

  6. 56、jsのBOM对象与DOM对象

    javascript的Bom和Dom对象使我们学习的重点,这篇随笔可以重点阅读 一.BOM对象 1.window对象 所有浏览器都支持 window 对象.概念上讲.一个html文档对应一个windo ...

  7. django——web框架简介

    1.web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件. 应用程序有两种模式C/S.B/S.C/S是客户 ...

  8. 了解FPGA市场现状和未来趋势

    转, 来源: http://www.sohu.com/a/204640373_740053 可编程的“万能芯片” FPGA——现场可编程门阵列,是指一切通过软件手段更改.配置器件内部连接结构和逻辑单元 ...

  9. JQuery判断数组中是否包含某个字符串

    var arry = [ "C#", "html", "css", "JavaScript" ]; var result ...

  10. linux上jar包的运行

    指定目录: #!/bin/bash source /etc/profile log() { echo `date +[%Y-%m-%d" "%H:%M:%S]` $1 } log ...