天天看點

《Linux核心精髓:精通Linux核心必會的75個絕技》一HACK #8 排程政策

本節介紹linux的排程政策(scheduling policy)。

linux排程政策的類别大緻可以分為tss(time sharing system,分時系統)和實時系統這兩種。

一方面,一般的程序是通過分時運作的。也就是說,使用cpu的時間達到配置設定給程序的時間(時間片)時,就會切換到其他程序。這種分時運作的排程政策稱為tss。

另一方面,在實時制約較嚴格且要求保證明時的進行中,就需要指定靜态的執行優先級,并嚴格按照執行優先級進行排程。對這種對應答性有要求的程序,可以使用實時排程政策。另外,與tss排程政策的程序相比,cpu将優先配置設定給使用實時排程政策的程序。

在linux中,程序的靜态優先級為0~99。tss排程政策的優先級為0,實時排程政策的優先級可以指定的範圍為1~99。

linux 2.6.23以前一直采用的o(1)排程程式,還會在tss排程政策中添加動态優先級。長時間持續使用cpu的程序,其排程的動态優先級會漸漸降低。linux的程序排程程式是按照優先級來配置設定cpu的,是以長時間占用cpu的程序優先級與其他程序相比就相對較低。與之相對的是,頻繁與使用者進行交流的shell等對話程序由于cpu使用時間短,其排程的優先級變高,更容易配置設定到cpu。是以,為等待使用者輸入而立刻騰出cpu的shell程序的優先級變得比其他程序高,使用者的應答性就得到提高。

在linux 2.6.23導入的cfs(completely fair scheduler)排程程式中,沒有之前的o(1)排程程式所進行的經驗性優先級變化。cfs通過稱為公平的cpu時間配置設定的結構來運作。

排程政策

rhel6(linux 2.6.32)中定義了下列排程政策。

下面将分别對各排程政策進行介紹。

這是linux的标準排程政策,也是所謂tss排程政策。

在rhel5等linux 2.6.23之前的核心所使用的以優先級為基礎的o(1)排程程式中,還加入了經驗性的判斷,優先為會話程序賦予執行權。tss的時間片由優先級決定。

在rhel6等linux 2.6.23之後的cfs中,會公平地為所有tss政策的程序配置設定cpu時間。其時間片是動态決定的。

這是實時排程政策,即具有靜态優先級的排程政策。linux核心中能夠為實時排程政策的程序指定的優先級為1~99。使用了sched_fifo排程政策的程序,除了等待i/o完成時休眠、自發休眠或優先級更高的實時程序獲得優先權以外,不會釋放執行權。

使用sched_fifo的實時排程政策時,需要注意的是,它的程序不會自動釋放cpu,也就是說執行權不會轉移到其他程序。例如,實時排程政策的程序陷入無限循環時,其他所有優先級較低的程序永遠不會被賦予執行權,此時系統就會當機。

小貼士:另外,要對程序使用實時排程政策,必須有root權限。

這也是實時排程政策。rr是round robin(輪詢)的縮寫,與sched_fifo不同的是,它具有時間片。時間片使用完時,執行權将轉移到其他程序。

在2.6.23以前導入的o(1)排程程式中,時間片是由優先級決定的。

引入cfs時sched_rr的排程政策也進行了修改,時間片變為固定值(100毫秒)。

指定這個排程政策的程序不是會話型,不會根據休眠時間更改優先級。

例如,備份處理等需要進行較大檔案或大量檔案存取的程序,是通過磁盤i/o來中止的。在tss排程政策中,因為這個休眠,正在進行備份處理的程序優先級提高,需要應答性的shell等的優先級相對降低。這就會導緻系統的應答性降低。

在rhel5的o(1)排程程式中,使用了這個排程政策的程序被識别為休眠時間為0的cpu bound程序。是以,優先級必然會變成比會話型shell程序低。

對非會話型的程序(即所謂的更新檔處理)使用這個排程政策,就可以使會話型程序的優先級保持相對較高,并確定應答性。

在linux 2.6.23導入的cfs中,對進行更新檔處理的程序改變了處理的方法,優先級不會因休眠時間而發生變化。在導入cfs的rhel6中,sched_batch和sched_other幾乎沒有差別,是以可以不使用。

這是由cfs導入的新等級。cpu空閑時,即sched_idle等級以外處于可執行狀态的程序消失時,将被賦予執行權。也就是它将成為優先級最低的程序。

特殊标志:sched_reset_on_fork

為了限制實時排程政策的程序運作,而為排程政策添加了标志flag。設定了标志flag的實時排程政策程序,在執行fork()時,新生成的子程序就成為sched_other政策的程序。

如下例所示,通過向實時排程政策添加标志flag來設定。

關于排程政策的系統調用

關于排程政策的系統調用如下所示。

更改排程政策和程序優先級。

擷取目前排程政策與程序優先級。

更改排程參數(即程序優先級)。

擷取目前排程參數。

擷取排程政策的程序的靜态優先級範圍。

擷取目前時間片。

chrt指令

使用者使用chrt指令可以很簡單地更改排程政策。rhel5版本的chrt指令中不存在指定sched_idle的-i選項。

在centos5(rhel5)中chrt的使用方法如下所示。

下面是fedora 12(rhel6)中chrt的使用方法。

使用chrt指令,可以更改程序的排程政策和優先級。例如,使用sched_idle解壓縮核心源代碼存檔時的指令行如下所示。

正在運作的程序的排程政策也可以通過指定目的程序的pid來更改。

另外,使用實時排程政策,必須具有root權限。

小結

本節介紹了可以使用linux程序排程程式指定的排程政策。可以嘗試修改對備份處理和要求實時性的程序的排程政策。

參考文獻

cfs

<a href="http://www.ibm.com/developerworks/jp/linux/library/l-cfs/?ca=dnj-0208">http://www.ibm.com/developerworks/jp/linux/library/l-cfs/?ca=dnj-0208</a>

man sched_setscheduler他

<a href="http://www.linux.or.jp/jm/html/ldp_man-pages/man2/sched_setscheduler.2.html">http://www.linux.or.jp/jm/html/ldp_man-pages/man2/sched_setscheduler.2.html</a>

—hiroshi shimamoto