程序排程的理解

2021-10-08 02:39:34 字數 2600 閱讀 9377

程序排程可看做在可執行態程式之間分配有限的處理器時間資源的核心子系統。

linux排程程式在2.5開始採用了一種o(1)排程程式(靜態時間片演算法和針對每一處理器的執行佇列)(該排程演算法不適合那些響應時間敏感的程式)

在2.6.23版本的排程程式中採用了「反轉樓梯最後期限排程演算法rsdl「,即「完全公平排程演算法cfs」,

排程策略需要在i/o消耗型和處理器消耗型之間程序選擇搭配,需要在程序響應速度(響應時間短)和最大系統利用率(高吞吐率)之間找到平衡。linux傾向於縮短響應時間,即傾向於優先排程i/o消耗型程序。

linux採用兩種不同的優先順序範圍,且兩種互不相干。一種nice值(值(-20+19)越大,優先順序越小,且與分配得到的處理器時間成正比)。還有一種就是實時優先順序(值(099)越大,優先順序越高,實時程序的優先順序普遍高於普通的優先順序)。

排程程式來分配處理器使用比,nice值作為權重比。當程序的實時優先順序高於當前正在執行的程序時,如果新的可執行程式消耗的處理器使用比(分配和消耗的區別)比當前程序小,則新程序立即投入執行。

linux排程器採用一種稱為排程器類的模組化結構(允許多種不同的可動態新增的排程演算法並存,排程屬於自己範疇的程序)。

排程演算法的選擇問題:

(1)將nice值隱射到時間片,將nice單位值對應到處理器的絕對時間。因為給定高nice值(低優先順序、分配更少的處理器時間比)的程序往往是後台程序,為計算密集型。 而給定低nice值(高、更多)往往是前台程序。所以與初衷背道而馳。

(2)將nice值減少1所帶來的效果極大地取決於其nice值的初始值。(解決:將nice值呈現幾何增加)

(3)實現對映時需要能分配乙個絕對的時間片,而且這個時間片必須能在核心的測試 範圍內(即時間片為定時器節拍的整數倍)。最小時間片必須為定時器節拍的整數 倍,系統定時器會限制兩個時間片之間的差異,時間片還會隨著定時器節拍的改變而改變。(採用乙個新的度量機制將nice值的時間片和定時器分離)

(4)基於優先順序的排程器為了優化交換任務而喚醒相關程序的問題,在提公升優先順序的同時,會分配更多的時間片,最後導致公平原則被打破。

cfs完全摒棄了時間片,而是分配了乙個處理器使用比重(確保了程序排程具有恆定 的公平性)。

cfs(公平排程)允許每個程序執行一段時間、迴圈輪轉、選擇執行最少的程序作為下一次執行程序,而不再採用分配給每個程序每個時間片,cfs在所有可執行程序總數基礎上計算出乙個程序需要執行多久,而不是依靠nice值來計算時間片。而nice作為處理器執行比的權重。cfs引入了最小粒度(即最小時間片)。目標延遲即排程週期。

對程序執行時間記賬(每次系統時鐘節拍發生時,時間片都會減少乙個節拍週期),確保每個程序只在公平分配給他的處理器時間內執行。

(1)採用排程實體結構(在task_struct結構體中有乙個名為se的sched_entity結構體成員變數)來追蹤程序執行進賬。

(2)vruntime變數存放程序的虛擬執行時間(即乙個程序執行了多長時間以及還應該 執行多長時間)。

cfs排程演算法的核心是挑選乙個具有最小vruntime的程序。cfs利用紅黑樹(rbtree)來組織可執行程序佇列,並且迅速找到最小vruntime值的程序(即執行rbtree樹中最左邊葉子節點所代表的程序(採用pick_next_entity函式查詢))。

程序排程的主要入口是schedule函式,會呼叫pick_next_task()函式從最高優先順序的排程類中選擇最高優先順序的程序。

程序進入休眠狀態後會從執行黑紅樹中移出,放入到等待佇列(wake_queue_head_t)中,然後呼叫schedule()函式。

等待佇列可以通過declare_waitqueue()函式靜態建立,也可以通過init_waitqueue_head()動態建立。當需要的相關事件發生後需要避免產生競爭條件。

wake_up()函式會喚醒等待佇列上的所有程序。

由context_switch()函式負責上下文切換,該函式呼叫switch_mm()負責把虛擬記憶體從上乙個程序對映切換到新程序,呼叫switch_to()負責從上乙個處理器狀態切換到新程序的處理器狀態。核心採用need_reached標誌(被搶占時呼叫scheduler_tick()函式來設定這個標誌,而有優先順序高的程序進入時呼叫try_to_wake_up()設定)來表明是否需要重新執行一次排程。2.6版本中該標誌存在於thread_info結構體中。

使用者搶占在系統呼叫返回使用者空間時,從中斷處理程式中返回使用者空間時。

在乙個核心級的任務正在執行的時候支援重新排程,只要沒有鎖,核心就可以進行搶占。在thread_info結構體中引入preempt_count計數器(計數器初始值為0,當使用鎖時加1,釋放鎖時減1),從中斷返回核心空間時,會檢查need_reached和preempt_count的值,若need_reached被設定,且preempt_count為0,則可以搶占。

核心搶占發生在:

(1)在中斷處理程式正在執行,且返回核心空間之前。

(2)核心**再一次具有可搶占性的時候。

(3)如果核心中的任務顯式地呼叫scheduler()。

(4)如核心中的任務阻塞。

sched_fifo(靜態優先順序)的程序會比sched_normal級的程序優先得到排程,sched_fifo不可被強佔且不基於時間片,可以一直執行下去,只有在自己願意讓出處理器的時候才會退出。

sched_rr(靜態優先順序)是帶有時間片的sched_fifo,時間片只是用來排程同一優先順序的程序。

程序排程演算法理解

一.排程演算法分類 1.批處理 2.互動式 3.實時 二.演算法排程目標 所有系統 公平 策略強制執行 平衡 1.批處理系統 吞吐量 周轉時間 cpu利用率 2.互動式 響應時間 均衡性 3.實時系統 滿足截止時間 可 性 三.各種系統的排程演算法 1.批處理排程系統 1 先到先服務 fcfs 在所...

Linux 程序排程簡單理解

一 linux程序的r s d t z x狀態 r task running 程序處於ready狀態,及可執行狀態 s task interruptible 可以中斷的睡眠狀態 d task uninterruptible 不可中斷的睡眠狀態,很少見 t task stopped or task t...

程序排程 模擬程序排程的過程

通過這次實驗,理解程序排程的過程,進一步掌握程序狀態的轉變 程序排程的策略,進一步體會多道程式併發執行的特點,並分析具體的排程演算法的特點,掌握對系統效能的評價方法。編寫程式模擬實現程序的輪轉法排程過程,模擬程式只對pcb進行相應的排程模擬操作,不需要實際程式。假設初始狀態為 有n個程序處於就緒狀態...