排程程式負責決定將哪個程序投入執行,何時執行以及執行多長時間。程序排程程式可看做在可執行態程序之間分配有限的處理器時間資源的核心子系統。只有通過排程程式的合理排程,系統資源才能最大限度地發揮作用,多程序才會有併發執行的效果。
1.多工作業系統就是能同時併發地互動執行多個程序的作業系統。無論在單處理或者多處理器機器上,多工作業系統都能使多個程序處於擁塞或者睡眠狀態,也就是實際上不被投入執行,直到工作確實就緒。
2.多工系統可以劃分為兩類:非搶占式多工和搶占式多工。
3.linux提供了搶占式的多工模式。程序在被搶占之前能夠執行的時間是預先設定好的,叫程序的時間片。時間片實際上就是分配給每個可執行程序的處理器時間段。
策略決定排程程式在何時讓什麼程序執行。
1.程序可以被分為i/o消耗型(程序的大部分時間用來提交i/o請求或是等待i/o請求)和處理器消耗型(把時間用在執行**上)。
2.劃分方式不是絕對的,程序可以同時展現這兩種行為,比如x window伺服器。
3.排程策略通常要在兩個矛盾目標中間尋找平衡:程序響應迅速(響應時間短)和最大系統利用率(高吞吐量)。
1.排程演算法中最基本的一類就是基於優先順序的排程。這是一種根據程序的價值和其對處理器時間的需求來對程序分級的想法。通常做法是優先順序高的程序先執行,低的後執行,相同優先順序的程序按輪轉方式進行排程(乙個接乙個,重複進行)。排程程式總是選擇時間片未用盡而且優先順序最高的程序執行。使用者和系統都可以通過設定程序的優先順序來影響系統的排程。
2.優先順序分為兩類
1.時間片表示程序在被搶占之前所能夠持續執行的時間;排程策略必須確定乙個預設的時間片;
2.linux的cfs排程器並沒有直接劃分時間片到程序,而是將處理器的使用比例劃分給了程序。也就是說,其搶占時機取決於新的可執行程式消耗了多少處理器使用比,如果消耗的使用比比當前程序小,則新程序立即投入執行搶占當前程序。
linux排程器是以模組方式提供的(也就是排程器類),目的是允許不同型別的程序可以有針對性地選擇排程演算法
排程器類允許多種不同的可動態新增的排程演算法並存,排程屬於自己範疇的程序;
排程器**會按照優先順序順序遍歷排程類,擁有乙個可執行程序的最高優先順序的排程器類勝出,去選擇下面要執行的那乙個程式;
將nice值對映到時間片的話,就必須將nice值對應到處理器的絕對時間;這樣會導致程序切換無法最優進行;
如果使用相對nice值,所帶來的效果將會極大取決於其nice的初始值;
如果執行nice值到時間片的對映,時間片極大受制於定時器。
cfs基於乙個簡單的理念:程序排程的效果應當如同系統具備乙個理想中的完美任務處理器。cfs的做法如下:
【所謂「魚與熊掌不可得兼」即如此——越小的排程週期就會表現出越好的互動性,也更接近於「同時完成多工」這一孜孜追求的目標;然而系統必須承受更高的切換代價和更差的系統吞吐量——甚至將絕大多數精力耗費在這種來回倒騰上】
cfs演算法核心:選擇具有最小vrntime的任務
具體做法:利用紅黑樹rbtree(以節點形式儲存資料的二叉樹)
舉例:向樹中加入程序:在程序變為可執行狀態或者通過fork()呼叫第一次建立程序;
從樹中刪除程序:發生在程序阻塞或者終止的時候
【由此我們可以看到,二叉樹中儲存的全部是可執行程序】
程序排程的主要入口點是函式schedule(),定義在kernel/sched.c中;這正是內和其他部分用於排程程序排程器的入口
這一函式最重要的工作就是呼叫pick_next_state(),依次檢查每乙個排程類,並從最高優先順序的排程類中,選擇最高優先順序程序
程序休眠一定是為了等待一些事件
喚醒操作由函式wake_up()進行
只要沒有鎖,核心就可以程序搶占;
為了支援搶占,每個程序的thread_info都加入了preempt_count計數器(初值為0,每當使用鎖的時候就加1,釋放鎖的時候數值減1),當數值為0的時候,核心就可以搶占
核心搶占發生在:
1.linux 提供兩種實時排程策略
sched_fifo
和sched_rr
。具體的實現定義在
kernel/sched_rt.c
中。
兩種實時演算法實現的都是靜態優先順序。
2.linux的實時排程演算法提供一種軟實時工作方式,軟實時的含義是:核心排程程序,盡力使程序在他的限定時間到來前執行,但核心不保證總能滿足這些程序的要求。硬實時系統則可以滿足任何排程的要求。
3.實時優先順序範圍從0到
max_rt_prio減1
。max_rt_prio
預設為100
linux 提供乙個系統呼叫族,用於管理與排程程式相關引數。這些系統呼叫可以用來操作和處理程序優先順序、排程策略和處理器繫結,還提供了顯式地將處理器交給其他程序的機制。
1.sched_setscheduler():設定程序的排程策略和實時優先順序
2.sched_getscheduler():獲取程序的排程策略和實時優先順序
最重要的工作在於讀取或改寫程序tast_struct
的policy
和rt_priority
的值。3.sched_setparam():設定程序的實時優先順序
4.sched_getparam():獲取程序的實時優先順序
使用者可以通過sched_setaffinity()
設定不同的乙個或者幾個位組合的位掩碼,而呼叫
sched_getaffinity()
則返回當前的
cpus_allowed
位掩碼。
linux通過
sched_yield()
系統呼叫,提供一種讓程序顯式地將處理器時間讓給其他等待執行程序的機制。核心**為了方便,可直接呼叫
yield()
,先確定給定程序確實處於可執行狀態,然後再呼叫
sched_yield()
。使用者空間的應用程式直接使用
sched_yield()
系統呼叫就可以了。
Linux核心分析第四章 讀書筆記
程序排程 作業系統規定下的程序選取模式 面臨問題 多工選擇問題 多工作業系統就是能同時併發地互動執行多個程序的作業系統,在單處理器機器上這會產生多個程序在同時執行的幻覺,在多處理器機器上,這會使多個程序在不同的處理機上真正同時 並行地執行。無論在單處理器或者多處理器機器上,多工作業系統都能使多個程序...
《Linux核心設計與分析》第四章讀書筆記
程序 作業系統 程式的執行態表現形式。程序排程程式,它是確保程序能有效工作的乙個核心子系統。排程程式負責決定將哪個程序投入執行,何時執行以及執行多長時間。程序排程程式可看做在可執行態程序之間分配有限的處理器時間資源的核心子系統 最大限度地利用處理器時間的原則是,只要有可以執行的程序,那麼就總會有程序...
《Linux核心設計與實現》第四章讀書筆記
1.多工系統分為兩類 非搶占式多工和搶占式 linux2.5核心版本採用o 1 排程程式的新排程程式,對大伺服器的工作負載很理想,但其缺少叫互動程序。linux2.6核心版本初期採用rsdl,反轉樓梯最後期限排程演算法。最終採用cfs,完全排程公平演算法。1 程序分為i o消耗型和處理器消耗型 2 ...