介绍

众所周知,Linux内核大部分是使用GNU C语言写的。C不同于其它的语言,它不具备一个好的数据结构对象或者标准对象库的支持。

所以能够借用Linux内核源代码树的循环双链表是一件非常值得让人高兴的事。

在include/linux/list.h文件里用C实现了一个好用的循环链表。它是有效并且易于操作的,否则它也不会被内核使用(译者注:在kernel中大量的使用了循环双链表结构。比方在在进程描写叙述符实体中我们就能够看到非常多struct list_head的身影)。无论何时。依靠这样的结构,在内核中都能够将不论什么使用它数据结构串起来。仅仅须要一点点改动我们就能够使用这个链表(去除一些硬件prefetching的条目)。

优势

①数据类型不受限制

你能够使用不论什么数据类型,包括struct list_head就能够把你的数据结构串联起来。

②可移植性好

链表使用不受平台限制。

③好用

初始化链表头、訪问节点等的API已经留好了。

④可读性好

在链表的实现过程中使用了macros 和 inlined 函数,使代码更加优雅和可读。

⑤节省时间

链表具有非常好的通用性,所以能够不必反复的创建新的链表结构。

Linux内核实现的链表不同于你所见的其它的链表,通常我们见到的链表节点会包括我们须要链接的数据结构。例如以下:

struct my_list{
void *myitem;
struct my_list *next;
struct my_list *prev;
};

可是在内核中的链表却是将链表节点放在了我们须要链接的数据结构中如:

struct my_cool_list{
struct list_head list; /* kernel's list structure */
int my_cool_data;
void* my_cool_void;
};

注意:

1,链表是在你想要链接的数据结构中的。

2,你能够把链表struct list_head放在你想要链接的数据结构的任何位置;

3。你能够随意命名struct list_head变量;

4。你能够拥有非常多链表。

由于时间太晚了,详细的实例放在例说Linux内核链表(二)中翻译并解说。

原文来自:https://isis.poly.edu/kulesh/stuff/src/klist/

例说Linux内核链表(一)的更多相关文章

  1. 例说Linux内核链表(三)

    经常使用的linux内核双向链表API介绍 linux link list结构图例如以下: 内核双向链表的在linux内核中的位置:/include/linux/list.h 使用双向链表的过程,主要 ...

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

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

  3. linux内核链表分析

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

  4. 深入分析 Linux 内核链表

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

  5. linux内核链表的使用

    linux内核链表:链表通常包括两个域:数据域和指针域.struct list_head{struct list_head *next,*prev;};include/linux/list.h中实现了 ...

  6. Linux 内核链表的使用及深入分析【转】

    转自:http://blog.csdn.net/BoArmy/article/details/8652776 1.内核链表和普通链表的区别 内核链表是一个双向链表,但是与普通的双向链表又有所区别.内核 ...

  7. 链表的艺术——Linux内核链表分析

    引言: 链表是数据结构中的重要成员之中的一个.因为其结构简单且动态插入.删除节点用时少的长处,链表在开发中的应用场景许多.仅次于数组(越简单应用越广). 可是.正如其长处一样,链表的缺点也是显而易见的 ...

  8. Linux 内核链表使用举例

    链表数据结构的定义非常简洁: struct list_head { struct list_head *next, *prev; }; list_head结构包括两个指向list_head结构的指针p ...

  9. Linux内核链表——看这一篇文章就够了

    本文从最基本的内核链表出发,引出初始化INIT_LIST_HEAD函数,然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offseto ...

随机推荐

  1. Lintcode: Add Two Numbers

    C++ /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * List ...

  2. Tomcat8配置进入管理端

    1:修改tomcat-users.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <tomcat ...

  3. Hessian 原理分析

    Hessian 原理分析 一.远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . tcp . u ...

  4. ios网络学习------9 播放网络视频

    IOS提供了叫做MPMoviePlayerController  MPMoviePlayerViewController两个类.能够轻松用来实现视频播放. MPMoviePlayerViewContr ...

  5. RN API备忘

    1:Alert:启动一个提示对话框,包含对应的标题和信息. 2:Animated:动画效果. 3:AppRegistry:React Native应用的入口.应用的根组件应当通过AppRegistry ...

  6. JavaWeb项目配置化之Properties类的使用

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6397370.html  在项目中的应用见: https://github.com/ygj0930/Couple ...

  7. 使用Dom4j创建xml文档

    我们学习dom4j为的就是使用它来创建XML文档.读取文档等更为方便,下面通过一个实例来展示如何通过dom4j去创建XML文档.展示怎样通过两种方式去创建元素,可以直接通过addElement方法返回 ...

  8. 用RotateDrawable实现网易云音乐唱片机效果

    imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="唱片机" title=""> ...

  9. jqueryMobile 动态添加元素,展示刷新视图方法

    jqueryMobile动态添加元素jqueryMobile郏高阳 jQuery Mobile的是一个很好的移动开发框架,你可能已经知道,虽然它有很多难以解决的问题,但是我相信后续版本jquery会修 ...

  10. spring boot mybatis没有扫描jar中的Mapper接口

    只需要在spring boot启动类上加上注解,并指定jar包中接口文件包路径即可 如下: @ComponentScan(basePackages = "com.xx") @Map ...