本節介紹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