Linux內(nèi)核實(shí)現(xiàn)了自己的鏈表數(shù)據(jù)結(jié)構(gòu),它的設(shè)計(jì)與傳統(tǒng)的方式不同,非常巧妙也很通用。
我們先看一下傳統(tǒng)的定義
struct xxx{
void * p;
struct xxx * next,* prev;
}
這種方式將數(shù)據(jù)和鏈表指針定義在一起,整個(gè)鏈表也是通過整個(gè)結(jié)構(gòu)體連接起來的。 這種鏈表不具有通用性,換一個(gè)不同的結(jié)構(gòu)體需要重新定義。
內(nèi)核使用了不同的方式,它把鏈表的指針抽象出來,獨(dú)立定義。
struct list_head{
struct list_head *next, *prev;
};
使用的時(shí)候嵌入到結(jié)構(gòu)體中即可。
這種方式將數(shù)據(jù)和鏈表剝離開來,去除了鏈表和數(shù)據(jù)的耦合,這樣就可以定義統(tǒng)一的接口,使得鏈表的管理和操作變得非常簡(jiǎn)潔。
內(nèi)核在
大家發(fā)現(xiàn)一個(gè)問題沒有,我們?nèi)绾潍@得鏈表所在結(jié)構(gòu)體其他數(shù)據(jù)呢?
內(nèi)核使用container_of()函數(shù)實(shí)現(xiàn),這個(gè)函數(shù)能夠通過結(jié)構(gòu)體內(nèi)部成員的地址找到結(jié)構(gòu)體本身的地址,這樣就可以通過鏈表的地址得到數(shù)據(jù)結(jié)構(gòu)體的地址,然后就可以獲得其他數(shù)據(jù)了。 這些在鏈表的操作方法中都已經(jīng)實(shí)現(xiàn)了。
鏈表在內(nèi)核中非常重要,比如所有進(jìn)程就是通過鏈表管理,進(jìn)程的子進(jìn)程、兄弟進(jìn)程也是鏈表管理,這些在進(jìn)程描述符中都可以看到。
一個(gè)結(jié)構(gòu)中可以包含多個(gè)不同的鏈表節(jié)點(diǎn),分別從屬于不同的鏈表,構(gòu)成一個(gè)錯(cuò)綜復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)。
小結(jié):
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1416瀏覽量
41416 -
Linux
+關(guān)注
關(guān)注
87文章
11509瀏覽量
213720 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40741 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
11113 -
鏈表
+關(guān)注
關(guān)注
0文章
80瀏覽量
10835
發(fā)布評(píng)論請(qǐng)先 登錄
數(shù)據(jù)結(jié)構(gòu)中最簡(jiǎn)單的鏈表
Linux內(nèi)核的鏈表操作
Linux Kernel數(shù)據(jù)結(jié)構(gòu):鏈表
數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作
Linux內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)的一點(diǎn)認(rèn)識(shí)
OpenHarmony——內(nèi)核IPC機(jī)制數(shù)據(jù)結(jié)構(gòu)解析
OpenHarmony——內(nèi)核IPC機(jī)制數(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-進(jìn)程控制塊數(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)

評(píng)論