進程的狀態轉換
進程在運行中不斷地改變其運行狀態。通常,一個運行進程必須具有以下三種基本狀態。
進程狀態
- 執行態run:進程正在使用CPU
- 等待態wait:進程正在等待I/O完成,不在使用也不能使用CPU
- 就緒態ready:進程不在使用CPU,但已經純備好用使用CPU
在特定的情況下,這三種狀態可以相互轉換。
狀態轉換
就緒->執行, 當前運行進程阻塞,調度程序選一個優先權最高的進程占有處理機;
執行->就緒, 當前運行進程時間片用完;
執行->等待,當前運行進程等待鍵盤輸入,進入了睡眠狀態。
等待->就緒,I/O操作完成,被中斷處理程序喚醒。
剛從其他狀態進入就緒態的進程需要置入調度隊列,該隊列不一定按進入隊列的時間先后順序排列。
從等待態中出來的進程通常不直接進入運行態,而要進入就緒態。如果需要直接進入運行態,這屬於搶先式調度,通過搶先式中斷完成。
從執行態到就緒態的轉換發生在搶先式終端處理中,例如I/O或分時下的時間片。分時是在多個用戶同時以交互方式使用計算機時采用的一種技術。
分時技術:每當時鍾中斷發生時且發現當前運行進程已連續在CPU上運行了一定的時間(稱為時間片,一般為20ms~250ms)時,就強制地發生進程切換,使當前進程退出CPU,重新調度,選出另一個進程在CPU上運行。此時,退出的進程不能變為等待狀態,因為它不是因為等待I/O而退出的,也不能變為終止,因為它尚未結束,因此,它需要轉換為就緒態,等待屬於它的時間片的到來。
當正在建立一個新進程時,計算機上的當前運行進程是哪一個?
該新進程的父進程。
CPU調度算法
同時處於就緒態的進程經常有多個,因此需要一個CPU調度算法來君頂那一個就緒進程先運行。衡量CPU調度算法的標准有:CPU利用率、用戶程序響應時間、系統吞吐量、公平合理性、設備利用率等。
常見的調度算法有先來先服務FIFO、輪轉調度法RR(時間片法)、優先級調度法、短作業優先SJF、最短剩余事件優先、最高相應比優先、多級反饋法、策略驅動法、最晚時間限調度、二級調度法。
定義
FIFO算法:一般應用於實時性系統中,最先進入就緒態的進程最先進入運行態。
輪轉調度法:根據系統給與的時間片,進行進程的輪詢訪問CPU,若時間片結束,該進程還在運行,就會被強制撤出。該方法通常和FIFO或優先級算法一起使用。
優先級調度法:根據不同進程的重要程度和緊急程度,來賦予每個進程一個優先級,帶有最高優先級的進程最先執行。優先級調度算法分為靜態優先級和動態優先級兩種。動態優先級可以防止優先級高的進程不停地執行。
最短作業優先:最先執行占用CPU時間最短的進程。最短的進程第一個執行總是產生最小的平均相應事件。
最短剩余時間優先:剩余運行事件最短的進程最先運行。
最高相應比優先:最先執行相應比最高的進程。相應比的計算公式為1+等待時間/估計運行時間。
多級反饋法:是目前最常用的算法!它結合了FIFO、RR、優先級算法和SJF算法。該算法有多個隊列,同一隊列中的進程優先級相同,不同隊列中進程優先級不同,不同隊列擁有不同的時間片。
策略驅動法:基於對各個用戶的承諾。
最晚時間限調度:保證在每個進程必須完成的最晚時間限錢運行完該進程。
二級調度算法:在系統負載很重時,不是所有的進程建立就立即進入就緒態,有些進程建立起來后,進入后備隊列。操作系統采用一個二級調度程序來決定進程在后備隊列和就緒隊列之間的轉換。其中一級調度是從后備隊列中選擇進程使其轉換為就緒態;另一級調度則是在就緒隊列中選擇一個執行。