1. 程式人生 > 實用技巧 >C++--問題23--程序排程

C++--問題23--程序排程

C++--問題23--程序排程


程序排程:

CPU在每個系統滴答(Tick)中斷產生的時候,檢查就緒佇列裡面的程序(遍歷連結串列中的程序結構體),如有符合排程演算法的新程序需要切換,儲存當前執行的程序的資訊(包括棧資訊等)後掛起當前程序,選擇新的程序執行,這就是程序排程。

一般把排程演算法分為兩類:非搶佔式排程演算法和搶佔式排程演算法。

非搶佔式排程演算法挑選一個程序,然後讓該程序執行直到被阻塞,或者直到該程序退出,才會呼叫另外一個程序,也就是說不會因為時鐘中斷改變呼叫。

搶佔式排程演算法挑選一個程序,然後讓該程序只執行某段時間,如果在該時段結束時,該程序仍然在執行時,則會把它掛起,接著排程程式從就緒佇列挑選另外一個程序。這種搶佔式排程處理,需要在時間間隔的末端發生時鐘中斷

,以便把 CPU 控制返回給排程程式進行排程,也就是常說的時間片機制

常見的非搶佔式:先來先服務(First Come First Severd, FCFS)演算法,最短作業優先(Shortest Job First, SJF)排程演算法

常見的搶佔式:時間片輪轉(Round Robin, RR)排程演算法

假設程序來的順序以及所需CPU時間如下:

(1)先來先服務演算法

執行的順序就是:先來後到原則

(2)最短作業優先演算法

執行順序:誰時間短誰先

(3)時間片輪轉排程演算法

執行順序:給定一個適當的時間片,輪著來。加入時間片是2,注意在執行P4的時候有1個單位時間被浪費。

(4)高響應比優先排程演算法

把響應比優先順序最高的程序投入執行。

根據比率:R=(W+S)/S(R為響應比,W為等待處理的時間,S為預計的服務時間)

等待處理的時間 + 預計的服務時間 = 週轉時間

比率 =週轉時間 /預計的服務時間

影響因素:

如果兩個程序的等待時間相同時,要求的服務時間越短,響應比就越高,這樣短作業的程序容易被選中執行;

如果兩個程序要求的服務時間相同時,等待時間越長,響應比就越高,這就兼顧到了長作業程序,因為程序的響應比可以隨時間等待的增加而提高,當其等待時間足夠長時,其響應比便可以升到很高,從而獲得執行的機會。

(5)最高優先順序排程演算法

對於多使用者計算機系統,它們希望排程是有優先順序的,即希望排程程式能從就緒佇列中選擇最高優先順序的程序進行執行,這稱為最高優先順序排程演算法

程序的優先順序可以分為,靜態優先順序或動態優先順序:

靜態優先順序:建立程序時候,就已經確定了優先順序了,然後整個執行時間優先順序都不會變化;

動態優先順序:根據程序的動態變化調整優先順序,比如如果程序執行時間增加,則降低其優先順序,如果程序等待時間(就緒佇列的等待時間)增加,則升高其優先順序,也就是隨著時間的推移增加等待程序的優先順序

該演算法也有兩種處理優先順序高的方法,非搶佔式和搶佔式:

非搶佔式:當就緒佇列中出現優先順序高的程序,執行完當前程序,再選擇優先順序高的程序。

搶佔式:當就緒佇列中出現優先順序高的程序,當前程序掛起,排程優先順序高的程序執行。

缺點:可能會導致低優先順序的程序永遠不會執行。

(6)多級反饋佇列排程演算法

多級反饋佇列排程演算法是時間片輪轉演算法和最高優先順序演算法的綜合和發展。

顧名思義:

多級表示有多個佇列,每個佇列優先順序從高到低,同時優先順序越高時間片越短。

反饋表示如果有新的程序加入優先順序高的佇列時,立刻停止當前正在執行的程序,轉而去執行優先順序高的佇列。

工作步驟:

(6.1)設定了多個佇列,賦予每個佇列不同的優先順序,每個佇列優先順序從高到低,同時優先順序越高時間片越短。

(6.2)新的程序會被放入到第一級佇列的末尾,按先來先服務的原則排隊等待被排程,如果在第一級佇列規定的時間片沒執行完成,則將其轉入到第二級佇列的末尾,以此類推,直至完成。

(6.3)當較高優先順序的佇列為空,才排程較低優先順序的佇列中的程序執行。如果程序執行時,有新程序進入較高優先順序的佇列,則停止當前執行的程序並將其移入到原佇列末尾,接著讓較高優先順序的程序執行。

轉載圖片,更好理解:

對於短作業,可能可以在第一級佇列很快被處理完。對於長作業,如果在第一級佇列處理不完,可以移入下次佇列等待被執行,雖然等待的時間變長了,但是執行時間也會更長了,所以該演算法很好的兼顧了長短作業,同時有較好的響應時間。