排程程式負責決定將哪個程序投入執行,何時執行,以及執行多長時間。程序排程程式可看作在可執行態程序之間分配有限的處理器時間資源的核心子系統。
(一):多工
多工作業系統就是能併發的互動執行多個程序的作業系統,多工系統可以分為兩類:非搶占式多工和搶占式多工。linux提供了搶占式多工,在這個模式下,由排程程式來決定什麼時候停止乙個程序的執行,以便其他程序能夠得到執行機會,這個強制掛起的動作就叫做搶占。程序的時間片是分配給每個可執行程序的處理器時間段。
在非搶占式多工模式下,除非程序自己主動停止執行,否則他會一直執行下去。程序主動掛起自己的操作成為讓步。
(二):策略
1:io消耗型和處理器消耗型程序
程序可以被分為io消耗型和處理器消耗型,前者指程序的大部分時間用來提交io請求或是等待io請求。這樣的程序通常處於可執行狀態,但通常是執行短短一會兒,因為他在等待更多的io請求的時候,最終會阻塞。
處理器消耗型程序通常把時間大多用在執行**上,除非被搶占,否則他們通常都一直不停的執行,他們沒有太多的io請求。
排程策略通常要在兩個矛盾的木便中間尋找平衡:程序的響應速度(響應時間短)和最大系統利用率(高吞吐量)。
2:程序優先順序
排程演算法中最基本的一類就是基於優先順序的排程。通常的做法是高優先順序的先執行,低優先順序的後執行,相同優先順序的以輪轉的方式執行。
linux採用了兩種不同的優先順序範圍:第一種是nice值,他的值的範圍是-20—-+19,預設為0。nice值越大,優先順序越低。相比高nice值的程序,低nice值的程序可以獲得更多的處理器時間。由於不同的作業系統的排程演算法不同,nice 值的意義也就不一樣。mac os x中的nice是分配給程序的時間片的絕對值,而在linux中,nice代表時間片的比例。
第二類是實時優先順序,他的值是可配置的,預設情況下他的變化範圍是[0,99],實時優先順序越大,程序的優先順序越高。nice優先順序和實時優先順序處於兩個互不相交的範疇。
3:時間片
時間片是乙個數值,他表明程序在被搶占前所能持續執行的時間。排程策略必須規定乙個預設的時間片。
(三):linux排程演算法
1:排程器類
linux排程器是以模組方式提供的,這樣做的目的是允許不同型別的程序可以有針對性的選擇排程演算法。 這種模組化結構被稱作排程器類,他允許多種不同的可動態新增的排程演算法並存,排程屬於自己範疇的程序。每個排程器都有乙個優先順序,基礎的排程器**定義在kernel/sched.c檔案中,他會按照優先順序順序遍歷排程器類,擁有乙個可執行程序的最高優先順序的排程器類勝出,去選擇下面要執行的那乙個程式。
完全公平排程(cfs)是乙個針對普通程序的排程類,在linux中成為sched_normal,該排程器定義在kernel/sched_fair.c中。
2:公平排程
cfs的出發點基於乙個簡單的概念:程序排程的效果應該如同系統具備乙個理想的完美多工處理器。在這種系統中,每個程序將能獲取1/n的處理器時間-n是指可執行程序的數量。cfs的做法是允許每個程序執行一段時間,迴圈輪轉,選擇執行最少的程序作為下乙個執行程序。而不採用分配給每個程序時間片的做法了。cfs在所有可執行程序總數的基礎上計算出乙個程序應該執行多久,而不是依靠nice值來計算時間片。nice值在cfs中被作為程序獲得的處理器執行比的權重:越高的nice值(越低的優先順序)程序獲得更低的處理器使用權重。
目標延遲是cfs為完美多工中的無限小排程週期的近似值設立的乙個目標。
假如說:目標延遲是20ms,如果有兩個同樣優先順序的可執行任務,每個任務在被其他程序搶占前執行10ms。
最小粒度:cfs引入的每個程序獲得的時間片的底線,預設情況下最小粒度是1ms。
任何程序所獲得的處理器時間是由他自己和其他所有可執行程序nice值的相對差值決定的。nice值對時間片的作用不再是算數加權,而是幾何加權。任何nice值對應的絕對時間不再是乙個絕對值,而是處理器的使用比。cfs稱為公平排程器是因為他確保給每個程序公平的處理器使用比。
(四):linux排程的實現
linux排程的實現重點在於下面四個重要的組成部分:
1:時間記賬
2:程序選擇
3:排程器入口
4:睡眠和喚醒
1:時間記賬
所有的排程器都必須對程序程序執行時間的記賬。
1):排程器的實體結構
cfs不再有時間片的概念,但是他也必須維護乙個每個程序執行時間的時間記賬,因為他需要確保每個程序只在公平分配給他的處理器時間內執行。cfs使用排程器實體結構(定義在檔案linux/sched.h的struct sched_entity中)來追蹤時間記賬。
下面我們來看一下**:
struct sched_entity ;
在程序描述符中,排程器實體結構作為乙個名為se的成員變數存在。
2:虛擬實時
vruntime變數存放程序的虛擬執行時間,該執行時間(花在執行上的時間和)的計算經過了所有可執行程序總數的標準化。虛擬執行時間是以ns為單位,所以vruntime和定時器節拍不再相關。cfs使用vruntime變數來記錄乙個程式到底執行了多長時間以及他還應該再執行多久。
我們來看一下記賬功能的實現。(定義在kernel/sched_fair.c中的update_curr()函式)
static
void update_curr(struct cfs_rq *cfs_rq)
}
該函式即update_curr()計算出了當前程序的執行時間,將該時間存放在delta_exec變數中。然後將該變數傳遞給__update_curr()函式,該函式根據當前可執行程序總數對執行時間程序加權計算。最終將算出的權值與當前執行程序的vruntime相加。
下面是__update_curr()函式:
/*
* update the current task's runtime statistics. skip current tasks that
* are not in our scheduling class.
* * 更新當前任務的執行時的統計資料,跳過不在排程器類中的當前任務。
* */
static
inline
void
__update_curr(struct cfs_rq *cfs_rq, struct sched_entity *curr,
unsigned
long delta_exec)
其中,需要說明的是函式update_curr()是由系統定時器週期性呼叫的,無論程序處於可執行狀態還是處於堵塞狀態。根據這種方式,vruntime可以準確的測量給定程序的執行時間,而且可以知道誰應該是下乙個被執行的程序。 程序排程演算法(程序排程策略)
程序排程演算法 排程演算法是指 根據系統的資源分配策略所規定的資源分配演算法。一 先來先服務和短作業 程序 優先排程演算法 1.先來先服務排程演算法。先來先服務 fcfs 排程演算法是一種最簡單的排程演算法,該演算法既可用於作業排程,也可用於程序排程。fcfs演算法比較有利於長作業 程序 而不利於短...
程序排程三 程序排程介紹
一 程序排程介紹 1 程序排程的產生 程序從使用資源方面可以分為如下兩類,不管是i o還是cpu受限類的程序,cpu都希望再盡可能短的時間 完成更多的工作,但另一方面,又希望盡可能的減少資源 i o或cpu 的消耗,這兩則之間存在矛盾,所以程序 的排程管理就是來協調兩者之間的衝突。型別別稱 描述示例...
linux程序排程詳解(一)
在詳細描寫linux程序排程原理之前在這裡先明確幾個基本概念 搶占 排程程式決定什麼時候停止乙個程序的執行以便其他程序又能夠得到執行的機會,這個強制掛起的動作叫做搶占 時間片 程序在被強佔之前預先設定的能夠執行的時間。從上面的兩個概念就可以看出來,排程程式的乙個功能就是計算每個程序占用的時間片合理每...