1. linux的排程器,n多書有介紹,但是這些介紹基本都是給個大致概念,具體還要看**。這部分的實現,不同的核心版本有一定的差異,我看的核心版本是2.6.21.7。
2. 關於排程器,我的理解,無外乎3點:什麼時候去檢查是否需要排程(排程時機),如何選擇應該執行的任務(排程策略),怎樣做任務的切換。任務的切換,也就是上下文切換,相對簡單。排程策略,linux下有sched_rr, sched_fifo,sched_other, n多書上對他們差別的講解足夠,且易於理解。我主要學習了排程時機。
3. 由於要進行排程,需要呼叫schedule()函式,在linux核心裡搜尋呼叫這個函式的地方,可以大致將排程時機分成如下4類:
a) 各種驅動主動的呼叫schedule函式,這種情況在**裡看到的最多;
b) 程序從中斷返回時,呼叫ret_from_irq,ret_from_irq會檢查need_sched, 如果thread_info->flag的tif_need_resched位置位,則呼叫函式preempt_schedule_irq()進而呼叫schedule. need_sched 在n多書裡說是task_struct的乙個成員,在實際實現的時候,作為thread_info->flag的乙個bit實現的,可以加速訪問。
具體何處會設定need_sched標識,可以搜尋函式set_tsk_need_resched(struct task_struct *tsk), set_need_resched(), 前者指定要設定的task,後者是設定current。可見乙個主要的地方是在task_running_tick中,task_running_tick是在tick timer的中斷中呼叫的,task_running_tick檢查當前執行task的time_slice是否用完,如果用完,且是sched_rr,會把當前task放到rq->active的隊尾&重新賦值time_slice。 如果是sched_fifo,沒time_slice概念。如果不是上面兩種realtime的policy,還會將rq->active和expire進行調換。realtime的並不調換,說明在realtime下,如果有高優先順序的處於task_running狀態,低優先順序的永遠得不到執行,這和vxworks相同。
c)從異常返回時也會檢查是否need_resched, 具體看**;
d) 當程序呼叫函式,yield, sleep, exit等函式時,這些函式內部也會在改變task狀態後,去呼叫下schedule。其中yield不改變程序狀態,是將處理器讓給同優先順序的任務使用,sleep讓給低優先順序的使用。
4. 如果是smp方式的多核,做balance的是sched_softirq。
處理器排程
1 cpu排程的相關概念 a.cpu排程 其任務是控制 協調程序對cpu的競爭 即按一定的排程演算法從就緒佇列中選擇乙個程序,把cpu的使用權交給被選中的程序 如果沒有就緒程序,系統會安排乙個系統空閒程序或idle程序 b.cpu要解決的三個問題 cpu排程的時機 就緒佇列的改變引發了重新排程 事件...
處理器排程
處理器排程演算法設計從以下幾個方面著手 資源利用率 吞吐率 公平性 響應時間 周轉時間 截止時間的保證 優先權原則等等。cpu利用率 cpu有效工作時間 cpu總的執行時間 cpu總執行時間 cpu有效工作時間 cpu空閒等待時間 吞吐率 單位時間內cpu處理的作業數 公平性 確保程序不會出現餓死現...
處理器排程
處理器排程的目標是以滿足系統目標 如響應時間 吞吐率 處理器效率 的方法,把程序分配到乙個或多個處理器中執行。處理器排程有三個層次 長程排程 又稱高階排程,作業排程,其決定是否能加入待執行的程序池中 中程排程 又稱中級排程,平衡負載排程,其決定加入部分或全部在記憶體中的程序集合中 短程排程 又稱低階...