例说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/ 


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。