溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux內(nèi)核中l(wèi)ist鏈表的源碼分析

發(fā)布時間:2021-11-04 16:37:53 來源:億速云 閱讀:158 作者:柒染 欄目:建站服務(wù)器

這篇文章將為大家詳細(xì)講解有關(guān)linux內(nèi)核中l(wèi)ist鏈表的源碼分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。


linux kernel里的很多數(shù)據(jù)結(jié)構(gòu)都很經(jīng)典, list鏈表就是其中之一,小編將從以下幾方面介紹list鏈表:list的定義、list提供的操作方法、注意事項、使用實例。

前言

linux kernel里的很多數(shù)據(jù)結(jié)構(gòu)都很經(jīng)典, list鏈表就是其中之一

list鏈表


1  List 所在文件

List的所有操作可以在 include/linux/list.h找到;

List head的定義可以在 include/linux/types.h找到;


2  定義

實際上這就是一個雙向循環(huán)鏈表, 且有一個頭指針


list head的定義:

linux內(nèi)核中l(wèi)ist鏈表的源碼分析

這個定義中只有前向和后向指針,沒任何的數(shù)據(jù)部分, 那我們基本上就知道了, 它不是被單獨使用的,而是把它嵌入到用戶定義的struct中, 將用戶定義的數(shù)據(jù)結(jié)構(gòu)串起來,作成list;


思想很巧妙, 對用戶定義的數(shù)據(jù)結(jié)構(gòu)侵入性很小, 實現(xiàn)了c++中std::List模板的功能;


雖然這個定義是叫head, 但其實嵌入到用戶定義的數(shù)據(jù)結(jié)構(gòu)中的也是這個.


3  list提供的操作方法

初始化

linux內(nèi)核中l(wèi)ist鏈表的源碼分析

插入操作

將一個元素插入到兩個元素之間, 即將 new插入到prev和next中, 這個函數(shù)是下面在頭部和尾部插入的實現(xiàn)基礎(chǔ)

linux內(nèi)核中l(wèi)ist鏈表的源碼分析


在頭部插入, 在頭指針和第一個元素間插入

linux內(nèi)核中l(wèi)ist鏈表的源碼分析


在尾部插入,在最后一個元素間和頭指針間插入, 因為是循環(huán)鏈表嘛~

linux內(nèi)核中l(wèi)ist鏈表的源碼分析

刪除操作 

刪除兩個元素之間的元素

linux內(nèi)核中l(wèi)ist鏈表的源碼分析


刪除一個已知元素entry

linux內(nèi)核中l(wèi)ist鏈表的源碼分析

替換操作

都是指針的變換

linux內(nèi)核中l(wèi)ist鏈表的源碼分析

移動操作

將一個元素移動到另一個list的頭部

linux內(nèi)核中l(wèi)ist鏈表的源碼分析


將一個元素移動到另一個list的隊尾

linux內(nèi)核中l(wèi)ist鏈表的源碼分析


拆分操作

將一個隊列由指定的位置拆成兩個隊列


list是新隊列的head指針, 包括的元素從原h(huán)ead隊列的第一個元素到entry, head隊列僅包括余下的元素

linux內(nèi)核中l(wèi)ist鏈表的源碼分析


合并操作

將list列表中除了list本身插入到prev和next之間

linux內(nèi)核中l(wèi)ist鏈表的源碼分析


將一個列表插入到另一個列表的頭部

linux內(nèi)核中l(wèi)ist鏈表的源碼分析


將一個列表插入到另一個列表的尾部

linux內(nèi)核中l(wèi)ist鏈表的源碼分析

list_entry宏

按之前說的, 這個list_head都有要嵌入到用戶定義的struct中,這個宏就是由這個list_head ptr來獲取當(dāng)前所處的struct對象的指針, 用了linux的經(jīng)典宏定義 container_of

linux內(nèi)核中l(wèi)ist鏈表的源碼分析

一堆宏定義, 用來各種遍歷, 獲取entry


4  注意事項

只說一個,就是多線程操作同一個list, 還是需要加鎖


5  使用實例

linux內(nèi)核中l(wèi)ist鏈表的源碼分析

關(guān)于linux內(nèi)核中l(wèi)ist鏈表的源碼分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI