按照posix標準的強制要求,除了「普通」程序之外, linux還支援兩種實時排程類。排程器結構使得實時程序可以平滑地整合到核心中,而無需修改核心排程器,這顯然是排程類帶來的好處。
現在比較適合於回想一些很久以前討論過的事實。實時程序的特點在於其優先順序比普通程序高,對應地,其static_prio值總是比普通程序低,如圖2-14所示。 rt_task巨集通過檢查其優先順序來證實給定程序是否是實時程序,而task_has_rt_policy
則檢測程序是否關聯到實時排程策略。
實時程序與普通程序有乙個根本的不同之處:如果系統中有乙個實時程序且可執行,那麼排程器總是會選中它執行,除非有另乙個優先順序更高的實時程序。
現有的兩種實時類,不同之處如下所示。
很明顯,如果實時程序編寫得比較差,系統可能變得無法使用。只要寫乙個無限迴圈,迴圈體內不進入睡眠即可。在編寫實時應用程式時,應該多加小心。
實時程序的排程類定義如下:
kernel/sched-rt.c
const struct sched_class rt_sched_class = ;
實時排程器類的實現比完全公平排程器簡單。大約只需要250行**,而cfs則需要1100行!
kernel/sched.c
struct rq
就緒佇列非常簡單,鍊錶就足夠了:
kernel/sched.c
struct rt_prio_array ;
struct rt_rq ;
具有相同優先順序的所有實時程序都儲存在乙個鍊錶中,表頭為active.queue[prio],而active.bitmap點陣圖中的每個位元位對應於乙個鍊錶,凡包含了程序的鍊錶,對應的位元位則置位。如果鍊錶中沒有程序,則對應的位元位不置位。圖2-23說明了具體情形。
實時排程器類中對應於update_cur的是update_curr_rt,該函式將當前程序在cpu上執行花費的時間記錄在sum_exec_runtime中。所有計算的單位都是實際時間,不需要虛擬時間。這樣就簡化了很多。
程序的入隊和離隊都比較簡單。只需以p->prio為索引訪問queue陣列queue[p->prio],即可獲得正確的鍊錶,將程序加入鍊錶或從鍊錶刪除即可。如果佇列中至少有乙個程序,則將點陣圖中對應的位元位置位;如果佇列中沒有程序,則清除點陣圖中對應的位元位。請注意,新程序總是排列在每個鍊錶的末尾。
兩個比較有趣的操作分別是,如何選擇下乙個將要執行的程序,以及如何處理搶占。首先考慮pick_next_task_rt,該函式放置選擇下乙個將執行的程序。其**流程圖在圖2-24給出。
sched_find_first_bit是乙個標準函式,可以找到active.bitmap中第乙個置位的位元位,這意味著高的實時優先順序(對應於較低的核心優先順序值),因此在較低的實時優先順序之前處理。取出所選鍊錶的第乙個程序,並將se.exec_start設定為就緒佇列的當前實際時鐘值,即可。
週期排程的實現同樣簡單。sched_fifo程序最容易處理。它們可以執行任意長的時間,而且必須使用yield系統呼叫將控制權顯式傳遞給另乙個程序:
kernel/sched.c
static void task_tick_rt(struct rq *rq, struct task_struct *p)
{update_curr_rt(rq);
/** 迴圈程序需要一種特殊形式的時間片管理。
* 先進先出程序沒有時間片。
*/if (p->policy != sched_rr)
return;
...
如果當前程序是迴圈程序,則減少其時間片。在尚未超出時間段時,沒什麼可作的,程序可以繼續執行。計數器歸0後,其值重置為def_timeslice,即100 * hz / 1000,亦即100毫秒。如果該程序不是鍊錶中唯一的程序,則重新排隊到末尾。通過用set_tsk_need_resched設定tif_need_resched標誌,照常請求重排程:
為將程序轉換為實時程序,必須使用sched_setscheduler系統呼叫。這裡不詳細討論該函式了,因為它只執行了下列簡單任務。
如果程序此前不在任何就緒佇列上,那麼只需要設定排程類和新的優先順序數值。停止程序活動和重啟用則是不必要的。
要注意,只有具有root許可權(或等價於cap_sys_nice)的程序執行了sched_setscheduler系統呼叫,才能修改排程器類或優先順序。否則,下列規則適用。
3 3 實時排程
1.實時系統 指系統能夠在限定的響應時間內提供所需水平的服務。指計算的正確性不僅取決於程式的邏輯正確性,也取決於結果產生的時間,如果系統的時間約束條件得不到滿足,將會發生系統錯誤。實時任務 具有明確時間約束的計算任務,有軟 硬,隨機 週期性之分。2.實現實時排程的基本條件 3.常用的幾種實時排程演算...
實時系統與實時排程
一些概念 計算結果存在時效性,過期無意義,如新聞 2.11.1 實時任務分類 按有無截止時間 按有無週期 2.11.2 實時os特點 2.11.3 實時排程 靜態表排程 輸入週期性到達時間 執行時間 週期性的最後結束期限和每個任務的相對優先順序,輸出排程表,用於排程實時任務 靜態優先順序搶占排程 根...
執行緒屬性 實時排程
1.pthread attr init pthread attr t attr 和pthread attr destroy pthread attr t attr 函式.pthread attr setdetachstate pthread attr t attr,int detachstate p...