一、進程的狀態和裝換
1.1進程的三態模型
按進程在執行過程中的不同情況至少要定義三種狀態:
-
運行(running)態:進程占有處理器正在運行的狀態。
-
就緒(ready)態:進程具備運行條件,等待系統分配處理器以便運行的狀態。
當進程已分配到除CPU以外的所有必要資源后,只要再獲得CPU,便可立即執行,進程這時的狀態稱為就緒狀態。在一個系統中處於就緒狀態的進程可能有多個,通常將它們排成一個隊列,稱為就緒隊列。
-
等待(wait)態:又稱阻塞態或睡眠態,指進程不具備運行條件,正在等待某個時間完成的狀態。
也稱為等待或睡眠狀態,一個進程正在等待某一事件發生(例如請求I/O而等待I/O完成等)而暫時停止運行,這時即使把處理機分配給進程也無法運行,故稱該進程處於阻塞狀態。
引起進程狀態轉換的具體原因如下:
運行態→等待態:等待使用資源;如等待外設傳輸;等待人工干預。
等待態→就緒態:資源得到滿足;如外設傳輸結束;人工干預完成。
運行態→就緒態:運行時間片到;出現有更高優先權進程。
就緒態—→運行態:CPU 空閑時選擇一個就緒進程。
1.2 進程的五態模型
五態模型在三態模型的基礎上增加了新建態(new)和終止態(exit)。
-
新建態:對應於進程被創建時的狀態,尚未進入就緒隊列。
創建一個進程需要通過兩個步驟:
1.為新進程分配所需要資源和建立必要的管理信息。
2.設置該進程為就緒態,並等待被調度執行。
-
終止態:指進程完成任務到達正常結束點,或出現無法克服的錯誤而異常終止,或被操作系統及有終止權的進程所終止時所處的狀態。
處於終止態的進程不再被調度執行,下一步將被系統撤銷,最終從系統中消失。
終止一個進程需要兩個步驟:
1.先等待操作系統或相關的進程進行善后處理(如抽取信息)。
2.然后回收占用的資源並被系統刪除。
引起進程狀態轉換的具體原因如下:
NULL→新建態:執行一個程序,創建一個子進程。
新建態→就緒態:當操作系統完成了進程創建的必要操作,並且當前系統的性能和虛擬內存的容量均允許。
運行態→終止態:當一個進程到達了自然結束點,或是出現了無法克服的錯誤,或是被操作系統所終結,或是被其他有終止權的進程所終結。
運行態→就緒態:運行時間片到;出現有更高優先權進程。
運行態→等待態:等待使用資源;如等待外設傳輸;等待人工干預。
就緒態→終止態:未在狀態轉換圖中顯示,但某些操作系統允許父進程終結子進程。
等待態→終止態:未在狀態轉換圖中顯示,但某些操作系統允許父進程終結子進程。
終止態→NULL:完成善后操作。
1.3 進程的七態模型
三態模型和五態模型都是假設所有進程都在內存中的事實上有序不斷的創建進程,當系統資源尤其是內存資源已經不能滿足進程運行的要求時,必須把某些進程掛起(suspend),對換到磁盤對換區中,釋放它占有的某些資源,暫時不參與低級調度。起到平滑系統操作負荷的目的。
引起進程掛起的原因是多樣的,主要有:
1.終端用戶的請求。當終端用戶在自己的程序運行期間發現有可疑問題時,希望暫停使自己的程序靜止下來。亦即,使正在執行的進程暫停執行;若此時用戶進程正處於就緒狀態而未執行,則該進程暫不接受調度,以便用戶研究其執行情況或對程序進行修改。我們把這種靜止狀態成為“掛起狀態”。 2.父進程的請求。有時父進程希望掛起自己的某個子進程,以便考察和修改子進程,或者協調各子進程間的活動。 3.負荷調節的需要。當實時系統中的工作負荷較重,已可能影響到對實時任務的控制時,可由系統把一些不重要的進程掛起,以保證系統能正常運行。 4.操作系統的需要。操作系統有時希望掛起某些進程,以便檢查運行中的資源使用情況或進行記賬。 5.對換的需要。為了緩和內存緊張的情況,將內存中處於阻塞狀態的進程換至外存上。
七態模型在五態模型的基礎上增加了掛起就緒態(ready suspend)和掛起等待態(blocked suspend)。
-
掛起就緒態:進程具備運行條件,但目前在外存中,只有它被對換到內存才能被調度執行。
-
掛起等待態:表明進程正在等待某一個事件發生且在外存中。
引起進程狀態轉換的具體原因如下:
等待態→掛起等待態:操作系統根據當前資源狀況和性能要求,可以決定把等待態進程對換出去成為掛起等待態。
掛起等待態→掛起就緒態:引起進程等待的事件發生之后,相應的掛起等待態進程將轉換為掛起就緒態
掛起就緒態→就緒態:當內存中沒有就緒態進程,或者掛起就緒態進程具有比就緒態進程更高的優先級,系統將把掛起就緒態進程轉換成就緒態。
就緒態→掛起就緒態:操作系統根據當前資源狀況和性能要求,也可以決定把就緒態進程對換出去成為掛起就緒態。
掛起等待態→等待態:當一個進程等待一個事件時,原則上不需要把它調入內存。但是在下面一種情況下,這一狀態變化是可能的。當一個進程退出后,主存已經有了一大塊自由空間,而某個掛起等待態進程具有較高的優先級並且操作系統已經得知導致它阻塞的事件即將結束,此時便發生了這一狀態變化。
運行態→掛起就緒態:當一個具有較高優先級的掛起等待態進程的等待事件結束后,它需要搶占 CPU,而此時主存空間不夠,從而可能導致正在運行的進程轉化為掛起就緒態。另外處於運行態的進程也可以自己掛起自己。
新建態→掛起就緒態:考慮到系統當前資源狀況和性能要求,可以決定新建的進程將被對換出去成為掛起就緒態。
掛起進程等同於不在內存中的進程,因此掛起進程將不參與低級調度直到它們被調換進內存。
掛起進程具有如下特征:
-
該進程不能立即被執行
-
掛起進程可能會等待一個事件,但所等待的事件是獨立於掛起條件的,事件結束並不能導致進程具備執行條件。 (等待事件結束后進程變為掛起就緒態)
-
進程進入掛起狀態是由於操作系統、父進程或進程本身阻止它的運行。
-
結束進程掛起狀態的命令只能通過操作系統或父進程發出。