週期性排程器由中斷實現,系統定時產生乙個中斷,然後啟動週期性排程器,週期性排程器執行過程中要關閉中斷, 週期性排程器執行完畢後再開啟中斷(handle_irq_event, irqf_disabled)
週期性排程器主要做兩個工作:
a)更新相關統計量
b)檢查程序執行的時間是否超過了它對應的ideal_runtime,如果超過了,則告訴系統,需要啟動主排程器(schedule)進行程序切換。(注意thread_info:preempt_count、thread_info:flags (tif_need_resched))
週期性排程器|---->do_timer() 更新jiffies_64
|---->update_process_times()
|---->scheduler_tick()
|---->update_rq_clock() 更新當前排程佇列rq的clock
|---->curr->sched_class->task_tick()
| 對於普通程序,即task_tick_fair()
| task_struct: struct sched_class *sched_class
update_rq_clock()----delta = sched_clock_cpu(cpu_of(rq)) - rq->clock|-----兩次相鄰兩次週期性排程器執行的時間差
|----rq->clock +=delta; 更新執行佇列上的時鐘
|---->update_rq_clock_task(rq, delta)
| 即rq->clock_task += delta
普通程序
task_tick_fair()---->entity_tick() 沒有考慮組排程|---->update_curr() 更新相關統計量
|---->check_preempt_tick()
|檢查程序本次獲得cpu使用權的執行時間是否超過了
|它對應的ideal_runtime值,如果超過了,則將當前進
|程的tif_need_resched標誌位置位
update_curr()
|----delta_exec = (unsigned long)(now - curr->exec_start);
|exec_start當前程序開始獲得
|cpu使用權時的時間戳;
|程序本次所獲得的cpu執行權的時間;
|---->__update_curr(cfs_rq, curr, delta_exec);
|---->curr->sum_exec_runtime +=delta_exec;
|更新該程序獲得cpu執行權總時間
||---->curr->vruntime +=delta_exec_weighted;
|更新該程序獲得cpu執行權的虛擬時間
||---->update_min_vruntime()
| 更新cfs_rq->min_vruntime
||---->curr->exec_start =now
|更新程序下次執行起始時間
|(如果被搶占,下次被排程時將會更新)
check_preempt_tick()
|----ideal_runtime =sched_slice(cfs_rq, curr);
|----delta_exec = curr->sum_exec_runtime
| - curr->prev_sum_exec_runtime;
|----if(delta_exec >ideal_runtime)
| resched_task(rq_of(cfs_rq)->curr);
|把當前程序的tif_need_resched標誌位置位
|----else
| delta = curr->vruntime - se->vruntime; //
這是什麼?
| if (delta >ideal_runtime)
| resched_task(rq_of(cfs_rq)->curr);
| 把當前程序的tif_need_resched標誌位置位
實時程序
task_tick_rt()|---->update_curr_rt();
|---->if (p->policy != sched_rr) return
; sched_fifo只有主動放棄cpu使用權
|---->rt.timeslice值減一,若沒有執行完時間則直接返回,
|否則再次分配時間片,加入佇列尾部,設定tif_need_resched
update_curr_rt()
|----delta_exec = rq->clock - curr->se.exec_start; //
本次執行時間
|----curr->se.sum_exec_runtime += delta_exec; //
更新總得執行時間
|----curr->se.exec_start = rq->clock; //
更新下次程序執行的起始時間
|----if (sched_rt_runtime(rt_rq) !=runtime_inf)
|-------
linux程序排程 週期性排程器
週期性排程器是在scheduler tick中實現。如果系統正在活動中,核心會按照頻率hz自動呼叫該函式。如果沒有程序在等待排程,那麼在計算機電力 不足的情況下,也可以關閉該排程器以減少電能消耗。3469 3470 this function gets called by the timer cod...
170 精準的週期性任務排程
這是官方的第5個例程,這個例程以及相應的講解還是給了我一些提示讓我學到了一些東西的。在詳細進行這個學習教程的學習之前,我自己憑感覺用了一陣子freertos,我想實現乙個週期性的任務排程,於是使用了vtaskdelay的介面做了乙個實現。結果測試下來,印象中大約是每47次就會出現一次偏差。一直沒弄明...
client中週期性邊界 整理 週期性邊界條件
2.3.4 週期性流動與換熱 如果我們計算的流動或者熱場有週期性重複,或者幾何邊界條件週期性重複,就形成了 週期性流動。fluent 可以模擬兩類週期性流動問題。第一,無壓降的週期性平板問題 迴圈邊界 第二,有壓降的週期性邊界導致的完全發展或週期性流向流動問題 週期性邊界 流向週期性流動模擬的條件 ...