深入分析 Linux作業系統的核心連結串列(轉)

ba發表於2007-08-16
深入分析 Linux作業系統的核心連結串列(轉)[@more@]  一、 連結串列資料結構簡介

  連結串列是一種常用的組織有序資料的資料結構,它透過指標將一系列資料節點連線成一條資料鏈,是線性表的一種重要實現方式。相對於陣列,連結串列具有更好的動態性,建立連結串列時無需預先知道資料總量,可以隨機分配空間,可以高效地在連結串列中的任意位置實時插入或刪除資料。連結串列的開銷主要是訪問的順序性和組織鏈的空間損失。

  通常連結串列資料結構至少應包含兩個域:資料域和指標域,資料域用於儲存資料,指標域用於建立與下一個節點的聯絡。按照指標域的組織以及各個節點之間的聯絡形式,連結串列又可以分為單連結串列、雙連結串列、迴圈連結串列等多種型別,下面分別給出這幾類常見連結串列型別的示意圖:

  1. 單連結串列

  單連結串列是最簡單的一類連結串列,它的特點是僅有一個指標域指向後繼節點(next),因此,對單連結串列的遍歷只能從頭至尾(通常是 NULL 空指標)順序進行。

  2. 雙連結串列

  透過設計前驅和後繼兩個指標域,雙連結串列可以從兩個方向遍歷,這是它區別於單連結串列的地方。如果打亂前驅、後繼的依賴關係,就可以構成"二叉樹";如果再讓首節點的前驅指向連結串列尾節點、尾節點的後繼指向首節點(如圖2中虛線部分),就構成了迴圈連結串列;如果設計更多的指標域,就可以構成各種複雜的樹狀資料結構。

  3. 迴圈連結串列

  迴圈連結串列的特點是尾節點的後繼指向首節點。前面已經給出了雙迴圈連結串列的示意圖,它的特點是從任意一個節點出發,沿兩個方向的任何一個,都能找到連結串列中的任意一個資料。如果去掉前驅指標,就是單迴圈連結串列。

  在Linux核心中使用了大量的連結串列結構來組織資料,包括裝置列表以及各種功能模組中的資料組織。這些連結串列大多采用在[include/linux/list.h]實現的一個相當精彩的連結串列資料結構。本文的後繼部分就將透過示例詳細介紹這一資料結構的組織和使用。

  二、 Linux 2.6 核心連結串列資料結構的實現

  儘管這裡使用2.6核心作為講解的基礎,但實際上 2.4 核心中的連結串列結構和 2.6 並沒有什麼區別。不同之處在於 2.6 擴充了兩種連結串列資料結構:連結串列的讀複製更新(rcu)和 HASH 連結串列(hlist)。這兩種擴充套件都是基於最基本的 list 結構,因此,本文主要介紹基本連結串列結構,然後再簡要介紹一下 rcu 和 hlist。

  連結串列資料結構的定義很簡單(節選自 [include/linux/list.h],以下所有程式碼,除非加以說明,其餘均取自該檔案):
CODE:
struct list_head { struct list_head *next, *prev; };

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-961246/,如需轉載,請註明出處,否則將追究法律責任。

深入分析 Linux作業系統的核心連結串列(轉)
請登入後發表評論 登入
全部評論

相關文章