關於基於優先順序的搶占式排程

2021-04-13 23:31:12 字數 1382 閱讀 6816

對於有一定作業系統基礎的朋友看到「搶占式」排程一定不會陌生吧。 我參考了linux核心、ecos以及windows核心對於搶占式排程的處理,感覺雖然細節上有點差別,但都挺有意思。

這裡,我想談談關於搶占式排程的一些看法。在很多作業系統書上基本上都這麼談基於優先順序的搶占式排程:

(1) 每個任務賦予唯一的乙個優先順序(有些作業系統可以動態地改變任務的優先順序);

(2) 假如有幾個任務同時處於就緒狀態,優先順序最高的那個將被執行;

(3) 只要有乙個優先順序更高的任務就緒,它就可以中斷當前優先順序較低的任務的執行;

當時我在學習作業系統時就在想了,當乙個優先順序更高的任務到來時cpu如何才能知道,並且呼叫排程例程呢?後來隨著學習的深入,知道了計算機中的中斷事件。cpu可以捕獲乙個中斷事件,只要事先對該事件的中斷源進行過關聯。那樣的話就可以在中斷事件結束後給cpu「傳送訊號」,表示該事件對應於啟用乙個任務,要求cpu做出任務排程。那麼cpu在進行任務排程時就會檢查當前任務的優先順序和就緒佇列中的任務優先順序進行比較,選出優先順序最大的開始執行。

以上過程說起來容易,但是做起來也是有些麻煩的。這裡必須注意一些細節問題,比如說在哪些情況下應該禁止排程,哪些情況下需要關開中斷等等。另外還有乙個比較重要的問題就是中斷處理例程如何「傳送訊號」「通知」cpu。這裡有很多種方法。比如,在處理完中斷服務例程之後,可以jump到或call執行緒排程例程。不過這樣做有乙個缺陷,也就是如果該中斷優先順序較高的話,那麼中斷處理時間就會變得非常長,而會顯得系統反應一下子變慢,因此這個方式適合於低中斷優先順序的處理例程。linux中有種做法是將排程例程的首位址壓入使用者棧空間,這樣的話當中斷處理例程返回後就會轉入排程例程。這是個不錯的手段。

而微軟它有乙個任務優先順序將preemptive_level,這個比passive_level的優先順序要高乙個檔次。那麼在我自己的系統當中我的處理方法與linux的差不多,但是為了要保證排程例程的一定的優先順序,因此不讓它在常規模式下處理,而是放在優先順序次第的14號中斷(軟體中斷1)中進行(這裡將針對本人目前研究的blackfin dsp處理器構架)。也就是說,在乙個外部中斷事件結束後,使用raise 14命令,通過cpu觸發核心中斷14,由於外部事件的優先順序均大於14,因此外部事件中斷處理可以安然返回,而當它們一旦返回就會進入14號中斷處理。

採用以上這種方法的話,如果中斷14就處理任務排程,則沒什麼大問題,否則的話如果還有一些事情要做(根據引數選擇不同的處理),那麼也要安排好事件通知訊號。比如乙個高優先順序的中斷選擇做其他的一些14號中斷處理,而另外一些外部中斷中斷事件選擇做另一些14號中斷的處理,而還有的則想進行任務切換,那麼這個時候14號中斷就要利用一些佇列等結構來儲存這些事件訊息。

在插入呼叫或跳入任務排程例程的地方稱為乙個檢視點。對於乙個基於優先順序搶占式排程的作業系統會有較多的察看點,以上是對於中斷處理中的察看點的討論。

大家如果還有什麼好的基於優先順序排程的方法可以回帖,謝謝。

基於優先順序的搶占式排程

wind核心排程預設使用基於優先順序搶占式排程,核心共有 256 個優先順序 任務的優先順序在其建立時指定,為0 255 優先數 0 對應著最高優先順序,優先數255 對應著最低優先順序。每一時刻,核心保證將資源分給處於就緒狀態的最高優先順序的任務執行。之所以說這種排程演算法是搶占的,是因為如果在某...

非搶占式優先演算法例題 非搶占式高優先順序排程演算法

v1.0 可編輯可修改 非搶占式高優先順序排程演算法 優先數越大級別越高 演算法思想 在按程序達到時間由小到大的順序輸入程序資訊後,先對其優先數進行排列,將最先到達的程序的到達時間設為開始時間,計算結束時間,然後對後面到達的時間與該程序的結束時間進行比較,如若小於該程序的結束時 間,記錄程序的個數,...

非搶占式優先演算法例題 非搶占式優先順序

非搶占式優先順序 include define max 10 struct process char name 10 float at float st float rt float ft int priority 優先數int order 程序執行次序 int flag 標記程序狀態 p max ...