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微秒或稍低的即時系統。 實現即時是以犧牲系統的吞吐率為代價的,因此即時性越好,系統吞吐率就越低。