核心驅動開發第四天linux核心鍊錶

2021-06-29 01:25:43 字數 2328 閱讀 7626

基本概念

1.鍊錶是一種常用的資料結構,它通過指標

將一系列資料節點連線成一條資料鏈。

相對於陣列,鍊錶具有更好的動態性,建立

鍊錶時無需預先知道資料總量,可以隨機

分配空間,可以高效地在鍊錶中的任意位

置實時插入或刪除資料。

2.鍊錶的開銷主要

是訪問的順序性和組織鏈的空間損失

通常鍊錶資料結構至少包含兩個域:

資料域和指標域,資料域用於儲存資料,指標

域用於建立與下乙個節點的聯絡。

按照指標域的組織以及各個節點之間的聯絡形

式,鍊錶又可以分為單鏈表、雙鏈表、循

環鏈表等多種型別。

在linux核心中使用了大量的鍊錶結

構來組織資料。這些鍊錶大多採用

了[include/linux/list.h]中實現的一

套精彩的鍊錶資料結構。

實現:1.

鍊錶資料結構的定義:

struct list_head

;list_head結構包含兩個指向list_head結構指標

prev和next,

由此可見,核心的鍊錶具備雙鏈表功

能,實際上,通常它都組織成雙向迴圈鍊錶。

2.鍊錶操作

核心中提供的鍊錶操作主要有:

1.初始化煉表頭

init_list_head(list_head *head)

2.插入節點

list_add(struct list_head *new, struct list_head *head)

list_add_tail(struct list_head *new, struct list_head *head)

3.刪除節點

list_del(struct list_head *entry)

4.提取資料結構

list_entry(ptr, type, member)

已知資料結構中的節點指標ptr,找出資料結

構,例:

list_entry(aup, struct autofs, list)

5.遍歷

list_for_each(struc list_head *pos, struc list_head *head)

例:struct list_head *entry;

struct list_head cs46xx_devs; //煉表頭

list_for_each(entry, &cs46xx_devs)

還有list_for_each_entry

反向遍歷

list_for_each_entry_reverse()

遍歷的同時刪除

list_for_each_entry_safe()

6.釋放

不能使用list_for_each()和list_del()來釋放鍊錶

使用for迴圈和list_del ,然後使用kfree使用kmalloc分配的記憶體

7.移動和合併鍊錶

把節點從乙個鍊錶移動到另乙個鍊錶

list_move()

list_move_tail()

查空list_empty()

將兩個鍊錶合併起來

list_splice()

將兩個鍊錶合併並且重新初始化原來的鍊錶

list_splice_init()

核心資料型別

鍊錶,佇列kfifo,對映,二叉樹(紅黑樹)摘自linux核心設計與實現第三版

資料結構以及選擇

如果對資料集合的主要操作是遍歷資料,就使用鍊錶。事實上沒有資料結構可以提供比線性演算法複雜度更好的演算法遍歷元素,所以你應該用最簡單的資料結構完成簡單工作。另外,當效能並非首要考慮因素時,或者當你需要儲存先對較少的資料時,或者當你需要和核心中其他使用鍊錶的**互動時,請優先選擇鍊錶

如果你的**符合生產者/消費者模式,則使用佇列,特別是如果你想要乙個定長緩衝。佇列會使得新增和刪除工作變得簡單有效。同時佇列也提供了先入先出(fifo)語義,而這也正是生產者/消費者用例的普遍需求。另一方面,如果你需要儲存乙個大小不明的資料集合,那麼鍊錶可能更合適,因為你可以新增任何數量的資料項

如果你需要對映乙個uid到乙個物件,就使用對映。對映結構使得對映工作簡單有效,而且對映可以幫你維護和分配uid。linux的對映介面是針對uid到指標的對映,它並不適合其他場景。但是如果你在處理發給使用者空間的描述符,就考慮一下對映吧。

如果你需要儲存大量資料,並且檢索迅速,那麼紅黑樹最好。紅黑樹可確保搜尋時間複雜度是對數關係,同時也能保證按序遍歷時間複雜度是線性關係。雖然他比任何資料結構複雜一些,但其對記憶體開銷情況並不是太糟。但是如果你沒有執行太多次時間緊迫的查詢操作,則紅黑樹可能不是最好的選擇,這種情況最好使用鍊錶。

linux學習第四天

賬號管理 當我們登入主機的時候輸入的是我們的賬號和密碼,但是主機是不會識別賬號的,畢竟他只認識0和1。我們每乙個賬號都有乙個uid。輸入賬號後,系統會在etc passwd裡面找有沒有對應的uid,如果有,就把uid和gid還有家目錄的shell一起讀出來。然後再去 etc shadow 尋找密碼。...

Linux學習第四天

文字檢視命令 cat連線並顯示檔案內容到標準輸出 顯示檔案內容並顯示行號 cat n 檔名 黑洞機制 shell指令碼裡面經常用 將檔案內容重定向到 dev null cat 檔案 dev null 不帶任何選項時,從標準輸入接收輸出到標準輸出 逆序顯示檔案 tac 從頭開始逐行檢視 more va...

linux學習第四天

1 char ch a int int ch printf d s n a,ch ch是字元型變數,ch裡面裝的是a,a是整型變數,a裡面是字元 a 的二進位制數的整形表示方式,以十進位制表示出來是97,所以輸出結果是97和a 2 0x開頭表示十六進製制數。3 int add 0x12345678 ...