三態(tài)模型
一個進程從創(chuàng)建而產(chǎn)生至撤銷而消亡的整個生命周期,可以用一組狀態(tài)加以刻劃,根據(jù)三態(tài)模型,進程的生命周期可分為如下三種進程狀態(tài): 1. 運行態(tài)(running):占有處理器正在運行 2. 就緒態(tài)(ready):具備運行條件,等待系統(tǒng)分配處理器以便運行 3. 等待態(tài)(blocked):不具備運行條件,正在等待某個事件的完成。
下面是三個狀態(tài)的轉(zhuǎn)換圖:
運行狀態(tài)的進程將由于出現(xiàn)等待事件而進入等待狀態(tài),當(dāng)?shù)却录Y(jié)束之后等待狀態(tài)的進程將進入就緒狀態(tài),而處理器的調(diào)度策略又會引起運行狀態(tài)和就緒狀態(tài)之間的切換。
引起進程狀態(tài)轉(zhuǎn)換的具體原因如下:
運行態(tài)—→等待態(tài):等待使用資源;如等待外設(shè)傳輸;等待人工干預(yù)。
等待態(tài)—→就緒態(tài):資源得到滿足;如外設(shè)傳輸結(jié)束;人工干預(yù)完成。
運行態(tài)—→就緒態(tài):運行時間片到;出現(xiàn)有更高優(yōu)先權(quán)進程。
就緒態(tài)—→運行態(tài):CPU 空閑時選擇一個就緒進程。
五態(tài)模型
在一個實際的系統(tǒng)里進程的狀態(tài)及其轉(zhuǎn)換比上節(jié)敘述的會復(fù)雜一些,例如引入專門的新建態(tài)(new)和終止態(tài)(exit )
狀態(tài)轉(zhuǎn)換圖如下所示:

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

?
?
在此類系統(tǒng)中,進程增加了兩個新狀態(tài):
掛起就緒態(tài)(ready,suspend)
掛起就緒態(tài)表明了進程具備運行條件但目前在二級存儲器中,只有當(dāng)它被對換到主存才能被調(diào)度執(zhí)行 掛起等待態(tài)(blocked,suspend)掛起等待態(tài)則表明了進程正在等待某一個事件且在二級存儲器中。
引起進程狀態(tài)轉(zhuǎn)換的具體原因如下:
等待態(tài)—→掛起等待態(tài):如果當(dāng)前不存在就緒進程,那么至少有一個等待態(tài)進程將被對換出去成為掛起等待態(tài);操作系統(tǒng)根據(jù)當(dāng)前資源狀況和性能要求,可以決定把等待態(tài)進程對換出去成為掛起等待態(tài)。
掛起等待態(tài)—→掛起就緒態(tài):引起進程等待的事件發(fā)生之后,相應(yīng)的掛起等待態(tài)進程將轉(zhuǎn)換為掛起就緒態(tài)。
掛起就緒態(tài)—→就緒態(tài):當(dāng)內(nèi)存中沒有就緒態(tài)進程,或者掛起就緒態(tài)進程具有比就緒態(tài)進程更高的優(yōu)先級,系統(tǒng)將把掛起就緒態(tài)進程轉(zhuǎn)換成就緒態(tài)。
就緒態(tài)—→掛起就緒態(tài):操作系統(tǒng)根據(jù)當(dāng)前資源狀況和性能要求,也可以決定把就緒態(tài)進程對換出去成為掛起就緒態(tài)。
掛起等待態(tài)—→等待態(tài):當(dāng)一個進程等待一個事件時,原則上不需要把它調(diào)入內(nèi)存。但是在下面一種情況下,這一狀態(tài)變化是可能的。當(dāng)一個進程退出后,主存已經(jīng)有了一大塊自由空間,而某個掛起等待態(tài)進程具有較高的優(yōu)先級并且操作系統(tǒng)已經(jīng)得知導(dǎo)致它阻塞的事件即將結(jié)束,此時便發(fā)生了這一狀態(tài)變化。
運行態(tài)—→掛起就緒態(tài):當(dāng)一個具有較高優(yōu)先級的掛起等待態(tài)進程的等待事件結(jié)束后,它需要搶占 CPU,,而此時主存空間不夠,從而可能導(dǎo)致正在運行的進程轉(zhuǎn)化為掛起就緒態(tài)。另外處于運行態(tài)的進程也可以自己掛起自己。
新建態(tài)—→掛起就緒態(tài):考慮到系統(tǒng)當(dāng)前資源狀況和性能要求,可以決定新建的進程將被對換出去成為掛起就緒態(tài)。
可以把一個掛起進程等同于不在主存的進程,因此掛起的進程將不參與進程調(diào)度直到它們被對換進主存。
一個掛起進程具有如下特征:
該進程不能立即被執(zhí)行。
掛起進程可能會等待一個事件,但所等待的事件是獨立于掛起條件的,事件結(jié)束并不能導(dǎo)致進程具備執(zhí)行條件。
進程進入掛起狀態(tài)是由于操作系統(tǒng)、父進程或進程本身阻止它的運行。
結(jié)束進程掛起狀態(tài)的命令只能通過操作系統(tǒng)或父進程發(fā)出。
Linux操作系統(tǒng)的進程狀態(tài)轉(zhuǎn)換
Linux操作系統(tǒng)的進程
/*
* 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 */
};
?
從Linux源碼中可以看出,Linux下有7中進程狀態(tài):
R運行狀態(tài)(Running):處于運行狀態(tài)的進程并不帶表一定就正在被CPU調(diào)度運行,它包括了正在被CPU運行的進程和可以被CPU調(diào)度運行的程序,也就是說改狀態(tài)包含了三狀態(tài)模型中的就緒態(tài)和運行態(tài)。
S睡眠狀態(tài)(Sleeping):處于改狀態(tài)的進程表示該進程正在等待某時間的完成,通常也稱為可中斷睡眠狀態(tài),該狀態(tài)屬于三狀態(tài)模型中的阻塞態(tài)。
D磁盤休眠狀態(tài)(disk sleep):該狀態(tài)也叫做不可中斷睡眠狀態(tài),處于該狀態(tài)的進程通常都在等待I/O操作的結(jié)束,該狀態(tài)也屬于三狀態(tài)模型中的阻塞態(tài)。
T停止?fàn)顟B(tài)(stopped):我們可以通過向進程發(fā)送SIGSTOP信號讓目標進程處于停止?fàn)顟B(tài),通過向處于停止?fàn)顟B(tài)的進程發(fā)送SIGCON信號讓目標進程繼續(xù)運行,該狀態(tài)也屬于三狀態(tài)模型中的阻塞態(tài)。
t追蹤停止?fàn)顟B(tài)(tracing stop):
X死亡狀態(tài)(dead):該狀態(tài)只是一個返回狀態(tài),不會在任務(wù)列表中見到,該狀態(tài)屬于退出狀態(tài)。
Z僵尸狀態(tài)(zombie):當(dāng)一個進程退出,但它的父進程并沒有去收回該進程的信息時,該進程所處的狀態(tài)叫做僵尸狀態(tài),該狀態(tài)屬于退出狀態(tài)。
Linux系統(tǒng)進程狀態(tài)間的切換

?
創(chuàng)建一個新進程,操作系統(tǒng)會為該新進程創(chuàng)建一個空白PCB(task_struct),用來存儲該進程的各項信息。
評論