悟空决定按照Linux达人教的方法研究Linux内核,他想首先研究Linux内核中数据结构,第一个吸引悟空的是Linux双向链表。
很多程序设计双向链表的方式是如下:
Struct fox{
Int tail_length;
Int weigth;
Struct fox *next;
Struct fox *prev;
};
但是Linux内核的双向链表采用了另外一种方式来实现上面的结构体的双向链表,具体的实现如下:
Struct list_head {
Struct list_head *next;
Struct list_head *prev;
};
Struct fox{
Int tail_length;
Int weigth;
Struct list_head list;
};
虽然这个结构体Struct list_head相当的简单,但是却是Linux内核中最为通用的一个结构体,被很多复杂的结构体包含着。然而令悟空感到神奇的是为什么,Linux要采用这种方式来管理Linux的双向链表,而没有采用通用的方式。
悟空翻阅了很多资料都没有找到答案,最后终于在《Linux内核的设计与实现第三版》这本书中找到了答案。原来采用第一种设计的时候,几乎每种类型的结构体都需要实现双向链表的管理接口,这直接导致了双向链表的管理复杂,而且无法统一管理,和Linux的设计精神简单、高效背道而驰。而采用了第二种双向链表的实现方式,使得双向链表的管理变得相当简单,只需要一套简单的接口就能管理所有的双向链表,其主要的接口如下:
初始化链表元素:void INIT_LIST_HEAD(struct list_head *list);
链表头插入:list_add(struct list_head *new,struct list_head *head);
链表尾插入:list_add_tail(struct list_head *new,struct list_head *head);
删除元素:list_del(struct list_head *entry);
这大大的简化了双向链表的管理难度,真是简单即美。