1. 程式人生 > >【Linux】幾種常見的程序排程

【Linux】幾種常見的程序排程

程序的排程演算法

1.先來先服務排程演算法(FCFS:firstcome first service)

先來先服務(FCFS)排程演算法即可適用於作業排程,也可以適用於程序排程。當此演算法在作業排程中時,它每次選取一個或多個最先進入該佇列的作業,將它們調入記憶體,分配資源,建立程序,然後放入就緒佇列。在程序排程中,就是每次選取就緒佇列中最先進入該佇列的程序,為之分配處理機,使它投入執行。只有該程序執行到結束或者被阻塞無法執行後才放棄處理機,排程演算法選取下一個程序。FCFS演算法簡單易行,是一種非搶佔式策略,但效能卻不大好,因為在呼叫短程序並且對I/O資源呼叫平凡的程序時,按順序進行會浪費處理機的資源。

2.短程序優先演算法(SJF:Shortest Job First或SPN:ShortestProcess Next)

對預計“CPU執行期”最短的程序優先分配處理機,通常後來的短程序不搶先正在執行的程序。
該演算法的優點在於:相比FCFS演算法改善了CPU的平均週轉時間,和程序的平均等待時間,提高系統的吞吐量。
該演算法的缺點在於:長作業可能長時間都得不到處理機的使用權;未能依據程序的緊迫程度來劃分程序的優先順序;難以準確估計程序的執行時間。

3.時間片輪轉演算法(RR:Round Robin)

該演算法的特性是讓所有程序等待的時間和享受服務的時間都公平公正。具體過程是:

  • 按FCFS的排列方式將所有需要處理機資源的程序排序
  • 規定一個時間片長度,可以是幾個ms到幾百個ms
  • 選取佇列中隊首的程序,讓它執行一個時間片長度的時間
  • 執行完畢之後將此程式放到佇列的隊尾,再次取新的隊首進行上述操作
  • 注意:在執行時間片的過程中,程序可以隨時因為某種原因(阻塞)退出

4.多級反饋佇列演算法(Round Robin with Multiple Feedback)

此演算法可分為三步進行講解:

  • 先建立N個佇列,用來儲存程序資訊。每個佇列都有自己的優先順序,第一個佇列優先順序最高,下來是第二個佇列,以此類推,第N個佇列優先順序最低。
  • 優先順序不同的佇列中的程序,執行的時間片長度也不同,第一個佇列最短比如是i,第二個佇列的時間片長度就是2i,以此類推。當一個程序需要執行時,先放到第一個佇列的末尾,然後從第一個佇列的隊首開始提取程序分配處理機資源。提取到此程序時,執行本層時間片長度的時間,如果該程序沒有執行完就把該程序放到第二個優先順序佇列的末尾等待被提取。
  • 只有當優先順序高的佇列空閒了,才會去下一個佇列的隊首提取程序。
  • 如果處理機正在執行後面第i個佇列的程序,前面第一個佇列插入了一個程序,這時會直接放棄正在執行的程序,將它插入到第i個佇列的末尾,去執行新插入的優先順序高的程序。

5.優先順序演算法(Priority Scheduling)

為了照顧緊迫程序,使之在進入系統後便獲得優先處理,引入了優先順序演算法。可進一步把該演算法分成如下兩種:

  • 非搶佔式優先權演算法 :這種方式下,系統一旦把處理機分配給某程序後,一直要等到該程序執行完畢,或者阻塞。才能將處理機分配給下一個程序。
  • 搶佔式優先權排程演算法 :這種方式下,只要有程序比正在執行中程序的優先順序高,就可以直接打斷執行中的程序,系統給優先順序高的程序分配處理機。

6.最高響應比優先法(HRN,Highest Response_ratio Next)

該演算法是對FCFS方式和SJF方式的一種綜合平衡。FCFS方式只考慮每個作業的等待時間而未考慮執行時間的長短,而SJF方式只考慮執行時間而未考慮等待時間的長短。因此,這兩種排程演算法在某些極端情況下會帶來某些不便。HRN排程策略同時考慮每個作業的等待時間長短和估計需要的執行時間長短,從中選出響應比最高的作業投入執行。響應比R定義如下:
R =(W+T)/T = 1+W/T
其中T為該作業估計需要的執行時間,W為作業在後備狀態佇列中的等待時間。每當要進行作業排程時,系統計算每個作業的響應比,選擇其中R最大者投入執行。這樣,即使是長作業,隨著它等待時間的增加,W / T也就隨著增加,也就有機會獲得排程執行。這種演算法是介於FCFS和SJF之間的一種折中演算法。由於長作業也有機會投入執行,在同一時間內處理的作業數顯然要少於SJF法,從而採用HRN方式時其吞吐量將小於採用SJF法時的吞吐量。另外,由於每次排程前要計算響應比,系統開銷也要相應增加。