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

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

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

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

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

小結(jié):

-
內(nèi)核
+關(guān)注
關(guān)注
4文章
1436瀏覽量
42469 -
Linux
+關(guān)注
關(guān)注
88文章
11622瀏覽量
217824 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
41340 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
131瀏覽量
11296 -
鏈表
+關(guān)注
關(guān)注
0文章
80瀏覽量
10998
發(fā)布評論請先 登錄
數(shù)據(jù)結(jié)構(gòu)中最簡單的鏈表
Linux內(nèi)核的鏈表操作
Linux Kernel數(shù)據(jù)結(jié)構(gòu):鏈表
數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作
Linux內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)的一點認識
OpenHarmony——內(nèi)核IPC機制數(shù)據(jù)結(jié)構(gòu)解析
OpenHarmony——內(nèi)核IPC機制數(shù)據(jù)結(jié)構(gòu)解析
了解Linux通用的雙向循環(huán)鏈表
Linux 內(nèi)核數(shù)據(jù)結(jié)構(gòu):位圖(Bitmap)
你知道Linux內(nèi)核數(shù)據(jù)結(jié)構(gòu)中雙向鏈表的作用?
Linux0.11-進程控制塊數(shù)據(jù)結(jié)構(gòu)
linux內(nèi)核中l(wèi)list.h文件中的鏈表宏講解
Linux內(nèi)核代碼中常用的數(shù)據(jù)結(jié)構(gòu)有哪些?
Linux內(nèi)核中使用的數(shù)據(jù)結(jié)構(gòu)

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