悟空学Linux专栏----第5篇

  悟空决定按照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);

  这大大的简化了双向链表的管理难度,真是简单即美。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值