例说Linux内核链表(一)
介绍
众所周知,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内核链表(一)的更多相关文章
- 例说Linux内核链表(三)
经常使用的linux内核双向链表API介绍 linux link list结构图例如以下: 内核双向链表的在linux内核中的位置:/include/linux/list.h 使用双向链表的过程,主要 ...
- 深入分析 Linux 内核链表--转
引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...
- linux内核链表分析
一.常用的链表和内核链表的区别 1.1 常规链表结构 通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节 ...
- 深入分析 Linux 内核链表
转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/ 一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...
- linux内核链表的使用
linux内核链表:链表通常包括两个域:数据域和指针域.struct list_head{struct list_head *next,*prev;};include/linux/list.h中实现了 ...
- Linux 内核链表的使用及深入分析【转】
转自:http://blog.csdn.net/BoArmy/article/details/8652776 1.内核链表和普通链表的区别 内核链表是一个双向链表,但是与普通的双向链表又有所区别.内核 ...
- 链表的艺术——Linux内核链表分析
引言: 链表是数据结构中的重要成员之中的一个.因为其结构简单且动态插入.删除节点用时少的长处,链表在开发中的应用场景许多.仅次于数组(越简单应用越广). 可是.正如其长处一样,链表的缺点也是显而易见的 ...
- Linux 内核链表使用举例
链表数据结构的定义非常简洁: struct list_head { struct list_head *next, *prev; }; list_head结构包括两个指向list_head结构的指针p ...
- Linux内核链表——看这一篇文章就够了
本文从最基本的内核链表出发,引出初始化INIT_LIST_HEAD函数,然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offseto ...
随机推荐
- 更新image的方法
1. 修改container 1.1 执行 docker images 查看目前的所有images: REPOSITORY TAG IMAGE ID ...
- Want to write a book? Use word count to stay on track
http://paloalto.patch.com/groups/maria-murnanes-blog/p/bp--want-to-write-a-book-use-word-count-to-st ...
- vmware产品框架-计算中心,5.1更新等
概述:SRM,5.1新特性,vCenter Operations的介绍等 5.1改进参见:http://wenku.baidu.com/view/26530362a98271fe910ef961.ht ...
- 〖Linux〗bash和expect执行ssh命令行sshcmd.exp
#!/usr/bin/expect -f # sudo apt-get install expect # ./ssh.exp user passwd server set user [lrange $ ...
- python之模块cmath
# -*- coding: utf-8 -*-#python 27#xiaodeng#python之模块cmath #复数的数学函数,如log.tan.sin等函数用法,针对我目前的情况用途较少,暂不 ...
- codevs 1576 最长严格上升子序列
题目链接:http://codevs.cn/problem/1576/ 题目描述 Description 给一个数组a1, a2 ... an,找到最长的上升降子序列ab1<ab2< .. ...
- Serv-U精简版FTP服务端
Window搭建自己的FTP,Serv-U是很不错的选择... 00.运行视图 注意: 此版本是绿色破解版,个人使用很便捷的.不建议商业使用... download: https://pan.baid ...
- Docker命令分类及使用场景分布(脑图)
常见的Docker命令分类主要有 不同使用场景下的命令分布 有疑问可到官方文档查询: https://docs.docker.com/engine/reference/commandline/dock ...
- JSONObject.parseObject(jsonStr);和JSONObject.fromObject(jsonStr);
虽然都是返回JSONObject,但是 JSONObject.parseObject(jsonStr);这个方法需要导入import com.alibaba.fastjson.JSONObject; ...
- HDUOJ-----Robot Motion
Robot Motion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...