無論是在批處理系統還是分時系統中,用戶進程數一般都多于處理機數、這將導致它們互相爭奪處理機。另外,系統進程也同樣需要使用處理機。
這就要求進程調度程序按一定的策略,動態地把處理機分配給處于就緒隊列中的某一個進程,以使之執行。
先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用于作業調度,也可用于進程調度。當在作業調度中采用該算法時,
每次調度都是從后備作業隊列中選擇一個或多個最先進入該隊列的作業,將它們調入內存,為它們分配資源、創建進程,然后放入就緒
隊列。在進程調度中采用FCFS算法時,則每次調度是從就緒隊列中選擇一個最先進入該隊列的進程,為之分配處理機,使之投入運行。
該進程一直運行到完成或發生某事件而阻塞后才放棄處理機。
來看一個例子,假設有三個進程和它們各自執行時間(以毫秒為單位)如下表:
那么如果三個進程按照P1, P2, P3的順序啟動的話,按照先到先服務的調度算法,執行過程如下:
平均等待時間就是(0 + 24 + 27) / 3 = 17毫秒。FCFS算法是非搶占式的,一旦內核將CPU分配給一個進程就不會被釋放了,除非進程結束或者請求I/O阻塞。這也是我們之前學習的多任務系統的特點。
采取基于優先級調度算法要考慮進程餓死的問題,因為高優先級的進程總是會被優先調度,具有低優先級的進程可能永遠都不會被內核調度執行。Aging是對于這個問題的一個解決方案,所謂Aging就是指逐漸提高系統中長時間等待的進程的優先級。比如如果優先級的范圍從127到0(127表示最低優先級),那么我們可以每15分鐘將等待進程的優先級加1。最終經過一段時間,即便是擁有最低優先級127的進程也會變成系統中最高優先級的進程,從而被執行。 優先級調度可以搶占式或者非搶占式的。當一個進程在Ready隊列中時,內核將它的優先級與正在CPU上執行的進程的優先級進行比較。當發現這個新進程的優先級比正在執行的進程高時:對于搶占式內核,新進程會搶占CPU,之前正在執行的進程轉入Ready隊列;對于非搶占式內核,新進程只會被放置在Ready隊列的頭部,不會搶占正在執行的進程。
進程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執行期,而只能根據每一個進程的執行歷史來預測。
新聞熱點
疑難解答