介绍

众所周知,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. 微信小程序 - 组件传值给调用页面

    演示如下(可以ctrl+鼠标放大或者下载GIF图片) 1. 先组件定义事件“checkbox”(组件内事件) 2. 调用页面调用它需要加bind:事件名 = 调用页面事件名(bind即绑定调用组件“o ...

  2. 微软BI 之SSRS 系列 - 如何实现报表导航 Navigation 和钻取 Drill Down 的效果

    开篇介绍 如何在 SSRS 报表中实现标签导航 Navigation 和向下钻取 Drill Down的效果? 如同下面这个例子一样 - 在页面第一次加载的时候,默认显示是全部地区的销售总和情况,上面 ...

  3. MySql服务初始化、安装、启动

    /// <summary> /// 安装并开启服务 /// </summary> public static bool InitAndStartService(string s ...

  4. Java多线程-BlockingQueue-ArrayBlockingQueue-LinkedBlockingQueue

    前言: BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.本文详细介绍了Blocking ...

  5. 用Gearman分发PHP应用程序的工作负载

    文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/518 虽然一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体如今 ...

  6. eclipse 使用tomcat运行JavaWeb项目,文件修改后为何不用重启tomcat? (运行web项目的4种方式)探究

                    1.情景说明 在eclipse中,为什么Java文件修改后,重启tomcat class文件才能生效? 为什么jsp修改后,不需重启tomcat就能立即生效? 为什么静 ...

  7. Echarts饼图更改颜色、显示数据且换行

    var option = {   title : {       text: '数据来源',       x:'center'   },   tooltip : {       trigger: 'i ...

  8. django之创建第7-3个项目-在站点blog下单独创建urls.py文件

    1.在站点blog下单独创建urls.py文件 # -*- coding: UTF-8 -*- from django.conf.urls import patterns, include, url ...

  9. 一种通过MQ使缓存和数据库同步的玩法

    其他相关玩法 可以搜索 mysql 和 redis 结合使用

  10. Linux alias别名设置

    alias命令用来设置指令的别名.我们可以使用该命令可以将一些较长的命令进行简化.使用alias时,用户必须使用单引号''将原来的命令引起来,防止特殊字符导致错误. 语法 alias(选项)(参数) ...