1. 為什麼要分開就緒和阻塞狀態
答:因為就緒態只需要等待處理機,而阻塞態可能在等待輸入輸出,即使分配給處理機也是徒勞,所以兩狀態圖不妥。對於調度進程,只需要等待就緒隊列裡的進程,因為阻塞狀態可以轉換到就緒隊列裡去。
2. 進程五狀態
1) 新狀態:進程已經建立,但未被OS接納為可執行進程。(還沒有申請到相應的資源)。
2) 就緒態:進程做好了準備,準備執行(只等待處理機)。
3) 執行狀態:該進程正在執行(單處理機,某一時刻僅一個進程佔用處理機)。
4) 阻塞狀態:等待某事件發生才能執行,如等待I/O完成。
5) 終止狀態.
3. 問題:多個進程競爭記憶體資源
l 記憶體資源緊張
l 無就緒隊列,處理機空閑:I/O速度比處理機速度慢的多,可能出現全部進程阻塞等待I/O。
解決方案
l 交換技術:換出一部分暫時不能啟動並執行進程(阻塞進程)到外存(只換出程式和資料,PCB不換出去),以騰出記憶體空間,可以調用新進程來執行。
l 虛擬儲存技術:每個進程只能裝入一部分程式和資料
4. 掛起:進程被交換到外存,狀態變為掛起狀態
4.1 進程掛起的原因(p91)
l 進程全部阻塞,處理機空閑。
l 系統負荷過重,記憶體空間緊張。(讓其他進程先執行完)
l 作業系統的需要。作業系統可能需要掛起後台進程或一些服務進程,或者某些可能導致故障的進程。
l 終端使用者請求。
l 父進程的需求。
4.2 掛起進程的特徵
l 不能立即執行
l 可能是等待某事件發生,若是,則阻塞條件獨立於掛起條件,即使阻塞事件發生,該進程也不能執行。
n 阻塞和掛起沒有聯絡。
n 如果A進程現在要求輸入資料,此時A進程屬於阻塞狀態,在選擇掛起進程的時候,可能先選擇阻塞進程(A進程),此時A進程掛起,正在輸入資料,輸入到記憶體緩衝區內。當資料輸完了,向處理機發送命令資料已經輸入完成,阻塞事件解除,但實際上還是掛起,所以仍是掛起態。
l 使之掛起的進程為:自身、父進程、OS。
l 只有掛起它的進程才能使之由掛起狀態轉換為其他狀態。
4.3 阻塞與掛起
l 進程是否等待時間:阻塞與否。
l 進程是否被換出記憶體:掛起與否。
4.4 四種狀態組合
l 就緒:進程在記憶體,準備執行。
l 阻塞:進程在記憶體,等待事件。
l 就緒/掛起:進程在外存,只要調入記憶體即可執行。
l 阻塞/掛起:進程在外存,等待事件。
4.5 處理機可調度執行的進程有兩種
l 新建立的進程
l 或換入一個以前掛起的進程
通常為避免增加系統負載,系統會換入一個以前掛起的進程執行。
4.6 具有掛起狀態的進程狀態轉換
l 阻塞 → 阻塞/掛起:OS通常將阻塞進程換出,以騰出記憶體空間
l 阻塞/掛起→ 就緒/掛起:當阻塞/掛起進程等待的事件發生時,可以將其轉換為就緒/掛起。
l 就緒/掛起→ 就緒:OS需要調入一個進程執行。
l 就緒 → 就緒/掛起:一般,OS掛起阻塞進程。但是有時也會掛起就緒進程,釋放足夠的記憶體空間。
l 新 → 就緒/掛起(新→ 就緒):新進程建立後,可以插入到就緒隊列或就緒,掛起隊列,若無足夠的記憶體配置給新進程,則需要新→ 就緒/掛起。