linux
核心的三種主要排程策略: 1
,sched_other
分時排程策略, 2
,sched_fifo
實時排程策略,先到先服務 3
,sched_rr
實時排程策略,時間片輪轉
實時程序將得到優先呼叫,實時程序根據實時優先順序決定排程權值。分時程序則通過
nice
和counter
值決定權值,
nice
越小,counter
越大,被排程的概率越大,也就是曾經使用了
cpu最少的程序將會得到優先排程。
shced_rr
和sched_fifo
的不同:
當採用shced_rr
策略的程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。放在佇列尾保證了所有具有相同優先順序的
rr任務的排程公平。
sched_fifo
一旦占用
cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄。
如果有相同優先順序的實時程序(根據優先順序計算的排程權值是一樣的)已經準備好,
fifo
時必須等待該程序主動放棄後才可以執行這個優先順序相同的任務。而
rr可以讓每個任務都執行一段時間。
相同點:rr和
fifo
都只用於實時任務。
建立時優先順序大於
0(1-99)。
按照可搶占優先順序排程演算法進行。
就緒態的實時任務立即搶占非實時任務。
所有任務都採用
linux
分時排程策略時:
1,建立任務指定採用分時排程策略,並指定優先順序
nice
值(-20~19)。
2,將根據每個任務的
nice
值確定在
cpu上的執行時間
(counter)。
3,如果沒有等待資源,則將該任務加入到就緒佇列中。 4
,排程程式遍歷就緒佇列中的任務,通過對每個任務動態優先順序的計算權值
(counter+20-nice)
結果,選擇計算結果最大的乙個去執行,當這個時間片用完後
(counter
減至0)
或者主動放棄
cpu時,該任務將被放在就緒佇列末尾
(時間片用完
)或等待佇列
(因等待資源而放棄
cpu)中。
5,此時排程程式重複上面計算過程,轉到第4步。
6,當排程程式發現所有就緒任務計算所得的權值都為不大於
0時,重複第2步。
所有任務都採用
fifo時:1
,建立程序時指定採用
fifo
,並設定實時優先順序
rt_priority(1-99)。
2,如果沒有等待資源,則將該任務加入到就緒佇列中。 3
,排程程式遍歷就緒佇列,根據實時優先順序計算排程權值
(1000+rt_priority),
選擇權值最高的任務使用
cpu,該
fifo
任務將一直占有
cpu直到有優先順序更高的任務就緒
(即使優先順序相同也不行
)或者主動放棄
(等待資源)。
4,排程程式發現有優先順序更高的任務到達
(高優先順序任務可能被中斷或定時器任務喚醒,再或被當前執行的任務喚醒,等等
),則排程程式立即在當前任務堆疊中儲存當前
cpu暫存器的所有資料,重新從高優先順序任務的堆疊中載入暫存器資料到
cpu,此時高優先順序的任務開始執行。重複第3步。
5,如果當前任務因等待資源而主動放棄
cpu使用權,則該任務將從就緒佇列中刪除,加入等待佇列,此時重複第3步。
所有任務都採用
rr排程策略時:
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,則保證了這兩個任務可以迴圈執行,保證了公平。
ingo molnar-實時補丁
為了能併入主流核心,ingo molnar的實時補丁也採用了非常靈活的策略,它支援四種搶占模式:
1.no forced preemption (server),這種模式等同於沒有使能搶占選項的標準核心,主要適用於科學計算等伺服器環境。
2.voluntary kernel preemption (desktop),這種模式使能了自願搶占,但仍然失效搶占核心選項,它通過增加搶占點縮減了搶占延遲,因此適用於一些需要較好的響應性的環境,如桌面環境,當然這種好的響應性是以犧牲一些吞吐率為代價的。
3.preemptible kernel (low-latency desktop),這種模式既包含了自願搶占,又使能了可搶占核心選項,因此有很好的響應延遲,實際上在一定程度上已經達到了軟實時性。它主要適用於桌面和一些嵌入式系統,但是吞吐率比模式2更低。
4.complete preemption (real-time),這種模式使能了所有實時功能,因此完全能夠滿足軟實時需求,它適用於延遲要求為100微秒或稍低的實時系統。
實現實時是以犧牲系統的吞吐率為代價的,因此實時性越好,系統吞吐率就越低。
linux程序排程策略
linux程序排程策略 linux核心的三種主要排程策略 1,sched other 分時排程策略,2,sched fifo實時排程策略,先到先服務 3,sched rr實時排程策略,時間片輪轉 實時程序將得到優先呼叫,實時程序根據實時優先順序決定排程權值。分時程序則通過nice和counter值決...
linux程序排程策略
首先,可以通過以下兩個函式來獲得執行緒可以設定的最高和最低優先順序,函式中的策略即上述三種策略的巨集定義 int sched get priority max int policy int sched get priority min int policy sched other是不支援優先順序使用...
程序排程演算法(程序排程策略)
程序排程演算法 排程演算法是指 根據系統的資源分配策略所規定的資源分配演算法。一 先來先服務和短作業 程序 優先排程演算法 1.先來先服務排程演算法。先來先服務 fcfs 排程演算法是一種最簡單的排程演算法,該演算法既可用於作業排程,也可用於程序排程。fcfs演算法比較有利於長作業 程序 而不利於短...