您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關linux內核中list鏈表的源碼分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
linux kernel里的很多數據結構都很經典, list鏈表就是其中之一,小編將從以下幾方面介紹list鏈表:list的定義、list提供的操作方法、注意事項、使用實例。
前言
linux kernel里的很多數據結構都很經典, list鏈表就是其中之一
list鏈表
1 List 所在文件
List的所有操作可以在 include/linux/list.h找到;
List head的定義可以在 include/linux/types.h找到;
2 定義
實際上這就是一個雙向循環鏈表, 且有一個頭指針
list head的定義:
這個定義中只有前向和后向指針,沒任何的數據部分, 那我們基本上就知道了, 它不是被單獨使用的,而是把它嵌入到用戶定義的struct中, 將用戶定義的數據結構串起來,作成list;
思想很巧妙, 對用戶定義的數據結構侵入性很小, 實現了c++中std::List模板的功能;
雖然這個定義是叫head, 但其實嵌入到用戶定義的數據結構中的也是這個.
3 list提供的操作方法
初始化
插入操作
將一個元素插入到兩個元素之間, 即將 new插入到prev和next中, 這個函數是下面在頭部和尾部插入的實現基礎
在頭部插入, 在頭指針和第一個元素間插入
在尾部插入,在最后一個元素間和頭指針間插入, 因為是循環鏈表嘛~
刪除操作
刪除兩個元素之間的元素
刪除一個已知元素entry
替換操作
都是指針的變換
移動操作
將一個元素移動到另一個list的頭部
將一個元素移動到另一個list的隊尾
拆分操作
將一個隊列由指定的位置拆成兩個隊列
list是新隊列的head指針, 包括的元素從原head隊列的第一個元素到entry, head隊列僅包括余下的元素
合并操作
將list列表中除了list本身插入到prev和next之間
將一個列表插入到另一個列表的頭部
將一個列表插入到另一個列表的尾部
list_entry宏
按之前說的, 這個list_head都有要嵌入到用戶定義的struct中,這個宏就是由這個list_head ptr來獲取當前所處的struct對象的指針, 用了linux的經典宏定義 container_of
一堆宏定義, 用來各種遍歷, 獲取entry
4 注意事項
只說一個,就是多線程操作同一個list, 還是需要加鎖
5 使用實例
關于linux內核中list鏈表的源碼分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。