Linux進程調度策略


linux內核的三種主要調度策略:

1,SCHED_OTHER 分時調度策略,

2,SCHED_FIFO實時調度策略(先到先服務)
3,SCHED_RR實時調度策略(時間片輪轉)

實時進程將得到優先調用,實時進程根據實時優先級決定調度權值。

分時進程則通過nicecounter值決定權值,nice越小,counter越大,被調度的概率越大,也就是曾經使用了cpu最少的進程將會得到優先調度。

任一個執行時間超過10ms或前兩個執行時間超過10ms都會導致運行結果出現偏差,因為 cpu 的調度周期為10ms 

 

LinuxThreads只支持調度范圍為PTHREAD_SCOPE_SYSTEM的調度,默認的調度策略是SCHED_OTHER。

用戶線程調度策略也可修改成SCHED_FIFO或SCHED_RR方式,這兩種方式支持優先級為0-99,而SCHED_OTHER只支持0。

SCHED_OTHER是普通進程的,后兩個是實時進程的(一般的進程都是普通進程,系統中出現實時進程的機會很少)。SCHED_FIFO、SCHED_RR優先級高於所有SCHED_OTHER的進程,所以只要他們能夠運行,在他們運行完之前,所有SCHED_OTHER的進程的都沒有得到執行的機會。

附:

SHCED_RRSCHED_FIFO的不同點:

     當采用SHCED_RR策略的進程的時間片用完,系統將重新分配時間片,並置於就緒隊列尾。放在隊列尾保證了所有具有相同優先級的RR任務的調度公平。     

    SCHED_FIFO一旦占用cpu則一直運行。一直運行直到有更高優先級任務到達或自己放棄。

    如果有相同優先級的實時進程(根據優先級計算的調度權值是一樣的)已經准備好,FIFO時必須等待該進程主動放棄后才可以運行這個優先級相同的任務。而RR可以讓每個任務都執行一段時間。

相同點:

    RRFIFO都只用於實時任務。

    創建時優先級大於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

 

系統中既有分時調度,又有時間片輪轉調度和先進先出調度: 

1RR調度和FIFO調度的進程屬於實時進程,以分時調度的進程是非實時進程。

2,當實時進程准備就緒后,如果當前cpu正在運行非實時進程,則實時進程立即搶占非實時進程。

3RR進程和FIFO進程都采用實時優先級做為調度的權值標准,RRFIFO的一個延伸。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微秒或稍低的實時系統。
 
實現實時是以犧牲系統的吞吐率為代價的,因此實時性越好,系統吞吐率就越低。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM