點(diǎn)進(jìn)來!告訴你什么是三態(tài)模型、五態(tài)模型、七態(tài)模型、什么是Linux操作系統(tǒng)的進(jìn)程狀態(tài)
三態(tài)模型
一個(gè)進(jìn)程從創(chuàng)建而產(chǎn)生至撤銷而消亡的整個(gè)生命周期,可以用一組狀態(tài)加以刻劃,根據(jù)三態(tài)模型,進(jìn)程的生命周期可分為如下三種進(jìn)程狀態(tài): 1. 運(yùn)行態(tài)(running):占有處理器正在運(yùn)行 2. 就緒態(tài)(ready):具備運(yùn)行條件,等待系統(tǒng)分配處理器以便運(yùn)行 3. 等待態(tài)(blocked):不具備運(yùn)行條件,正在等待某個(gè)事件的完成
下面是三個(gè)狀態(tài)的轉(zhuǎn)換圖:

運(yùn)行狀態(tài)的進(jìn)程將由于出現(xiàn)等待事件而進(jìn)入等待狀態(tài),當(dāng)?shù)却录Y(jié)束之后等待狀態(tài)的進(jìn)程將進(jìn)入就緒狀態(tài),而處理器的調(diào)度策略又會(huì)引起運(yùn)行狀態(tài)和就緒狀態(tài)之間的切換。
引起進(jìn)程狀態(tài)轉(zhuǎn)換的具體原因如下:
運(yùn)行態(tài)—→等待態(tài):等待使用資源;如等待外設(shè)傳輸;等待人工干預(yù)。
等待態(tài)—→就緒態(tài):資源得到滿足;如外設(shè)傳輸結(jié)束;人工干預(yù)完成。
運(yùn)行態(tài)—→就緒態(tài):運(yùn)行時(shí)間片到;出現(xiàn)有更高優(yōu)先權(quán)進(jìn)程。
就緒態(tài)—→運(yùn)行態(tài):CPU 空閑時(shí)選擇一個(gè)就緒進(jìn)程。
五態(tài)模型
在一個(gè)實(shí)際的系統(tǒng)里進(jìn)程的狀態(tài)及其轉(zhuǎn)換比上節(jié)敘述的會(huì)復(fù)雜一些,例如引入專門的新建態(tài)(new)和終止態(tài)(exit )
狀態(tài)轉(zhuǎn)換圖如下所示:

新建態(tài)對(duì)應(yīng)于進(jìn)程剛剛被創(chuàng)建的狀態(tài)。創(chuàng)建一個(gè)進(jìn)程要通過兩個(gè)步驟,
為一個(gè)新進(jìn)程創(chuàng)建必要的管理信息,
讓該進(jìn)程進(jìn)入就緒態(tài)。此時(shí)進(jìn)程將處于新建態(tài),它并沒有被提交執(zhí)行,而是在等待操作系統(tǒng)完成創(chuàng)建進(jìn)程的必 要操作。需要注意的是,操作系統(tǒng)有時(shí)將根據(jù)系統(tǒng)性能或主存容量的限制推遲新建態(tài)進(jìn)程的提交
類似地,進(jìn)程的終止也要通過兩個(gè)步驟,首先,是等待操作系統(tǒng)進(jìn)行善后,然后,退出主存。當(dāng)一個(gè)進(jìn)程到達(dá)了自然結(jié)束點(diǎn),或是出現(xiàn)了無法克服的錯(cuò)誤,或是被操作系統(tǒng)所終結(jié),或是被其他有終止權(quán)的進(jìn)程所終結(jié),它將進(jìn)入終止態(tài)。進(jìn)入終止態(tài)的進(jìn)程以后不再執(zhí)行,但依然臨時(shí)保留在操作系統(tǒng)中等待善后。一旦其他進(jìn)程完成了對(duì)終止態(tài)進(jìn)程的信息抽取之后,操作系統(tǒng)將刪除該進(jìn)程。
引起進(jìn)程狀態(tài)轉(zhuǎn)換的具體原因如下:
NULL—→新建態(tài):執(zhí)行一個(gè)程序,創(chuàng)建一個(gè)子進(jìn)程。
新建態(tài)—→就緒態(tài):當(dāng)操作系統(tǒng)完成了進(jìn)程創(chuàng)建的必要操作,并且當(dāng)前系統(tǒng)的性能和虛擬內(nèi)存的容量均允許。
運(yùn)行態(tài)—→終止態(tài):當(dāng)一個(gè)進(jìn)程到達(dá)了自然結(jié)束點(diǎn),或是出現(xiàn)了無法克服的錯(cuò)誤,或是被操作系統(tǒng)所終結(jié),或是被其他有終止權(quán)的進(jìn)程所終結(jié)。
終止態(tài)—→NULL:完成善后操作。
就緒態(tài)—→終止態(tài):未在狀態(tài)轉(zhuǎn)換圖中顯示,但某些操作系統(tǒng)允許父進(jìn)程終結(jié)子進(jìn)程。
等待態(tài)—→終止態(tài):未在狀態(tài)轉(zhuǎn)換圖中顯示,但某些操作系統(tǒng)允許父進(jìn)程終結(jié)子進(jìn)程。
七態(tài)模型
進(jìn)程的掛起
到目前為止,我們或多或少總是假設(shè)所有的進(jìn)程都在內(nèi)存中。事實(shí)上,可能出現(xiàn)這樣一些情況,例如由于進(jìn)程的不斷創(chuàng)建,系統(tǒng)的資源已經(jīng)不能滿足進(jìn)程運(yùn)行的要求,這個(gè)時(shí)候就必須把某些進(jìn)程掛起(suspend),對(duì)換到磁盤鏡像區(qū)中,暫時(shí)不參與進(jìn)程調(diào)度,起到平滑系統(tǒng)操作負(fù)荷的目的。
引起進(jìn)程掛起的原因是多樣的,主要有:
系統(tǒng)中的進(jìn)程均處于等待狀態(tài),處理器空閑,此時(shí)需要把一些阻塞進(jìn)程對(duì)換出去,以騰出足夠的內(nèi)存裝入就緒進(jìn)程運(yùn)行。
進(jìn)程競(jìng)爭(zhēng)資源,導(dǎo)致系統(tǒng)資源不足,負(fù)荷過重,此時(shí)需要掛起部分進(jìn)程以調(diào)整系統(tǒng)負(fù)荷 ,保證系統(tǒng)的實(shí)時(shí)性或讓系統(tǒng)正常運(yùn)行。
把一些定期執(zhí)行的進(jìn)程(如審計(jì)程序、監(jiān)控程序、記賬程序)對(duì)換出去,以減輕系統(tǒng)負(fù)荷。
用戶要求掛起自己的進(jìn)程,以便根據(jù)中間執(zhí)行情況和中間結(jié)果進(jìn)行某些調(diào)試、檢查和改正。
父進(jìn)程要求掛起自己的后代進(jìn)程,以進(jìn)行某些檢查和改正。
操作系統(tǒng)需要掛起某些進(jìn)程,檢查運(yùn)行中資源使用情況,以改善系統(tǒng)性能;或當(dāng)系統(tǒng)出現(xiàn)故障或某些功能受到破壞時(shí),需要掛起某些進(jìn)程以排除故障。
七態(tài)模型描述
下面是具有七態(tài)模型的進(jìn)程狀態(tài)及其轉(zhuǎn)換:

在此類系統(tǒng)中,進(jìn)程增加了兩個(gè)新狀態(tài):
掛起就緒態(tài)(ready,suspend)
掛起就緒態(tài)表明了進(jìn)程具備運(yùn)行條件但目前在二級(jí)存儲(chǔ)器中,只有當(dāng)它被對(duì)換到主存才能被調(diào)度執(zhí)行 掛起等待態(tài)(blocked,suspend)掛起等待態(tài)則表明了進(jìn)程正在等待某一個(gè)事件且在二級(jí)存儲(chǔ)器中。
引起進(jìn)程狀態(tài)轉(zhuǎn)換的具體原因如下:
等待態(tài)—→掛起等待態(tài):如果當(dāng)前不存在就緒進(jìn)程,那么至少有一個(gè)等待態(tài)進(jìn)程將被對(duì)換出去成為掛起等待態(tài);操作系統(tǒng)根據(jù)當(dāng)前資源狀況和性能要求,可以決定把等待態(tài)進(jìn)程對(duì)換出去成為掛起等待態(tài)。
掛起等待態(tài)—→掛起就緒態(tài):引起進(jìn)程等待的事件發(fā)生之后,相應(yīng)的掛起等待態(tài)進(jìn)程將轉(zhuǎn)換為掛起就緒態(tài)。
掛起就緒態(tài)—→就緒態(tài):當(dāng)內(nèi)存中沒有就緒態(tài)進(jìn)程,或者掛起就緒態(tài)進(jìn)程具有比就緒態(tài)進(jìn)程更高的優(yōu)先級(jí),系統(tǒng)將把掛起就緒態(tài)進(jìn)程轉(zhuǎn)換成就緒態(tài)。
就緒態(tài)—→掛起就緒態(tài):操作系統(tǒng)根據(jù)當(dāng)前資源狀況和性能要求,也可以決定把就緒態(tài)進(jìn)程對(duì)換出去成為掛起就緒態(tài)。
掛起等待態(tài)—→等待態(tài):當(dāng)一個(gè)進(jìn)程等待一個(gè)事件時(shí),原則上不需要把它調(diào)入內(nèi)存。但是在下面一種情況下,這一狀態(tài)變化是可能的。當(dāng)一個(gè)進(jìn)程退出后,主存已經(jīng)有了一大塊自由空間,而某個(gè)掛起等待態(tài)進(jìn)程具有較高的優(yōu)先級(jí)并且操作系統(tǒng)已經(jīng)得知導(dǎo)致它阻塞的事件即將結(jié)束,此時(shí)便發(fā)生了這一狀態(tài)變化。
運(yùn)行態(tài)—→掛起就緒態(tài):當(dāng)一個(gè)具有較高優(yōu)先級(jí)的掛起等待態(tài)進(jìn)程的等待事件結(jié)束后,它需要搶占 CPU,,而此時(shí)主存空間不夠,從而可能導(dǎo)致正在運(yùn)行的進(jìn)程轉(zhuǎn)化為掛起就緒態(tài)。另外處于運(yùn)行態(tài)的進(jìn)程也可以自己掛起自己。
新建態(tài)—→掛起就緒態(tài):考慮到系統(tǒng)當(dāng)前資源狀況和性能要求,可以決定新建的進(jìn)程將被對(duì)換出去成為掛起就緒態(tài)。
可以把一個(gè)掛起進(jìn)程等同于不在主存的進(jìn)程,因此掛起的進(jìn)程將不參與進(jìn)程調(diào)度直到它們被對(duì)換進(jìn)主存。
一個(gè)掛起進(jìn)程具有如下特征:
該進(jìn)程不能立即被執(zhí)行。
掛起進(jìn)程可能會(huì)等待一個(gè)事件,但所等待的事件是獨(dú)立于掛起條件的,事件結(jié)束并不能導(dǎo)致進(jìn)程具備執(zhí)行條件。
進(jìn)程進(jìn)入掛起狀態(tài)是由于操作系統(tǒng)、父進(jìn)程或進(jìn)程本身阻止它的運(yùn)行。
結(jié)束進(jìn)程掛起狀態(tài)的命令只能通過操作系統(tǒng)或父進(jìn)程發(fā)出。
Linux操作系統(tǒng)的進(jìn)程狀態(tài)轉(zhuǎn)換
Linux操作系統(tǒng)的進(jìn)程

從Linux源碼中可以看出,Linux下有7中進(jìn)程狀態(tài):
R運(yùn)行狀態(tài)(Running):處于運(yùn)行狀態(tài)的進(jìn)程并不帶表一定就正在被CPU調(diào)度運(yùn)行,它包括了正在被CPU運(yùn)行的進(jìn)程和可以被CPU調(diào)度運(yùn)行的程序,也就是說改狀態(tài)包含了三狀態(tài)模型中的就緒態(tài)和運(yùn)行態(tài)。
S睡眠狀態(tài)(Sleeping):處于改狀態(tài)的進(jìn)程表示該進(jìn)程正在等待某時(shí)間的完成,通常也稱為可中斷睡眠狀態(tài),該狀態(tài)屬于三狀態(tài)模型中的阻塞態(tài)。
D磁盤休眠狀態(tài)(disk sleep):該狀態(tài)也叫做不可中斷睡眠狀態(tài),處于該狀態(tài)的進(jìn)程通常都在等待I/O操作的結(jié)束,該狀態(tài)也屬于三狀態(tài)模型中的阻塞態(tài)。
T停止?fàn)顟B(tài)(stopped):我們可以通過向進(jìn)程發(fā)送SIGSTOP信號(hào)讓目標(biāo)進(jìn)程處于停止?fàn)顟B(tài),通過向處于停止?fàn)顟B(tài)的進(jìn)程發(fā)送SIGCON信號(hào)讓目標(biāo)進(jìn)程繼續(xù)運(yùn)行,該狀態(tài)也屬于三狀態(tài)模型中的阻塞態(tài)。
t追蹤停止?fàn)顟B(tài)(tracing stop):
X死亡狀態(tài)(dead):該狀態(tài)只是一個(gè)返回狀態(tài),不會(huì)在任務(wù)列表中見到,該狀態(tài)屬于退出狀態(tài)。
Z僵尸狀態(tài)(zombie):當(dāng)一個(gè)進(jìn)程退出,但它的父進(jìn)程并沒有去收回該進(jìn)程的信息時(shí),該進(jìn)程所處的狀態(tài)叫做僵尸狀態(tài),該狀態(tài)屬于退出狀態(tài)。
Linux系統(tǒng)進(jìn)程狀態(tài)間的切換

創(chuàng)建一個(gè)新進(jìn)程,操作系統(tǒng)會(huì)為該新進(jìn)程創(chuàng)建一個(gè)空白PCB(task_struct),用來存儲(chǔ)該進(jìn)程的各項(xiàng)信息。
