深入分析 Linux作業系統的核心連結串列(轉)
深入分析 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],以下所有程式碼,除非加以說明,其餘均取自該檔案):
連結串列是一種常用的組織有序資料的資料結構,它透過指標將一系列資料節點連線成一條資料鏈,是線性表的一種重要實現方式。相對於陣列,連結串列具有更好的動態性,建立連結串列時無需預先知道資料總量,可以隨機分配空間,可以高效地在連結串列中的任意位置實時插入或刪除資料。連結串列的開銷主要是訪問的順序性和組織鏈的空間損失。
通常連結串列資料結構至少應包含兩個域:資料域和指標域,資料域用於儲存資料,指標域用於建立與下一個節點的聯絡。按照指標域的組織以及各個節點之間的聯絡形式,連結串列又可以分為單連結串列、雙連結串列、迴圈連結串列等多種型別,下面分別給出這幾類常見連結串列型別的示意圖:
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核心連結串列Linux
- Linux核心連結串列-通用連結串列的實現Linux
- Linux核心連結串列Linux
- 作業系統核心結構作業系統
- 麒麟作業系統核心同其他作業系統核心的相似性分析(轉)作業系統
- 深入分析Linux作業系統深度安全加固Linux作業系統
- GNUC擴充套件:Linux作業系統的核心使用(轉)套件Linux作業系統
- linux核心原始碼 -- list連結串列Linux原始碼
- Linux作業系統核心編譯詳解(2)(轉)Linux作業系統編譯
- 基於Linux作業系統核心的漢字顯示(轉)Linux作業系統
- 詳解Linux作業系統的核心空間保護(轉)Linux作業系統
- Linux作業系統成功涉足核心應用領域(轉)Linux作業系統
- Linux 作業系統技術使用總結 (轉)Linux作業系統
- Linux 核心資料結構:雙向連結串列Linux資料結構
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- 一個統一的連結串列結構 (轉)
- 配置安全的Linux作業系統(轉)Linux作業系統
- 核心中的連結串列資料結構資料結構
- Linux作業系統介紹(轉)Linux作業系統
- 作業系統(二):作業系統結構作業系統
- 反轉連結串列、合併連結串列、樹的子結構
- 作業系統核心簡介作業系統
- 作業系統核心之辯作業系統
- Linux核心實戰(二)- 作業系統概覽Linux作業系統
- 《Linux核心分析》 之 作業系統是如何工作的。2Linux作業系統
- 反轉連結串列
- 旋轉連結串列
- 學習作業系統的幾個有用連結,分享作業系統
- Linux作業系統檔案系統的桌面應用(轉)Linux作業系統
- 紅旗Linux作業系統加速(轉)Linux作業系統
- Linux作業系統中如何連線Microsoft OneDriveLinux作業系統ROS
- #反轉連結串列_C++版 #反轉連結串列_Java版 @FDDLCC++Java
- 深入分析Linux系統深度安全加固(轉)Linux
- Linux 作業系統Linux作業系統
- Linux作業系統Linux作業系統
- 作業系統結構作業系統
- 作業系統總結作業系統
- 【LeetCode-連結串列】面試題-反轉連結串列LeetCode面試題