Linux中的進(jìn)程狀態(tài)和優(yōu)先級(jí)
本篇文章進(jìn)行操作系統(tǒng)中進(jìn)程狀態(tài)的學(xué)習(xí)!?。?/p>
1、進(jìn)程狀態(tài)
1.1、概念
在學(xué)習(xí)OS中的進(jìn)程狀態(tài)時(shí),書上的描述為了在Linux、Windows、Android中都能說的通,往往加深了理解的難度
我們可以先學(xué)習(xí)具體的Linux進(jìn)程狀態(tài),然后再介紹然后再介紹OS學(xué)科的狀態(tài)如何理解
操作系統(tǒng)是計(jì)算機(jī)中的一門“哲學(xué)”,要考慮很多情況
貼幾張不同的進(jìn)程狀態(tài)圖
1.2、具體的進(jìn)程狀態(tài)
1. 具體的進(jìn)程狀態(tài)可以分為四種:
運(yùn)行態(tài):進(jìn)程只要被加載到運(yùn)行隊(duì)列中
如何理解進(jìn)程被加載到運(yùn)行隊(duì)列中?
運(yùn)行隊(duì)列也是一個(gè)對(duì)象,也可以通過描述再組織進(jìn)行管理
運(yùn)行隊(duì)列的屬性其中有PCB指針,可以通過隊(duì)列的性質(zhì)或復(fù)雜的數(shù)據(jù)結(jié)構(gòu)進(jìn)行管理
調(diào)度器的主要作用是在就緒隊(duì)列中選擇優(yōu)先級(jí)最高的任務(wù)運(yùn)行,如果優(yōu)先級(jí)最高的任務(wù)不止一個(gè),則選擇隊(duì)頭的任務(wù)運(yùn)行
當(dāng)運(yùn)行隊(duì)列中的進(jìn)程被調(diào)度時(shí),CPU會(huì)執(zhí)行該進(jìn)程的代碼
2. 終止態(tài):進(jìn)程已經(jīng)終止,但還存在,只是永遠(yuǎn)不運(yùn)行了,隨時(shí)等待被釋放
進(jìn)程都已經(jīng)終止了,為什么不立刻釋放資源,而要維護(hù)一個(gè)終止態(tài)呢?
因?yàn)獒尫胚M(jìn)程的資源需要時(shí)間
CPU不可能一直盯著這個(gè)進(jìn)程,可能還會(huì)在做其他事情,所以要維護(hù)一個(gè)終止態(tài)
例子:比如你去吃飯,吃完后,叫老板結(jié)賬,老板可能沒回應(yīng)你,他可能在給別人點(diǎn)餐
3. 阻塞態(tài):進(jìn)程在等待某種資源時(shí)(非CPU資源),資源沒有就緒的時(shí)候,該進(jìn)程會(huì)到對(duì)應(yīng)的資源等待隊(duì)列中進(jìn)行排隊(duì),該進(jìn)程的代碼并沒有運(yùn)行,就叫做"阻塞態(tài)"
一個(gè)進(jìn)程在被CPU執(zhí)行的時(shí)候,用的不僅僅是CPU的資源
進(jìn)程可能申請(qǐng)更多的資源,如:磁盤、網(wǎng)卡、顯卡、顯示器資源和聲卡資源等等…
申請(qǐng)對(duì)應(yīng)的資源無法滿足時(shí),是需要排隊(duì)的,比如:CPU資源在運(yùn)行隊(duì)列中排隊(duì)
申請(qǐng)其他慢設(shè)備的資源在對(duì)應(yīng)的隊(duì)列中進(jìn)行排隊(duì)
4. 掛起態(tài):當(dāng)內(nèi)存不足時(shí),OS會(huì)將短期內(nèi)不會(huì)被調(diào)度的進(jìn)程的數(shù)據(jù)和代碼挪動(dòng)到磁盤中的swap分區(qū),當(dāng)內(nèi)存足夠時(shí),會(huì)重新加載到內(nèi)存中
1.3、Linux進(jìn)程狀態(tài)
Linux內(nèi)核源代碼中的狀態(tài)
/* * The task state array is a strange "bitmap" of * reasons to sleep. Thus "running" is zero, and * you can test for combinations of others with * simple bit tests. */ static const char * const task_state_array[] = { "R (running)", /* 0 */ "S (sleeping)", /* 1 */ "D (disk sleep)", /* 2 */ "T (stopped)", /* 4 */ "t (tracing stop)", /* 8 */ "X (dead)", /* 16 */ "Z (zombie)", /* 32 */ };
1.3.1、R運(yùn)行狀態(tài)(運(yùn)行態(tài))
R (running)運(yùn)行狀態(tài):進(jìn)程是在運(yùn)行中或在運(yùn)行隊(duì)列中
R狀態(tài)一般是看不出來的,因?yàn)镃PU的運(yùn)算速度非常快,當(dāng)你運(yùn)行程序時(shí),CPU就已經(jīng)執(zhí)行結(jié)束
比如在死循環(huán)中打印hello world,進(jìn)程狀態(tài)一般為"S",因?yàn)镃PU太快了
CPU一般在等待顯示器資源就緒,所以狀態(tài)一直為S
[lyh_sky@localhost lesson11]$ ls makefile test test.cpp [lyh_sky@localhost lesson11]$ cat test.cpp #include <iostream> #include <unistd.h> #include <sys/types.h> using namespace std; int main() { while (1) { cout << "hello world!!!" << endl; sleep(3); } return 0; } [lyh_sky@localhost lesson11]$ cat makefile test:test.cpp g++ test.cpp -o test .PHONY:clean clean: rm -rf test [lyh_sky@localhost lesson11]$ ./test
通過不斷刷新ps指令來查看進(jìn)程狀態(tài)的變化:while :; do ps ajx | head -1 && ps ajx | grep ‘test’ | grep -v grep; sleep 2; echo “#############################################”; done
可以通過不斷的死循環(huán)來讓CPU一直不斷的工作,因?yàn)樗姥h(huán)沒有訪問外設(shè)資源
[lyh_sky@localhost lesson11]$ ls makefile test test.cpp [lyh_sky@localhost lesson11]$ cat test.cpp #include <iostream> #include <unistd.h> #include <sys/types.h> using namespace std; int main() { while (1) { } return 0; } [lyh_sky@localhost lesson11]$ cat makefile test:test.cpp g++ test.cpp -o test .PHONY:clean clean: rm -rf test [lyh_sky@localhost lesson11]$ ./test
1.3.2、S/D睡眠狀態(tài)(阻塞態(tài))
S (sleeping)睡眠狀態(tài):意味著進(jìn)程在等待事件完成
這里的睡眠也叫做:可中斷睡眠(淺睡眠),因?yàn)樗梢酝ㄟ^指令進(jìn)行中斷
可以使用 kill 【-9】 【進(jìn)程PID】進(jìn)行中斷
睡眠狀態(tài)是:該進(jìn)程申請(qǐng)的資源已經(jīng)被其他進(jìn)程使用,該進(jìn)程在對(duì)應(yīng)的“資源等待隊(duì)列中進(jìn)行等待,進(jìn)程中的代碼沒有執(zhí)行
[lyh_sky@localhost lesson11]$ ls makefile test test.cpp [lyh_sky@localhost lesson11]$ cat test.cpp #include <iostream> #include <unistd.h> #include <sys/types.h> using namespace std; int main() { while (1) { cout << "hello world!!!" << endl; sleep(3); } return 0; } [lyh_sky@localhost lesson11]$ cat makefile test:test.cpp g++ test.cpp -o test .PHONY:clean clean: rm -rf test [lyh_sky@localhost lesson11]$ ./test
D磁盤休眠狀態(tài)(Disk sleep)
D狀態(tài)也叫不可中斷睡眠狀態(tài)(uninterruptible sleep),在這個(gè)狀態(tài)的進(jìn)程通常會(huì)等待IO的結(jié)束
D狀態(tài)不能通過指令進(jìn)行中斷,必須等它由D狀態(tài)變成S狀態(tài)時(shí)才能殺死
經(jīng)過上圖可以發(fā)現(xiàn),如果堆磁盤進(jìn)行讀寫時(shí),發(fā)生中斷,會(huì)導(dǎo)致嚴(yán)重的問題
所以才有了D狀態(tài),D狀態(tài)就算是OS也不能對(duì)其進(jìn)行釋放
D狀態(tài)不好模擬,但可以使用"dd指令"進(jìn)行模擬
1.3.3、T/t停止?fàn)顟B(tài)
T停止?fàn)顟B(tài)(stopped):
可以通過發(fā)送 SIGSTOP 信號(hào)或快捷鍵【ctrl+z】給進(jìn)程來停止(T)進(jìn)程
這個(gè)被暫停的進(jìn)程可以通過發(fā)送 SIGCONT 信號(hào)讓進(jìn)程繼續(xù)運(yùn)行
[lyh_sky@localhost lesson11]$ ls makefile test test.cpp [lyh_sky@localhost lesson11]$ cat test.cpp #include <iostream> #include <unistd.h> #include <sys/types.h> using namespace std; int main() { while (1) { cout << getpid() << endl; sleep(2); } return 0; } [lyh_sky@localhost lesson11]$ cat makefile test:test.cpp g++ test.cpp -o test .PHONY:clean clean: rm -rf test [lyh_sky@localhost lesson11]$ ./test
可以通過kill 【-19】 【進(jìn)程PID】將指定進(jìn)程發(fā)生停止運(yùn)行信號(hào)
kill 【-18】【進(jìn)程PID】可以恢復(fù)重新運(yùn)行
還有一種t (tracing stop)狀態(tài):針對(duì)gdb調(diào)試的狀態(tài)
[lyh_sky@localhost lesson11]$ ls makefile test test.cpp [lyh_sky@localhost lesson11]$ cat test.cpp #include <iostream> #include <unistd.h> #include <sys/types.h> using namespace std; int main() { while (1) { cout << getpid() << endl; sleep(2); } return 0; } [lyh_sky@localhost lesson11]$ cat makefile test:test.cpp g++ test.cpp -o test -g .PHONY:clean clean: rm -rf test [lyh_sky@localhost lesson11]$ make g++ test.cpp -o test -g [lyh_sky@localhost lesson11]$ gdb test
1.3.3、X死亡狀態(tài)
X死亡狀態(tài)(dead):這個(gè)狀態(tài)只是一個(gè)返回狀態(tài),你不會(huì)在任務(wù)列表里看到這個(gè)狀態(tài)
1.3.4、Z(zombie)僵尸進(jìn)程
概念:
注意:僵尸進(jìn)程是不能被殺死的,因?yàn)橐呀?jīng)是僵尸了,不能再死第二次!??!
當(dāng)一個(gè)進(jìn)程退出的時(shí)候,一般不會(huì)直接進(jìn)入X狀態(tài)(死亡,資源可以立馬被會(huì)回收),而是進(jìn)入Z狀態(tài)
僵死狀態(tài)(Zombies)是一個(gè)比較特殊的狀態(tài)。當(dāng)進(jìn)程退出并且父進(jìn)程(使用wait()系統(tǒng)調(diào)用)沒有讀取到子進(jìn)程退出的返回代碼時(shí)就會(huì)產(chǎn)生僵死(尸)進(jìn)程
僵死進(jìn)程會(huì)以終止?fàn)顟B(tài)保持在進(jìn)程表中,并且會(huì)一直在等待父進(jìn)程讀取退出狀態(tài)代碼
只要子進(jìn)程退出,父進(jìn)程還在運(yùn)行,但父進(jìn)程沒有讀取子進(jìn)程狀態(tài),子進(jìn)程進(jìn)入Z狀態(tài)
進(jìn)程被創(chuàng)建出來是因?yàn)橛脩粲腥蝿?wù)要交給它執(zhí)行,當(dāng)進(jìn)程退出的時(shí)候,我們不知道這個(gè)進(jìn)程完成的怎么樣了,一般需要將進(jìn)程的執(zhí)行結(jié)果告知給父進(jìn)程和OS
模擬Z狀態(tài):創(chuàng)建子進(jìn)程,子進(jìn)程退出,父進(jìn)程不退出(還在運(yùn)行),子進(jìn)程退出之后的狀態(tài)就是Z
[lyh_sky@localhost lesson11]$ cat test.cpp #include <iostream> #include <cstdlib> #include <unistd.h> #include <sys/types.h> using namespace std; int main() { pid_t id = fork(); int cnt = 3; if (id == 0) { while (cnt) { cout << "我是子進(jìn)程,我還有" << cnt-- << "秒時(shí)間結(jié)束" << endl; sleep(1); } cout << "進(jìn)入僵尸狀態(tài)" << endl; // 結(jié)束子進(jìn)程,并且返回0 exit(0); } else { while (1) {} } return 0; } [lyh_sky@localhost lesson11]$ cat makefile test:test.cpp g++ test.cpp -o test -g .PHONY:clean clean: rm -rf test [lyh_sky@localhost lesson11]$ ./test
僵尸進(jìn)程危害:
如果沒有人回收子進(jìn)程的僵尸,該狀態(tài)會(huì)一直被維!該進(jìn)程的相關(guān)資源(task_struct)不會(huì)被釋放
那一個(gè)父進(jìn)程創(chuàng)建了很多子進(jìn)程,就是不回收,就會(huì)造成內(nèi)存資源的浪費(fèi)!因?yàn)閿?shù)據(jù)結(jié)構(gòu)對(duì)象本身就要占用內(nèi)存,想想C中定義一個(gè)結(jié)構(gòu)體變量,是要在內(nèi)存的某個(gè)位置進(jìn)行開辟空間!
這樣就會(huì)造成內(nèi)存泄漏!??!
2、孤兒進(jìn)程
init進(jìn)程:它是內(nèi)核啟動(dòng)的第一個(gè)用戶級(jí)進(jìn)程
父進(jìn)程如果提前退出,那么子進(jìn)程后退出,進(jìn)入Z之后,那該如何處理呢?
父進(jìn)程先退出,子進(jìn)程就稱之為“孤兒進(jìn)程”
孤兒進(jìn)程被1號(hào)init進(jìn)程領(lǐng)養(yǎng),當(dāng)然要有init進(jìn)程回收嘍
[lyh_sky@localhost lesson11]$ cat test.cpp #include <iostream> #include <cstdlib> #include <unistd.h> #include <sys/types.h> using namespace std; int main() { pid_t id = fork(); int cnt = 3; if (id != 0) { while (cnt) { cout << "我是父進(jìn)程,我還有" << cnt-- << "秒時(shí)間結(jié)束" << endl; sleep(1); } cout << "父進(jìn)程退出" << endl; exit(0); } else { while (1) {} } return 0; } [lyh_sky@localhost lesson11]$ cat makefile test:test.cpp g++ test.cpp -o test -g .PHONY:clean clean: rm -rf test [lyh_sky@localhost lesson11]$ ./test
3、Linux進(jìn)程優(yōu)先級(jí)
3.1、優(yōu)先級(jí)概念
進(jìn)程優(yōu)先級(jí)和權(quán)限的區(qū)別?
進(jìn)程優(yōu)先級(jí)是:進(jìn)程獲取外設(shè)資源的先后順序問題
權(quán)限是:擁有者、所屬組和other是否可以進(jìn)行讀寫執(zhí)行操作
它們的區(qū)別是:在學(xué)校中,我們?nèi)コ燥垼程梅纸處熀蛯W(xué)生,我們不能去教師食堂打飯,這就是權(quán)限。我們打飯時(shí),需要排隊(duì),排在前面可以先打到飯,后面的也一樣可以打到飯,這就是優(yōu)先級(jí)
概念:
cpu資源分配的先后順序,就是指進(jìn)程的優(yōu)先權(quán)(priority)
優(yōu)先權(quán)高的進(jìn)程有優(yōu)先執(zhí)行權(quán)利。配置進(jìn)程優(yōu)先權(quán)對(duì)多任務(wù)環(huán)境的linux很有用,可以改善系統(tǒng)性能
還可以把進(jìn)程運(yùn)行到指定的CPU上,這樣一來,把不重要的進(jìn)程安排到某個(gè)CPU,可以大大改善系統(tǒng)整體性能
為什么要存在進(jìn)程優(yōu)先級(jí)呢???
排隊(duì)的本質(zhì)就是確認(rèn)進(jìn)程的優(yōu)先級(jí)
內(nèi)存里面永遠(yuǎn)都是進(jìn)程占大多數(shù),而資源是少數(shù)(外設(shè):磁盤、網(wǎng)卡、顯卡…)
進(jìn)程競(jìng)爭(zhēng)資源是常態(tài),OS要確認(rèn)進(jìn)程的先后循序,不然就亂套了
3.2、Linux下進(jìn)程優(yōu)先級(jí)的操作
使用【ps -al】指令查看進(jìn)程更多的屬性(包含進(jìn)程優(yōu)先級(jí)):
top指令
進(jìn)入top后按“r”–>輸入進(jìn)程PID–>輸入nice值
[lyh_sky@localhost lesson11]$ ls makefile test test.cpp [lyh_sky@localhost lesson11]$ cat test.cpp #include <iostream> #include <cstdlib> #include <unistd.h> #include <sys/types.h> using namespace std; int main() { while (1) { cout << "hello world!!!" << endl; sleep(2); } return 0; } [lyh_sky@localhost lesson11]$ cat makefile test:test.cpp g++ test.cpp -o test -g .PHONY:clean clean: rm -rf test [lyh_sky@localhost lesson11]$ ./test
我們很容易注意到其中的幾個(gè)重要信息,有下:
- UID : 代表執(zhí)行者的身份
- PID : 代表這個(gè)進(jìn)程的代號(hào)
- PPID :代表這個(gè)進(jìn)程是由哪個(gè)進(jìn)程發(fā)展衍生而來的,亦即父進(jìn)程的代號(hào)
- PRI :代表這個(gè)進(jìn)程可被執(zhí)行的優(yōu)先級(jí),其值越小越早被執(zhí)行
- NI :代表這個(gè)進(jìn)程的nice值
3.3、PRI 和 NI
PRI也還是比較好理解的,即進(jìn)程的優(yōu)先級(jí),或者通俗點(diǎn)說就是程序被CPU執(zhí)行的先后順序,此值越小進(jìn)程的優(yōu)先級(jí)別越高
NI就是nice值,其表示進(jìn)程可被執(zhí)行的優(yōu)先級(jí)的修正數(shù)值
PRI值越小越快被執(zhí)行,那么加入nice值后,將會(huì)使得PRI變?yōu)椋?PRI(new) = PRI(old) + nice
當(dāng)nice值為負(fù)值的時(shí)候,那么該程序?qū)?huì)優(yōu)先級(jí)值將變小,即其優(yōu)先級(jí)會(huì)變高,則其越快被執(zhí)行
調(diào)整進(jìn)程優(yōu)先級(jí),在Linux下,就是調(diào)整進(jìn)程nice值
nice其取值范圍是-20至19,一共40個(gè)級(jí)別,調(diào)整NI時(shí),會(huì)重新變成初始值80,然后+NI值
例如PRI:70 NI:-10,把NI更改成10時(shí),PRI = 80 + 10 = 90
在root用戶下,使用top指令修改進(jìn)程優(yōu)先級(jí):
[lyh_sky@localhost lesson11]$ ls makefile test test.cpp [lyh_sky@localhost lesson11]$ cat test.cpp #include <iostream> #include <cstdlib> #include <unistd.h> #include <sys/types.h> using namespace std; int main() { while (1) { cout << "hello world!!!" << endl; cout << "我的pid是: " << getpid() << endl; sleep(2); } return 0; } [lyh_sky@localhost lesson11]$ cat makefile test:test.cpp g++ test.cpp -o test -g .PHONY:clean clean: rm -rf test [lyh_sky@localhost lesson11]$ ./test
進(jìn)入top指令后輸入r,然后回車,然后輸入需要修改進(jìn)程優(yōu)先級(jí)的pid
輸入pid后回車,接著輸入NI值,就能修改進(jìn)程優(yōu)先級(jí)了
3.4、PRI vs NI
需要強(qiáng)調(diào)一點(diǎn)的是,進(jìn)程的nice值不是進(jìn)程的優(yōu)先級(jí),他們不是一個(gè)概念,但是進(jìn)程nice值會(huì)影響到進(jìn)程的優(yōu)先級(jí)變化
可以理解nice值是進(jìn)程優(yōu)先級(jí)的修正修正數(shù)據(jù)
4、其他概念
1. 競(jìng)爭(zhēng)性:系統(tǒng)進(jìn)程數(shù)目眾多,而CPU資源只有少量,甚至1個(gè),所以進(jìn)程之間是具有競(jìng)爭(zhēng)屬性的。為了高效完成任務(wù),更合理競(jìng)爭(zhēng)相關(guān)資源,便具有了優(yōu)先級(jí)
2. 獨(dú)立性:多進(jìn)程運(yùn)行,需要獨(dú)享各種資源,多進(jìn)程運(yùn)行期間互不干擾
比如:我們?cè)谙螺d東西時(shí),同時(shí)打開瀏覽器進(jìn)行瀏覽,當(dāng)瀏覽器掛掉了,是不會(huì)影響下載的,反之下載掛掉了,也不會(huì)影響瀏覽器
進(jìn)程具有獨(dú)立性,不會(huì)因?yàn)橐粋€(gè)進(jìn)程掛斷或者出現(xiàn)異常,而導(dǎo)致其他進(jìn)程出現(xiàn)問題
3. 并行:多個(gè)進(jìn)程在多個(gè)CPU下,分別同時(shí)進(jìn)行運(yùn)行,這稱之為并行
4. 并發(fā):多個(gè)進(jìn)程在一個(gè)CPU下采用進(jìn)程切換的方式,在一段時(shí)間之內(nèi),讓多個(gè)進(jìn)程都得以推進(jìn),稱之為并發(fā)
操作系統(tǒng),就是簡(jiǎn)單的根據(jù)隊(duì)列來進(jìn)行先后調(diào)度的嗎?有沒有可能突然來了一個(gè)優(yōu)先級(jí)更高的進(jìn)程?
操作系統(tǒng)中有二種內(nèi)核,分為“搶占式內(nèi)核”和“非搶占式內(nèi)核”
當(dāng)正在運(yùn)行的低優(yōu)先級(jí)進(jìn)程,如果來了一個(gè)優(yōu)先級(jí)更高的進(jìn)程,調(diào)度器會(huì)直接把正在執(zhí)行的進(jìn)程從CPU上剝離,放上優(yōu)先級(jí)更高的進(jìn)程,這就是“進(jìn)程搶占”(搶占式內(nèi)核)
5. 進(jìn)程上下文:進(jìn)程在運(yùn)行中產(chǎn)生的各種寄存器數(shù)據(jù),就叫做進(jìn)程的硬件上下文數(shù)據(jù)
當(dāng)進(jìn)程被剝離:需要保存上下文數(shù)據(jù)
當(dāng)進(jìn)程恢復(fù)的時(shí)候:需要將曾經(jīng)保存的 上下文數(shù)據(jù)恢復(fù)到寄存器中
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux系統(tǒng)中如何將普通用戶權(quán)限提升至root權(quán)限
首先,使用普通用戶登錄并通過命令su-切換到臨時(shí)Root狀態(tài),接著,設(shè)置root用戶密碼并使用命令su切換到root用戶,編輯/etc/sudoers文件,修改必要的權(quán)限設(shè)置,并保存退出,然后,修改/etc/passwd文件中的用戶ID從1000改為0,最后,重啟Linux系統(tǒng)2024-10-10CentOS6.5與CentOS7 ssh修改默認(rèn)端口號(hào)的方法
這篇文章主要介紹了CentOS6.5與CentOS7 ssh修改默認(rèn)端口號(hào)的方法,結(jié)合實(shí)例形式分別描述了CentOS6.5及CentOS7針對(duì)ssh修改默認(rèn)端口號(hào)的具體操作步驟、相關(guān)命令與使用技巧,需要的朋友可以參考下2018-04-04Linux系統(tǒng)文件的默認(rèn)權(quán)限和特殊權(quán)限
這篇文章主要介紹了Linux系統(tǒng)文件的默認(rèn)權(quán)限和特殊權(quán)限的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10linux中vim如何刪除當(dāng)前文件中的所有內(nèi)容
這篇文章主要介紹了linux中vim如何刪除當(dāng)前文件中的所有內(nèi)容問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Linux內(nèi)核設(shè)備驅(qū)動(dòng)之內(nèi)核中鏈表的使用筆記整理
今天小編就為大家分享一篇關(guān)于Linux內(nèi)核設(shè)備驅(qū)動(dòng)之內(nèi)核中鏈表的使用筆記整理,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12