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;
      };

 

 

      

 

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章