資源描述:
《linux內(nèi)核分析之調(diào)度算法》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、linux內(nèi)核分析之調(diào)度算法linux調(diào)度算法在2.6.32中采用調(diào)度類實(shí)現(xiàn)模塊式的調(diào)度方式。這樣,能夠很好的加入新的調(diào)度算法。linux調(diào)度器是以模塊方式提供的,這樣做的目的是允許不同類型的進(jìn)程可以有針對性地選擇調(diào)度算法。這種模塊化結(jié)構(gòu)被稱為調(diào)度器類,他允許多種不同哦可動態(tài)添加的調(diào)度算法并存,調(diào)度屬于自己范疇的進(jìn)程。每個調(diào)度器都有一個優(yōu)先級,調(diào)度代碼會按照優(yōu)先級遍歷調(diào)度類,擁有一個可執(zhí)行進(jìn)程的最高優(yōu)先級的調(diào)度器類勝出,去選擇下面要執(zhí)行的那個程序。linux上主要有兩大類調(diào)度算法,CFS(完全公平調(diào)度算法)和實(shí)時調(diào)度算法。宏SCHED_N
2、OMAL主要用于CFS調(diào)度,而SCHED_FIFO和SCHED_RR主要用于實(shí)時調(diào)度。如下面的宏定義:1./*?2.?*?Scheduling?policies?3.?*/??4.?/*支援Real-Time?Task的排程,包括有SCHED_FIFO與SCHED_RR.??5.?*/??6.???7.?/*(也稱為SCHED_OTHER):?主要用以排程?8.?一般目的的Task.*/??9.#define?SCHED_NORMAL????????0??10.#define?SCHED_FIFO??????1??11./*task預(yù)設(shè)的
3、?Time?Slice長度為100?msecs*/??12.#define?SCHED_RR????????2??13./*主要用以讓Task可以延長執(zhí)行的時間?14.(Time?Slice),減少被中斷發(fā)生Task?Context-Switch?15.的次數(shù).藉此可以提高?Cache的利用率??16.(每次Context-Switch都會導(dǎo)致Cache-Flush).?比?17.較適合用在固定週期執(zhí)行的Batch?Jobs任?18.務(wù)主機(jī)上,而不適合用在需要使用者互?19.動的產(chǎn)品?(會由於Task切換的延遲,而?20.感覺到系統(tǒng)效能不
4、佳或是反應(yīng)太慢).*/??21.#define?SCHED_BATCH?????3??22./*?SCHED_ISO:?reserved?but?not?implemented?yet?*/??1./*為系統(tǒng)中的Idle?Task排程.*/??2.#define?SCHED_IDLE??????5??linux調(diào)度算法實(shí)現(xiàn)的高層數(shù)據(jù)結(jié)構(gòu)主要有運(yùn)行實(shí)體、調(diào)度類、運(yùn)行隊(duì)列,下面我們主要看看這幾個數(shù)據(jù)結(jié)構(gòu)的字段和意義。運(yùn)行實(shí)體,rq結(jié)構(gòu)體每個cpu有一個,主要存儲一些基本的用于調(diào)度的信息,包括實(shí)時調(diào)度的和CFS調(diào)度的1.?/*每個處理器都會配置
5、一個rq*/??2.struct?rq?{??3.????/*?runqueue?lock:?*/??4.????spinlock_t?lock;??5.??6.????/*?7.?????*?nr_running?and?cpu_load?should?be?in?the?same?cacheline?because?8.?????*?remote?CPUs?use?both?these?fields?when?doing?load?calculation.?9.?????*/??10.?????/*用以記錄目前處理器rq中執(zhí)行task
6、的數(shù)量*/??11.????unsigned?long?nr_running;??12.????#define?CPU_LOAD_IDX_MAX?5??13.????/*用以表示處理器的負(fù)載,在每個處理器的rq中?14.????都會有對應(yīng)到該處理器的cpu_load參數(shù)配置,在每次?15.????處理器觸發(fā)scheduler?tick時,都會呼叫函數(shù)?16.????update_cpu_load_active,進(jìn)行cpu_load的更新。在系統(tǒng)初始化的時候?17.????會呼叫函數(shù)sched_init把rq的cpu_load?array初
7、始化為0.?18.????了解他的更新方式最好的方式是通過函數(shù)update_cpu_load,公式如下澹??19.????cpu_load[0]會直接等待rq中l(wèi)oad.weight的值。?20.????cpu_load[1]=(cpu_load[1]*(2-1)+cpu_load[0])/2?21.????cpu_load[2]=(cpu_load[2]*(4-1)+cpu_load[0])/4?22.????cpu_load[3]=(cpu_load[3]*(8-1)+cpu_load[0])/8?1.????cpu_load[4]=
8、(cpu_load[4]*(16-1)+cpu_load[0]/16?2.????呼叫函數(shù)this_cpu_load時,所返回的cpu?load值是cpu_load[0]?3.????而在進(jìn)行