Linux内核之—内核链表

一: 链表的介绍及链表的实现原理


     链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链。

     相对于数组,链表具有更好的动态性:1. 建立链表时无需预先知道数据总量;2.可以随机分配空间;3.高效地在链表中的任意位置实时插入或删除数据

      性对于数组,链表也有自己的不足:1.访问的顺序性导致查找的速度比较慢可以;2.组织链表的指针造成多余的空间损失。

      链表结构由数据域和指针域组成。数据域用于存储数据,指针域用于连接前一个或者是下一个节点。链表一般可以分为单链表、双链表、循环链表。下面是几个链表的示意图:

      
图1 单链表

 

 

图2 双链表

 

图3: 循环链表就是在双链表的基础上,加上图2中虚线部分所示。

     

     在Linux内核中使用了大量的链表结构来组织数据,包括设备列表以及各种功能模块中的数据组织。这些链表大多采用在[include/linux/list.h]实现的一个相当精彩的链表数据结构。后继部分就将通过示例详细介绍这一数据结构的组织和使用。

2.6 内核在2.4内核的基础上,增加了两种链表结构,一种是rcu(读-复制-更新),另外的一种是hlist(hash list).

     内核中链表的数据结构和用户态的数据结构不一样,用户态的数据结构是将一个数据域和指针域定义在一个结构体中,而在内核中师将指针域和数据域分开,特定的定义在一个结构体中,再将这样的结构体嵌套在带数据域的结构体中。本人认为这样做好处是:链表的操作能采用统一的接口,不会因为数据域的不同而改变当前链表实现好的函数接口。内核的定义方式如下:

    struct list_head                         list_head结构体是内核中组织链表的常用结构体,没有数据域

    {
        struct list_head *next,

        struct list_head *prev;
    };

 

     struct list_node                  这是内核中定义一个节点的方式,嵌套一个指针域

     {
          struct list_node *next;
          ElemType        data;
      };

 

 

      

 

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值