一、進程狀態與轉換
1.1 進程的三態模型
基于進程在執行過程中可能出現的情況,定義了以下三種狀態:
運行(running)態:指進程正在使用處理器執行程序。在單處理器系統中,僅有一個進程處于運行狀態;在多處理器系統中,則可能有多個進程同時運行。
就緒(ready)態:進程已具備運行條件,僅等待系統分配處理器即可執行。多個處于就緒狀態的進程通常排隊等待,形成就緒隊列。
等待(wait)態:也稱阻塞態或睡眠態,進程因等待某事件完成而暫停運行,例如等待I/O操作結束。即使分配處理器,進程也無法立即運行。
進程狀態轉換的具體原因如下:
運行態→等待態:進程需要等待資源,如外設數據傳輸或人工干預。
等待態→就緒態:等待的資源或事件完成,如I/O操作結束或人工干預完成。
運行態→就緒態:進程的時間片用完,或有更高優先級的進程需要運行。
就緒態→運行態:當處理器空閑時,系統選擇一個就緒隊列中的進程運行。
1.2 進程的五態模型
在三態模型的基礎上,五態模型增加了新建態(new)和終止態(exit):
新建態:表示進程被創建但尚未進入就緒隊列。創建進程需要兩個步驟:1.分配資源并建立管理信息;2.設置為就緒態,等待被調度。
終止態:表示進程完成任務、出現無法解決的錯誤或被其他進程或操作系統終止。終止進程涉及兩個步驟:1.進行善后處理;2.回收資源并從系統中刪除。
內核學習網站:
linux內核源碼/內存調優/文件系統/進程管理/設備驅動/網絡協議棧
引起進程狀態轉換的具體原因如下:
NULL→新建態:執行程序,創建子進程。
新建態→就緒態:操作系統完成創建進程的操作,且系統性能和內存允許。
運行態→終止態:進程達到自然結束點、出現無法解決的錯誤、被操作系統或其他有終止權的進程終止。
運行態→就緒態:進程時間片用完,或有更高優先級的進程需要運行。
運行態→等待態:等待資源,如外設傳輸或人工干預。
就緒態→終止態:某些操作系統允許父進程終止子進程(未在圖中顯示)。
等待態→終止態:某些操作系統允許父進程終止子進程(未在圖中顯示)。
終止態→NULL:完成善后操作。
1.3 進程的七態模型
三態模型和五態模型假設所有進程都在內存中運行,但當系統資源(特別是內存)不足以滿足所有進程運行時,需要將某些進程掛起(suspend),對換到磁盤交換區,釋放其資源,暫不參與調度,以平滑系統負載。
七態模型在五態模型基礎上增加了掛起就緒態(ready suspend)和掛起等待態(blocked suspend):
掛起就緒態:進程具備運行條件,但目前在外存中,需對換到內存才能被調度執行。
掛起等待態:進程等待某事件發生,且目前在外存中。
引起進程狀態轉換的具體原因如下:
等待態→掛起等待態:根據當前資源和性能要求,操作系統決定將等待態進程對換出去。
掛起等待態→掛起就緒態:等待事件發生后,掛起等待態進程轉為掛起就緒態。
掛起就緒態→就緒態:當內存中無就緒態進程或掛起就緒態進程優先級更高,系統將掛起就緒態進程轉為就緒態。
就緒態→掛起就緒態:根據當前資源和性能要求,操作系統決定將就緒態進程對換出去。
掛起等待態→等待態:當有足夠內存且掛起等待態進程優先級高,操作系統知曉其等待事件即將結束時,可能發生此狀態轉換。
運行態→掛起就緒態:高優先級的掛起等待態進程等待事件結束后需搶占CPU,但內存不足,導致運行態進程轉為掛起就緒態。運行態進程也可自掛起。
新建態→掛起就緒態:根據當前資源和性能要求,操作系統決定新建進程對換出去。
掛起進程等同于不在內存中的進程,因此掛起進程不參與低級調度,直到被調換進內存。
掛起進程具有以下特征:
- 該進程不能立即執行。
- 掛起進程可能等待某事件,但事件結束并不能使進程具備執行條件(轉為掛起就緒態)。
- 進程進入掛起狀態是由于操作系統、父進程或自身阻止其運行。
- 結束掛起狀態的命令只能由操作系統或父進程發出。