例说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/
最新文章
- LoadLibrary加载动态库失败的解决办法
- Redis学习 - 配置属性:bind
- div滚动到页面顶端后固定住
- 配置Android环境遇到的问题及解决办法
- ASP.NET MVC 学习第三天
- Hbase热点问题
- 【译】ASP.NET MVC 5 教程 - 10:添加验证
- redis内存管理代码的目光
- Tomcat过滤器模拟
- Oracle基础学习(二)v$session中Command的数字含义
- 如何打一个FatJar(uber-jar)
- 2142: 逛超市(zznuoj)
- python的车牌号的检测
- Linux 典型应用之服务管理
- js Infinity 属性
- requests_html 使用
- ASP.NET div信息提示框显示几秒后隐藏
- ionic3 下创建ionic1项目
- 图解 MongoDB 地理位置索引的实现原理(转)
- liunx trac 邮件提示功能