進程調度:
無論是在批處理系統還是分時系統中,用戶進程數一般都多於處理機數、這將導致它們互相爭奪處理機。另外,系統進程也同樣需要使用處理機。
這就要求進程調度程序按一定的策略,動態地把處理機分配給處於就緒隊列中的某一個進程,以使之執行。
一、進程的基本狀態及狀態間的轉換:
1.等待態:等待某個事件的完成;
2.就緒態:等待系統分配處理器以便運行;
3.運行態:占有處理器正在運行。
運行態→等待態 往往是由於等待外設,等待主存等資源分配或等待人工干預而引起的。
等待態→就緒態 則是等待的條件已滿足,只需分配到處理器后就能運行。
運行態→就緒態 不是由於自身原因,而是由外界原因使運行狀態的進程讓出處理器,這時候就變成就緒態。例如時間片用完,或有更高優先級的進程來搶占處理器等。
就緒態→運行態 系統按某種策略選中就緒隊列中的一個進程占用處理器,此時就變成了運行態

三、進程調度的算法及思想
1.先來先服務調度算法
先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用於作業調度,也可用於進程調度。當在作業調度中采用該算法時,
每次調度都是從后備作業隊列中選擇一個或多個最先進入該隊列的作業,將它們調入內存,為它們分配資源、創建進程,然后放入就緒
隊列。在進程調度中采用FCFS算法時,則每次調度是從就緒隊列中選擇一個最先進入該隊列的進程,為之分配處理機,使之投入運行。
該進程一直運行到完成或發生某事件而阻塞后才放棄處理機。
來看一個例子,假設有三個進程和它們各自執行時間(以毫秒為單位)如下表:

那么如果三個進程按照P1, P2, P3的順序啟動的話,按照先到先服務的調度算法,執行過程如下:

平均等待時間就是(0 + 24 + 27) / 3 = 17毫秒。FCFS算法是非搶占式的,一旦內核將CPU分配給一個進程就不會被釋放
了,除非進程結束或者請求I/O阻塞。這也是我們之前學習的多任務系統的特點。
2、基於優先級調度 (Priority Scheduling)
在優先級調度算法中,每個進程都關聯一個優先級,內核將CPU分配給最高優先級的進程。具有相同優先級的進程,按照
先來先服務的原則進行調度。假設進程的執行時間和優先級如下,並且這些進程同時存在於內存中時,內核基於優先級的
調度過程如下:


采取基於優先級調度算法要考慮進程餓死的問題,因為高優先級的進程總是會被優先調度,具有低優先級的進程可能永遠
都不會被內核調度執行。Aging是對於這個問題的一個解決方案,所謂Aging就是指逐漸提高系統中長時間等待的進程的
優先級。比如如果優先級的范圍從127到0(127表示最低優先級),那么我們可以每15分鍾將等待進程的優先級加1。最終
經過一段時間,即便是擁有最低優先級127的進程也會變成系統中最高優先級的進程,從而被執行。
優先級調度可以搶占式或者非搶占式的。當一個進程在Ready隊列中時,內核將它的優先級與正在CPU上執行的進程的優先級
進行比較。當發現這個新進程的優先級比正在執行的進程高時:對於搶占式內核,新進程會搶占CPU,之前正在執行的進程
轉入Ready隊列;對於非搶占式內核,新進程只會被放置在Ready隊列的頭部,不會搶占正在執行的進程。
3、短進程優先(SCBF--Shortest CPU Burst First)
最短CPU運行期優先調度算法(SCBF--Shortest CPU Burst First)
最短作業優先調度是優先級調度的特例。在優先級調度中我們根據進程的優先級來進行調度,在最短作業優先調度中我們
根據作業的執行時間長短來調度。通過下面的例子來看看SJF是怎樣調度的。


進程1首先執行了1毫秒,當執行時間更短的進程2進入Ready隊列時發生搶占。進程3在進程2執行1毫秒后到來,但是進程3的
執行時間比進程2長。同理進程4的到來也沒法搶占進程2,所以進程2可以一直執行到結束。之后是執行時間第二短的進程4
執行,最后是進程1(要看剩余執行時間,還剩7毫秒)和進程3。
SJF調度是最優的調度,但難點在於如何預測進程的執行時間(Burst Time)。對於批處理系統中的長期調度來說,可以將用戶
提交進程時輸入的執行時間上限作為依據。但對於短期調度來說,沒有辦法能夠提前得知下一個要被分配CPU的進程的執行
時間長短。我們只能通過歷史數據來進行預測,公式如下:

α可以取0.5,公式前半部分表示最近一次Burst Time,而后半部分表示過去歷史平均的Burst Time。
該算法雖可獲得較好的調度性能,但難以准確地知道下一個CPU執行期,而只能根據每一個進程的執行歷史來預測。
4、輪轉法 (Round-Robin Scheduling) (RR)
簡單輪轉法:系統將所有就緒進程按FIFO規則排隊,按一定的時間間隔把處理機分配給隊列中的進程。這樣,就緒
RR調度算法轉為分時系統設計,它與FCFS很像,但是加入了搶占。具體調度過程是:內核從Ready隊列中選取第一個進程,
將CPU資源分配給它,並且設置一個定時器在一個時間片后中斷該進程,調度Ready隊列中的下一進程。很明顯,RR調度
算法是搶占式的,並且在該算法的調度下,沒有一個進程能夠連續占用CPU超過一個時間片,從而達到了分時的目的。
來看下面的例子,假設一個時間片的長度為4毫秒:


5、高響應比優先調度算法
(1) 如果作業的等待時間相同,則要求服務的時間愈短,其優先權愈高,因而該算法有利於短作業.
(2) 當要求服務的時間相同時,作業的優先權決定於其等待時間,等待時間愈長,其優先權愈高,因而它實現的是先來先服務.
(3) 對於長作業,作業的優先級可以隨等待時間的增加而提高,當其等待時間足夠長時,其優先級便可升到很高, 從而也可獲得處理機.
該算法照顧了短作業,且不會使長作業長期得不到服務
6、搶占式調度算法
1. 非搶占式調度算法
為每一個被控對象建立一個實時任務並將它們排列成一輪轉隊列,調度程序每次選擇隊列中的第一個任務投入運行.該任務完成后便把它掛在輪轉隊列的隊尾等待下次調度運行.
2. 非搶占式優先調度算法.
實時任務到達時,把他們安排在就緒隊列的對首,等待當前任務自我終止或運行完成后才能被調度執行.
3. 搶占式調度算法
1)基於時鍾中斷的搶占式優先權調度算法.
實時任務到達后,如果該任務的優先級別高於當前任務的優先級並不立即搶占當前任務的處理機,而是等到時鍾中斷到來時,調度程序才剝奪當前任務的執行,將處理機分配給新到的高優先權任務.