例说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 ...
随机推荐
- 牛客网-《剑指offer》-跳台阶
题目:http://www.nowcoder.com/practice/8c82a5b80378478f9484d87d1c5f12a4 C++ class Solution { public: in ...
- CheeseZH: Stanford University: Machine Learning Ex5:Regularized Linear Regression and Bias v.s. Variance
源码:https://github.com/cheesezhe/Coursera-Machine-Learning-Exercise/tree/master/ex5 Introduction: In ...
- Struts2添加了<s:debug>后页面无效果的解决方案
一.环境 Struts2版本 struts2.5 二.问题 在jsp页面中添加了<s:debug>后页面上无任何展示. 三.解决 在struts.xml中的struts节点下添加如下常量即 ...
- 递归的隐含限制——处理对象小的可以、大的不可以
最近自己编写了一个求n阶行列式的值的C程序,编译成功,并且使用了一个3阶行列式进行了测试,测试也成功了.以为这样就万事大吉了,可是后来在实际应用中调用该函数时却导致程序无法运行.注意到,实际应用中要求 ...
- Python使用SSL方式发送QQ邮箱
#coding:utf-8 import smtplib from email.mime.text import MIMEText from email.header import Header # ...
- Linux文件的软链接和硬链接
1.Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link).还有一种被称为符号链接(Symbolic Link).默认情况下.ln命令产生硬链接. 1.1索引节点 索引节点是 ...
- “Info.plist” couldn’t be removed
Showing All Messages error: failed to remove /Users/Rubert/Library/Developer/Xcode/DerivedData/Proje ...
- Canvas动画 位图缓存提高效率和对应的内存问题
对一个矢量图动画,开启位图缓存能大大提高运行效率.所谓开启位图缓存,其实要自己动手,先创建一个临时canvas,然后把矢量图绘制到这个canvas上,到了实际绘制时,直接把这个临时canvas拷贝到真 ...
- Oracle单引号双重角色——字符串引用与转义
单引号双重角色——字符串引用与转义 在ORACLE中,单引号有两个作用,一是字符串是由单引号引用,二是转义,开始学习时动态构成SQL时经常不解.单引号的使用是就近配对,即就近原则.而在单引号 ...
- 〖Android〗存在多个Android设备时,使用Shell脚本选择一个Android设备
Shell脚本: #!/bin/bash devices=( $(adb devices|grep device$|awk '{print $1}'|xargs echo) ) case ${#dev ...