讓我們深入探討linux中的進(jìn)程概念,包括運(yùn)行、阻塞、掛起狀態(tài),以及pcb內(nèi)核鏈表和進(jìn)程狀態(tài)的詳細(xì)解釋。
1. 概念詳解
運(yùn)行、阻塞、掛起狀態(tài)
內(nèi)容基礎(chǔ):方框中的是調(diào)度隊(duì)列,是一個雙向隊(duì)列,每一個元素是由PCB及其對應(yīng)的代碼數(shù)據(jù)組成的。
-
運(yùn)行:只要進(jìn)程在調(diào)度隊(duì)列中,其狀態(tài)就是運(yùn)行(running)。
-
阻塞:阻塞狀態(tài)是指進(jìn)程在等待某種硬件資源就緒(例如網(wǎng)卡、鍵盤等)。
在操作系統(tǒng)中,除了調(diào)度隊(duì)列(runqueue)外,還有設(shè)備隊(duì)列(device queue)用于管理設(shè)備。設(shè)備隊(duì)列中包含等待隊(duì)列(wait queue)。如果某個進(jìn)程在調(diào)度隊(duì)列中需要從鍵盤讀取數(shù)據(jù),但鍵盤沒有響應(yīng),CPU會將該進(jìn)程從調(diào)度隊(duì)列中移除,并將其鏈接到對應(yīng)硬件的等待隊(duì)列中。這就是阻塞的過程。
- 掛起:掛起的本質(zhì)是將數(shù)據(jù)交換到磁盤中的交換區(qū)(swap partition),通常在內(nèi)存資源不足時發(fā)生。
當(dāng)內(nèi)存資源不足時,如果進(jìn)程處于阻塞狀態(tài),系統(tǒng)會將進(jìn)程的數(shù)據(jù)交換到硬盤的交換分區(qū),保留PCB。當(dāng)內(nèi)存資源充足時,數(shù)據(jù)會從交換分區(qū)被喚出,并與PCB重新組合成進(jìn)程,這就是阻塞掛起。運(yùn)行掛起的情況類似。
2. PCB內(nèi)核鏈表的理解
這是普通的雙端隊(duì)列,可以看到next指針指向下一個元素的頭,prev指針指向上一個元素的頭。
PCB中的next指針直接指向下一個元素的next,prev指針直接指向上一個元素的prev。
一個PCB可以隸屬于多個數(shù)據(jù)結(jié)構(gòu),可以屬于調(diào)度隊(duì)列、等待隊(duì)列,也可以屬于設(shè)備隊(duì)列。因此,PCB可能有多個next和prev指針。
2. 進(jìn)程狀態(tài)
- R(running):表示進(jìn)程正在運(yùn)行。
- S(淺睡眠):例如,輸出一個字符只需1毫秒,但如果進(jìn)程持續(xù)1秒(sleep(1)),剩余時間處于淺睡眠狀態(tài),可以被kill命令終止。
- D(深度睡眠):通常與硬盤數(shù)據(jù)交換有關(guān),不可被kill命令終止。
- Z(僵尸狀態(tài)):子進(jìn)程在運(yùn)行完后不會立即消失,而是先保留信息供父進(jìn)程使用,信息保留在PCB中。
如果僵尸狀態(tài)一直存在,子進(jìn)程的PCB就不會消失,可能會導(dǎo)致內(nèi)存泄漏。
3. 小知識
進(jìn)程退出后,內(nèi)存泄漏的問題就不存在了(例如malloc,進(jìn)程結(jié)束后,申請的內(nèi)存會被系統(tǒng)回收)。常駐內(nèi)存的軟件(例如Windows系統(tǒng)中的一些軟件,開機(jī)后一直運(yùn)行)可能會導(dǎo)致系統(tǒng)卡頓。