程序排程與排程器及演算法

2021-10-12 17:33:30 字數 2954 閱讀 9588

核心v2.6.23之後

程序的優先順序

總結linux核心的三種 排程策略 :

sched_other 分時排程策略,(預設的)

sched_fifo實時排程策略,先到先服務

sched_rr實時排程策略,時間片輪轉

linux 程序排程有乙個有趣歷史。在 2.5 版本之前,linux 核心採用傳統 unix 排程演算法。然而,由於這個演算法並沒有考慮 smp 系統,因此它並不足夠支援 smp 系統。此外,當有大量的可執行程序時,系統效能表現欠佳。

在核心 v2.5 中,排程程式進行了大改,採用了稱為 o(1) 的排程演算法,它的執行時間為常量,與系統內任務數量無關。o(1) 排程程式也增加了對 smp 系統的支援,包括處理器親和性和處理器間的負載平衡。然而,在實踐中,雖然在 smp 系統上 o(1) 排程程式具有出色的效能,但是在許多桌面計算機系統上互動程序的響應時間卻欠佳。

在核心 v2.6 的開發中,排程程式再次修改;在核心 v2.6.23 的發布中,完全公平排程程式(cfs)成為預設的 linux 排程演算法。

cfs 在真實的硬體上模擬了完全理想的多工處理器」。在「完全理想的多工處理器」下,每個程序都能同時獲得cpu 的執行時間。當系統中有兩個程序時,cpu 的計算時間被分成兩份,每個程序獲得50%。然而在實際的硬體上,當乙個程序占用cpu 時,其它程序就必須等待。這就產生了不公平。所以cfs 將懲罰當前程序,使其它程序能夠在下次排程時盡可能取代當前程序。cfs 使用紅黑樹選取下乙個被排程程序。所有狀態為runable 的程序都被插入紅黑樹。在每個排程點,cfs 排程器都會選擇紅黑樹的最左邊的葉子節點作為下乙個將獲得cpu 的程序(該讀取操作的時間複雜度是o(lgn))。如果在排程時當前程序不再是紅黑樹的最左邊的葉子節點,就會被搶占

排程器分配cpu時間的基本依據,就是程序的優先順序。根據程式任務性質的不同,程式可以有不同的執行優先順序。根據優先順序特點,我們可以把程序分為兩種類別。

實時程序由linux作業系統創造,普通使用者只能建立普通程序。兩種程序的優先順序不同,實時程序的優先順序永遠高於普通程序。程序的優先順序是乙個0到139的整數。數字越小,優先順序越高。其中,優先順序0到99留給實時程序,100到139留給普通程序。

動態優先順序 = 靜態優先順序 – bonus + 5

如果這個公式的計算結果小於100或大於139,將會取100到139範圍內最接近計算結果的數字作為實際的動態優先順序。公式中的bonus是乙個估計值,這個數字越大,代表著它可能越需要被優先執行。如果核心發現這個程序需要經常跟使用者互動,將會把bonus值設定成大於5的數字。如果程序不經常跟使用者互動,核心將會把程序的bonus設定成小於5的數。

實時程序

¢ 對排程延遲的要求最高,要求立即響應並執行

¢ 排程策略:fifo、round robin

普通程序

ø互動式程序:間或處於睡眠態,對響應速度要求比較高

ø批處理程序:在後台執行,能夠忍受響應延遲

cfs出來之後,普通程序排程策略使用cfs,cfs是現在被核心採納的排程器。它從rsdl/sd中吸取了完全公平的思想,不再跟蹤程序的睡眠時間,也不再企圖區分互動式程序

cfs演算法中,每個程序都有乙個「虛擬執行時間」表示該程序執行了「多長時間」,而排程器會選擇虛擬執行時間最小的程序來執行

當採用shced_rr策略的程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。放在佇列尾保證了所有具有相同優先順序的rr任務的排程公平。    

sched_fifo一旦占用cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄。

如果有相同優先順序的實時程序(根據優先順序計算的排程權值是一樣的)已經準備好,fifo時必須等待該程序主動放棄後才可以執行這個優先順序相同的任務。而rr可以讓每個任務都執行一段時間。

rr和fifo都只用於實時任務。

建立時優先順序大於0(1-99)。

按照可搶占優先順序排程演算法進行。

就緒態的實時任務立即搶占非實時任務。

1,建立程序時指定採用fifo,並設定實時優先順序rt_priority(1-99)。

2,如果沒有等待資源,則將該任務加入到就緒佇列中。

3,排程程式遍歷就緒佇列,根據實時優先順序計算排程權值(1000+rt_priority),選擇權值最高的任務使用cpu,該fifo任務將一直占有cpu直到有優先順序更高的任務就緒(即使優先順序相同也不行)或者主動放棄(等待資源)。

4,排程程式發現有優先順序更高的任務到達(高優先順序任務可能被中斷或定時器任務喚醒,再或被當前執行的任務喚醒,等等),則排程程式立即在當前任務堆疊中儲存當前cpu暫存器的所有資料,重新從高優先順序任務的堆疊中載入暫存器資料到cpu,此時高優先順序的任務開始執行。重複第3步。

5,如果當前任務因等待資源而主動放棄cpu使用權,則該任務將從就緒佇列中刪除,加入等待佇列,此時重複第3步。

1,建立任務時指定排程引數為rr,並設定任務的實時優先順序和nice值(nice值將會轉換為該任務的時間片的長度)。

2,如果沒有等待資源,則將該任務加入到就緒佇列中。

3,排程程式遍歷就緒佇列,根據實時優先順序計算排程權值(1000+rt_priority),選擇權值最高的任務使用cpu。

4,如果就緒佇列中的rr任務時間片為0,則會根據nice值設定該任務的時間片,同時將該任務放入就緒佇列的末尾。重複步驟3。

5,當前任務由於等待資源而主動退出cpu,則其加入等待佇列中。重複步驟3。

系統中既有分時排程,又有時間片輪轉排程和先進先出排程

1,rr排程和fifo排程的程序屬於實時程序,以分時排程的程序是非實時程序。

2,當實時程序準備就緒後,如果當前cpu正在執行非實時程序,則實時程序立即搶占非實時程序。

3,rr程序和fifo程序都採用實時優先順序做為排程的權值標準,rr是fifo的乙個延伸。fifo時,如果兩個程序的優先順序一樣,則這兩個優先順序一樣的程序具體執行哪乙個是由其在佇列中的位置決定的,這樣導致一些不公正性(優先順序是一樣的,為什麼要讓你一直執行?),如果將兩個優先順序一樣的任務的排程策略都設為rr,則保證了這兩個任務可以迴圈執行,保證了公平。

程序排程及排程策略

程序排程負責動態的將cpu分配給各個程序。主要功能如下 1 記住程序狀態。2 決定哪個程序,什麼時候獲取cpu及其占用多長時間。3 把cpu分配給程序,即將選中程序的pcb中有關程序的相關資訊,如程式狀態暫存器 通用暫存器等內容送入cpu的相應的暫存器中,從而讓該程序占用cpu去執行。4 收回cpu...

程序排程演算法(程序排程策略)

程序排程演算法 排程演算法是指 根據系統的資源分配策略所規定的資源分配演算法。一 先來先服務和短作業 程序 優先排程演算法 1.先來先服務排程演算法。先來先服務 fcfs 排程演算法是一種最簡單的排程演算法,該演算法既可用於作業排程,也可用於程序排程。fcfs演算法比較有利於長作業 程序 而不利於短...

程序排程與作業排程

作業排程按一定的演算法從磁碟上的 輸入井 中選擇資源能得到滿足的作業裝入記憶體,使作業有機會去占用處理器執行。但是,乙個作業能否占用處理器,什麼時間能夠占用處理器,必須由程序排程來決定。所以,作業排程選中了乙個作業且把它裝入記憶體時,就應為該作業建立乙個程序,若有多個作業被裝入記憶體,則記憶體中同時...