Linux內(nèi)核實現(xiàn)了自己的鏈表數(shù)據(jù)結構,它的設計與傳統(tǒng)的方式不同,非常巧妙也很通用。
我們先看一下傳統(tǒng)的定義
struct xxx{
void * p;
struct xxx * next,* prev;
}
這種方式將數(shù)據(jù)和鏈表指針定義在一起,整個鏈表也是通過整個結構體連接起來的。 這種鏈表不具有通用性,換一個不同的結構體需要重新定義。

內(nèi)核使用了不同的方式,它把鏈表的指針抽象出來,獨立定義。
struct list_head{
struct list_head *next, *prev;
};
使用的時候嵌入到結構體中即可。

這種方式將數(shù)據(jù)和鏈表剝離開來,去除了鏈表和數(shù)據(jù)的耦合,這樣就可以定義統(tǒng)一的接口,使得鏈表的管理和操作變得非常簡潔。

內(nèi)核在
大家發(fā)現(xiàn)一個問題沒有,我們?nèi)绾潍@得鏈表所在結構體其他數(shù)據(jù)呢?
內(nèi)核使用container_of()函數(shù)實現(xiàn),這個函數(shù)能夠通過結構體內(nèi)部成員的地址找到結構體本身的地址,這樣就可以通過鏈表的地址得到數(shù)據(jù)結構體的地址,然后就可以獲得其他數(shù)據(jù)了。 這些在鏈表的操作方法中都已經(jīng)實現(xiàn)了。
鏈表在內(nèi)核中非常重要,比如所有進程就是通過鏈表管理,進程的子進程、兄弟進程也是鏈表管理,這些在進程描述符中都可以看到。

一個結構中可以包含多個不同的鏈表節(jié)點,分別從屬于不同的鏈表,構成一個錯綜復雜的網(wǎng)絡結構。

小結:

-
內(nèi)核
+關注
關注
4文章
1432瀏覽量
42330 -
Linux
+關注
關注
88文章
11581瀏覽量
217154 -
數(shù)據(jù)結構
+關注
關注
3文章
573瀏覽量
41231 -
結構體
+關注
關注
1文章
131瀏覽量
11268 -
鏈表
+關注
關注
0文章
80瀏覽量
10979
發(fā)布評論請先 登錄

Linux內(nèi)核的鏈表數(shù)據(jù)結構
評論