實時排程政策介紹
實時程序将得到優先調用,實時程序根據實時優先級決定排程權值,普通分時程序則通過nice和counter值決定權值,nice越小,counter越大,被排程的機率越大,也就是曾經使用了cpu最少的程序将會得到優先排程。實時任務按照可搶占優先級排程算法進行,就緒态的實時任務可以立即搶占非實時任務。
1,SCHED_FIFO:First Input First Output,優先級範圍1-99(最大)
SCHED_FIFO一旦占用cpu則一直運作。一直運作直到有更高優先級任務到達或自己放棄。
如果有相同優先級的實時程序(根據優先級計算的排程權值是一樣的)已經準備好,FIFO時必須等待該程序主動放棄後才可以運作這個優先級相同的任務。而RR可以讓每個任務都執行一段時間。
2,SCHED_RR:基于FIFO基礎上的Round Robin時間片輪轉,先入先出當采用SHCED_RR政策的程序的時間片用完,系統将重新配置設定時間片,并置于就緒隊列尾。将程序放在隊列尾保證了所有具有相同優先級的RR任務的排程公平。
3,SCHED_DEADLINE:該排程政策采用Global Earliest Deadline First(GEDF)算法,最早要到期的任務将被以最高優先級排程和配置設定CPU。根據此政策排程的任務可以搶占使用SCED FIFO、SCED RR或非實時排程的任何任務。參考https://lwn.net/Articles/743740/和https://blog.csdn.net/zhuyong006/article/details/80980502
https://blog.csdn.net/xiaofeng_yan/article/details/48246101
排程參數(ns納秒機關):
runtime:任務需要CPU執行的時長,要考慮最壞/最慢情況下的最大時長,要小于deadline
period:任務執行的周期,即兩次任務開始的時間間隔
deadline:任務必須在該時長内執行完,不大于period,是從period開始時刻計算時長
排程算法介紹
所有任務都采用Linux分時排程政策時:
Linux采用CFS(Completely Fair Scheduler)完全公平排程算法實作分時程序的CPU資源配置設定,注意 :非實時線程priority(100-139)由核心動态調控,不能人為設定,可以用修改nice值(-20~19 越低的值越高的優先級,這個在計算虛拟時間的時候放在分母上),進而間接影響優先級,PRI(new) = PRI(old) + nice
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(RR時間片是100ms),則會根據nice值設定該任務的時間片,同時将該任務放入就緒5隊列的末尾。重複步驟3。
5)目前任務由于等待資源而主動退出cpu,則其加入等待隊列中。重複步驟3。
所有任務都采用SCHED_DEADLINE排程政策時:
該排程政策在目前的 Linux 核心裡面屬于優先級最高的排程類,也就是說假設系統上面存在多個排程類,那麼每次重新排程的時候,都是先從該排程類下面去找到一個可以投入運作的程序進行排程。歸屬于該排程類的程序其歸一化優先級都是 -1,在該排程類内部不再區分多個優先級,統一歸為 -1.
1)建立任務時指定排程參數為DEADLINE,設定runtime、period、deadline參數。
2)如果沒有等待資源,則将該任務加入到就緒隊列中。
3)排程程式周遊就緒清單,根據deadline到期時間,選擇最短的任務執行
4)執行最長時間片由runtime指定,過時沒有執行完也會被收回CPU資源
5)将任務加入到就緒隊列中,重複步驟3
系統中既有分時排程,又有實時RR時間片輪轉排程、FIFO先進先出排程和DEADLINE排程:
1)排程系統首先檢視是否有DEADLINE任務将要到期,如有則會搶占CPU資源執行DEADLINE任務,即使目前CPU正在執行FIFO或RR任務。
2)RR排程和FIFO排程的程序屬于實時程序,以分時排程的程序是非實時程序。
3)當實時程序準備就緒後,如果目前cpu正在運作非實時程序,則實時程序立即搶占非實時程序。
普通程序完全撈不到CPU資源也不完全對,後來LINUX增加組排程政策後,有/proc/sys/kernel/sched_rt_period_us和/proc/sys/kernel/sched_rt_runtime_us兩個參數,這兩個參數表示的含義是:在sched_rt_peroid_us的周期内,所有的實時程序運作時間之和不得超過sched_rt_runtime_us。 預設值為1秒和0.95秒換句話說,在1秒的周期以内,所有實時程序運作時間之和不得超過0.95秒,剩下的0.5秒鐘留給普通程序。
3)RR程序和FIFO程序都采用實時優先級做為排程的權值标準,RR是FIFO的一個延伸。FIFO時,如果兩個程序的優先級一樣,則這兩個優先級一樣的程序具體執行哪一個是由其在隊列中的未知決定的,這樣導緻一些不公正性,如果将兩個優先級一樣的任務的排程政策都設為RR,則保證了這兩個任務可以循環執行,保證了公平。