日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 内核list head,Linux内核之list_head.pdf

發(fā)布時間:2023/12/8 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 内核list head,Linux内核之list_head.pdf 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Linux內(nèi)核之list_head.pdf

一、 鏈表數(shù)據(jù)結(jié)構(gòu)簡介

/bbs/thread-995286-1-3.html

鏈表是一種常用的組織有序數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),它通過指針將一系列數(shù)據(jù)節(jié)點連接成一條數(shù)據(jù)鏈,

是線性表的一種重要實現(xiàn)方式。相對于數(shù)組,鏈表具有更好的動態(tài)性,建立鏈表時無需預(yù)先知道

數(shù)據(jù)總量,可以隨機分配空間,可以高效地在鏈表中的任意位置實時插入或刪除數(shù)據(jù)。鏈表的開

銷主要是訪問的順序性和組織鏈的空間損失。

通常鏈表數(shù)據(jù)結(jié)構(gòu)至少應(yīng)包含兩個域:數(shù)據(jù)域和指針域,數(shù)據(jù)域用于存儲數(shù)據(jù),指針域用于建立

與下一個節(jié)點的聯(lián)系。按照指針域的組織以及各個節(jié)點之間的聯(lián)系形式,鏈表又可以分為單鏈表 、

雙鏈表、循環(huán)鏈表等多種類型,下面分別給出這幾類常見鏈表類型的示意圖:

1. 單鏈表

圖1 單鏈表

單鏈表是最簡單的一類鏈表,它的特點是僅有一個指針域指向后繼節(jié)點(next),因此,對單鏈

表的遍歷只能從頭至尾(通常是NULL空指針)順序進行。

2. 雙鏈表

圖2 雙鏈表

通過設(shè)計前驅(qū)和后繼兩個指針域,雙鏈表可以從兩個方向遍歷,這是它區(qū)別于單鏈表的地方。如

果打亂前驅(qū)、后繼的依賴關(guān)系,就可以構(gòu)成"二叉樹";如果再讓首節(jié)點的前驅(qū)指向鏈表尾節(jié)點、

尾節(jié)點的后繼指向首節(jié)點(如圖2中虛線部分),就構(gòu)成了循環(huán)鏈表;如果設(shè)計更多的指針域,

就可以構(gòu)成各種復(fù)雜的樹狀數(shù)據(jù)結(jié)構(gòu)。

3. 循環(huán)鏈表

循環(huán)鏈表的特點是尾節(jié)點的后繼指向首節(jié)點。前面已經(jīng)給出了雙循環(huán)鏈表的示意圖,它的特點是

從任意一個節(jié)點出發(fā),沿兩個方向的任何一個,都能找到鏈表中的任意一個數(shù)據(jù)。如果去掉前驅(qū)

指針,就是單循環(huán)鏈表。

在Linux內(nèi)核中使用了大量的鏈表結(jié)構(gòu)來組織數(shù)據(jù),包括設(shè)備列表以及各種功能模塊中的數(shù)據(jù)

組織。這些鏈表大多采用在[include/linux/list.h]實現(xiàn)的一個相當(dāng)精彩的鏈表數(shù)據(jù)結(jié)構(gòu)。本文

的后繼部分就將通過示例詳細介紹這一數(shù)據(jù)結(jié)構(gòu)的組織和使用。

二、 Linux 2.6內(nèi)核鏈表數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)

盡管這里使用2.6內(nèi)核作為講解的基礎(chǔ),但實際上2.4內(nèi)核中的鏈表結(jié)構(gòu)和2.6并沒有什么區(qū)別。

不同之處在于2.6擴充了兩種鏈表數(shù)據(jù)結(jié)構(gòu):鏈表的讀拷貝更新(rcu)和HASH鏈表(hlist)。

這兩種擴展都是基于最基本的list結(jié)構(gòu),因此,本文主要介紹基本鏈表結(jié)構(gòu),然后再簡要介紹一

下rcu和hlist。

鏈表數(shù)據(jù)結(jié)構(gòu)的定義很簡單(節(jié)選自[include/linux/list.h],以下所有代碼,除非加以說明,

其余均取自該文件):

struct list_head {

struct list_head *next, *prev;

};

list_head結(jié)構(gòu)包含兩個指向list_head結(jié)構(gòu)的指針prev和next,由此可見,內(nèi)核的鏈表具

備雙鏈表功能,實際上,通常它都組織成雙循環(huán)鏈表。

和第一節(jié)介紹的雙鏈表結(jié)構(gòu)模型不同,這里的list_head沒有數(shù)據(jù)域。在Linux內(nèi)核鏈表中,

不是在鏈表結(jié)構(gòu)中包含數(shù)據(jù),而是在數(shù)據(jù)結(jié)構(gòu)中包含鏈表節(jié)點。

在數(shù)據(jù)結(jié)構(gòu)課本中,鏈表的經(jīng)典定義方式通常是這樣的(以單鏈表為例):

struct list_node {

struct list_node *next;

ElemType data;

};

因為ElemType的緣故,對每一種數(shù)據(jù)項類型都需要定義各自的鏈表結(jié)構(gòu)。有經(jīng)驗的C++程序

員應(yīng)該知道,標(biāo)準(zhǔn)模板庫中的采用的是C++ Template,利用模板抽象出和數(shù)據(jù)項類型

無關(guān)的鏈表操作接口。

在Linux內(nèi)核鏈表中,需要用鏈表組織起來的數(shù)據(jù)通常會包含一個 struct list_head成員,例

如在[include/linux/netfilter.h]中定義了一個nf_sockopt_ops結(jié)構(gòu)來描述Netfilter為某一

協(xié)議族準(zhǔn)備的getsockopt/setsockopt接口,其中就有一個(struct list_head list)成員,

各個協(xié)議族的nf_sockopt_ops結(jié)構(gòu)都通過這個list成員組織在一個鏈表中,表頭是定義在

[net/core/netfilter.c]中的nf_sockopts(struct list_head)。從下圖中我們可以看到,這種

通用的鏈表結(jié)構(gòu)避免了為每個數(shù)據(jù)項類型定義自己的鏈表的麻煩。Linux的簡捷實用、不求完美

和標(biāo)準(zhǔn)的風(fēng)格,在這里體現(xiàn)得相當(dāng)充分。

圖3 nf_socko

總結(jié)

以上是生活随笔為你收集整理的linux 内核list head,Linux内核之list_head.pdf的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。