Linux內核實現了自己的鏈表數據結構,它的設計與傳統的方式不同,非常巧妙也很通用。
我們先看一下傳統的定義
struct xxx{
void * p;
struct xxx * next,* prev;
}
這種方式將數據和鏈表指針定義在一起,整個鏈表也是通過整個結構體連接起來的。 這種鏈表不具有通用性,換一個不同的結構體需要重新定義。
內核使用了不同的方式,它把鏈表的指針抽象出來,獨立定義。
struct list_head{
struct list_head *next, *prev;
};
使用的時候嵌入到結構體中即可。
這種方式將數據和鏈表剝離開來,去除了鏈表和數據的耦合,這樣就可以定義統一的接口,使得鏈表的管理和操作變得非常簡潔。
內核在
大家發現一個問題沒有,我們如何獲得鏈表所在結構體其他數據呢?
內核使用container_of()函數實現,這個函數能夠通過結構體內部成員的地址找到結構體本身的地址,這樣就可以通過鏈表的地址得到數據結構體的地址,然后就可以獲得其他數據了。 這些在鏈表的操作方法中都已經實現了。
鏈表在內核中非常重要,比如所有進程就是通過鏈表管理,進程的子進程、兄弟進程也是鏈表管理,這些在進程描述符中都可以看到。
一個結構中可以包含多個不同的鏈表節點,分別從屬于不同的鏈表,構成一個錯綜復雜的網絡結構。
小結:
-
內核
+關注
關注
3文章
1382瀏覽量
40422 -
Linux
+關注
關注
87文章
11345瀏覽量
210387 -
數據結構
+關注
關注
3文章
573瀏覽量
40230 -
結構體
+關注
關注
1文章
130瀏覽量
10872 -
鏈表
+關注
關注
0文章
80瀏覽量
10598
發布評論請先 登錄
相關推薦
評論