linux核心原始碼 -- list連結串列

HULK一線技術雜談發表於2018-10-15


女主宣言

linux kernel裡的很多資料結構都很經典, list連結串列就是其中之一,本文將從以下幾方面介紹list連結串列:list的定義、list提供的操作方法、注意事項、使用例項

PS:豐富的一線技術、多元化的表現形式,盡在“HULK一線技術雜談”,點關注哦!

前言

linux kernel裡的很多資料結構都很經典, list連結串列就是其中之一


本篇要介紹的內容:

  1. list的定義

  2. list提供的操作方法

  3. 注意事項

  4. 使用例項

list連結串列


1  List 所在檔案

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

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


2  定義

實際上這就是一個雙向迴圈連結串列, 且有一個頭指標


list head的定義:

linux核心原始碼 -- list連結串列

這個定義中只有前向和後向指標,沒任何的資料部分, 那我們基本上就知道了, 它不是被單獨使用的,而是把它嵌入到使用者定義的struct中, 將使用者定義的資料結構串起來,作成list;


思想很巧妙, 對使用者定義的資料結構侵入性很小, 實現了c++中std::List模板的功能;


雖然這個定義是叫head, 但其實嵌入到使用者定義的資料結構中的也是這個.


3  list提供的操作方法

初始化

linux核心原始碼 -- list連結串列

插入操作

將一個元素插入到兩個元素之間, 即將 new插入到prev和next中, 這個函式是下面在頭部和尾部插入的實現基礎

linux核心原始碼 -- list連結串列


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

linux核心原始碼 -- list連結串列


在尾部插入,在最後一個元素間和頭指標間插入, 因為是迴圈連結串列嘛~

linux核心原始碼 -- list連結串列

刪除操作 

刪除兩個元素之間的元素

linux核心原始碼 -- list連結串列


刪除一個已知元素entry

linux核心原始碼 -- list連結串列

替換操作

都是指標的變換

linux核心原始碼 -- list連結串列

移動操作

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

linux核心原始碼 -- list連結串列


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

linux核心原始碼 -- list連結串列


拆分操作

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


list是新佇列的head指標, 包括的元素從原head佇列的第一個元素到entry, head佇列僅包括餘下的元素

linux核心原始碼 -- list連結串列


合併操作

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

linux核心原始碼 -- list連結串列


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

linux核心原始碼 -- list連結串列


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

linux核心原始碼 -- list連結串列

list_entry巨集

按之前說的, 這個list_head都有要嵌入到使用者定義的struct中,這個巨集就是由這個list_head ptr來獲取當前所處的struct物件的指標, 用了linux的經典巨集定義 container_of

linux核心原始碼 -- list連結串列

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


4  注意事項

只說一個,就是多執行緒操作同一個list, 還是需要加鎖


5  使用例項

linux核心原始碼 -- list連結串列

HULK一線技術雜談

由360雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算資料庫大資料監控泛前端自動化測試等眾多技術領域,通過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享

linux核心原始碼 -- list連結串列



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

相關文章