【操作系統】第七章:進程管理(Part2:進程的狀態)

進程狀態(State)

進程動態的表述部分。進程的狀態表述了進程生命週期的變化過程。分爲進程的生命週期管理,進程的狀態變化模型,進程掛起模式三部分。

進程的生命週期

進程從開始到結束的整個過程稱爲生命期。這個過程中,會關注幾點
進程創建,進程運行(現在執行,佔用CPU的進程),進程等待(由於某種願意無法繼續執行,需要等待),進程喚醒(當等待條件滿足後還需要喚醒這個進程),進程結束。
在這裏插入圖片描述
系統初始化時,創建第一個進程(Init進程)。這個進程負責創建其他新的進程,這些新的進程是用戶發出請求後,提交給Init進程並由OS來完成創建。正在運行的進程可能會因爲某些需求需要創建新的進程。這是三個引起進程創建的主要事件。我們會在內存中構建出一個PCB,這個PCB就代表了這個進程最開始的情況,PCB會完成一些基本的初始化去形成一個新的進程。
在這裏插入圖片描述
形成新的進程後,它不一定執行,需要讓OS選擇一個可以執行的進程去執行。我們可可以執行的進程稱爲就緒進程,就緒進程可能存在多個,所以OS到底讓哪一個執行,這就用到後續的調度算法的問題。當選定一個就緒進程,就可以讓這個進程執行,從就緒態轉成執行態。
在這裏插入圖片描述
執行過程中可能會等待,進程需要完成一件事,但是不能夠馬上完成,這就是堵塞。比如讀文件,文件在硬盤上,需要從硬盤讀入內存,這個過程相對於CPU的執行速度而言很慢,如果一直忙等會浪費CPU資源,這時候讓進城等待,讓其他就緒的進程執行,自身等待OS把文件讀入內存。也可能這個進需要與其他進程協同完成某一個工作,如果其他進程沒有執行,則它也需要等待。也可能會需要某些其他的數據資源,而這些資源還沒有到達內存。總之,如果某一進程不得不等待時,我們用讓OS把該進從執行態變到等待態。這時候有一個轉換的過程,一旦處於等待狀態就不再佔用CPU了,這時候其他的處於就緒態的進程就可以佔據CPU執行。
進程的等待一般是自身阻塞自己,只有進程自身才知道它何時需要等待哪一個事件,OS不一定知道。所以說進程等待的發起是由進程自身發起的。
在這裏插入圖片描述
在這裏插入圖片描述
喚醒需要等待情況的滿足,比如被阻塞的進程資源得到滿足,等待的事件到達了。一旦進程被喚醒之後,就會把進程從等待狀態換成就緒態,然後就可以被OS調度去佔用CPU執行。因爲自身已經不佔用CPU執行,所以只能被OS或者其他進程來喚醒。
在這裏插入圖片描述
結束也有幾種情況:
正常退出:已經完成
錯誤退出:產生錯誤,無法繼續執行,主動退出
無法執行:OS強制退出,比如他去訪問其他進程的地址空間,此時會被其他管理進程或者OS殺死。一些管理進程認爲該進程所佔內存過多,破壞了整個系統的安全和可靠性,則殺死該進程。

進程狀態變化模型

在這裏插入圖片描述
運行態:當前程序正在佔用CPU執行
就緒態:得到除CPU之外的一切所需資源,一旦得到處理器就可以立刻執行
等待狀態:也叫阻塞態,進程正在等待某個事件。
就緒態可以轉換爲執行態
執行態可以轉化爲就緒態或者阻塞態
阻塞態可以轉化爲就緒態
在這裏插入圖片描述
結束狀態,此時PCB還存在,進程還沒有徹底結束。
在這裏插入圖片描述
進程的執行態爲何可以變成就緒態?
內存很大,CPU相對而言比較少,那麼內存中會存在多個就緒的進程,我們希望每個就緒的進程都可以執行。也就說我們可以分配給每個就緒的進程比較小的一塊時間片,當一個就緒進程佔用CPU執行完這個碎片後,會被OS切換下來,讓其他就緒態進程可以去執行。這樣使得每一個就緒態的進程可以去公平的使用CPU執行。
狀態的變化
1.NULL==>New:一開始沒有這個進程,OS創建了一個PCB,再對這個PCB做初始化過程,從空狀態到NEW狀態。
2.New==>Ready:PCB中所有的數據結構都初始化完畢了,這時候只需要等待處理機就可以開始執行了。這個過程很快,不會持續很久。
3.Ready==>Running:處於就緒態的進程會被OS的調度器選中,然後被分配到CPU中去執行。
4.Running==>Exit:正在運行的進程執行完畢後就退出或者出錯而退出,所以我們可以從運行態到退出態。
5.Running==>Ready:上文中已解釋。時間片操作由應用程序執行比較困難,但是OS可以完成。OS管理着時鐘,如果進程超出了規定時間,OS會叫停並在選擇一個就緒態的進程去執行。
6.Running==>Blocked阻塞態:進程執行過程中可能阻塞的原因:等待定時器的到達、等待文件到達……
7.Blocked==>Ready:很正常,解決了阻塞態的問題後自然進入就緒態。由OS完成。

進程掛起

在這裏插入圖片描述
進程沒有佔用內存空間,稱之爲掛起。虛存管理時,我們說到運行的程序會把部分空間導入硬盤,騰出更多的空間給需要的程序使用。運行的程序就是進程,進程如果沒有佔用內存空間,也就意味着進程被切換到硬盤上去。這時候我們稱之爲掛起的進程,掛起分爲兩種——阻塞掛起(進程在外存上等待某事件出現)和就緒掛起(進程在外存,如果被換入到內存,本身就是就緒態)。二者的區別就是一個是等待狀態被掛起,另一個是就緒狀態被掛起。
在這裏插入圖片描述
1.阻塞到阻塞掛起:下一個就緒進程運行時,發覺空間不夠用,會把一些阻塞的進程掛起,這時阻塞進程的空間就會騰出來給其他處於就緒態的進程使用。若沒有處於就緒態的進程,會提交新進程。
2.就緒到就緒掛起:就緒進程優先級大於阻塞進程,OS執行時會優選選擇就緒進程執行,會掛起低優先級的進程掛起,高優先級進程被認爲可以很快進入就緒態所以暫不掛起。
3.運行到就緒掛起:對搶佔式分時系統,可能會出現當前運行的進程空間不夠或者有高優先級進程要執行,我們會直接把這個運行中的進程掛起,稱爲就緒掛起狀態。
在外存中的狀態轉換:
阻塞掛起到就緒掛起:當阻塞掛起的進程隨着OS執行,阻塞時間所需要的資源得到滿足,這時候進程的狀態應該變成就緒態,但是因爲其本身是掛起在硬盤上的,所以這時候就成爲了就緒掛起狀態。但是該進程的資源和數據仍然存在於硬盤上,但是狀態已經改變。
在這裏插入圖片描述
激活:把一個進程的內容從外存導入內存,從而完成進程狀態的進一步變化。OS通過PCB和進程狀態來管理PCB,幫助完成進程調度。

狀態隊列

OS需要選擇某一個進程佔用CPU去執行,同時要選擇把哪一個進程從某一狀態換到另一狀態。對於任何一種狀態而言可能存在多進程,所以OS要維護一組隊列來表示當前系統的所有進程的狀態。所有阻塞進程就用阻塞隊列管理,每個進程的PCB會根據狀態排到相應隊列裏去,當進程狀態改變時,也會切換隊列。所以狀態的隊列是OS管理不同進程的很重要的數據結構。
在這裏插入圖片描述
如圖,存在多個就緒隊列,因爲就緒隊列分優先級,優先級高的會優先調用。等待隊列也存在這種情況,根據阻塞的不同事件會有不通過隊列,當事件x被滿足後,所有存在事件x上的進程就有可能從阻塞態變成就緒態。但是如果事件x只能滿足一個進程,那麼只能把隊列中的一個進程從阻塞態變成就緒態;如果事件x產生後,所有等待事件x的進程都得到滿足,則需要把所以進程從阻塞態變爲就緒態,也就說整個隊列都會放入就緒隊列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章