週期性排程器是在scheduler_tick中實現。如果系統正在活動中,核心會按照頻率hz自動呼叫該函式。如果沒有程序在等待排程,那麼在計算機電力**不足的情況下,也可以關閉該排程器以減少電能消耗。
3469 /*
3470 * this function gets called by the timer code, with hz frequency.
3471 * we call it with interrupts disabled.
3472 *
3473 * it also gets called by the fork code, when changing the parent's
3474 * timeslices.
3475 */
3476 void scheduler_tick(void)
3477
3484 __update_rq_clock 處理就緒佇列時鐘的更新,在正常情況下,這個函式就是更新rq->clock到當前的時鐘tick
3488 ~3499 正常情況下,我們期望新的時鐘應該是原時鐘增加乙個嘀噠,但是__update_rq_clock得到的時鐘值步伐小於乙個嘀噠,那麼就設定為乙個嘀噠。
3490 把當前時鐘也儲存在tick_timestamp,這個值和clock有些冗餘,完全是為了處理方便而增加的乙個成員變數。
3491 update_cpu_load用來更新rq資料結構中的cpu_load陣列字段,這個cpu_load在負載遷移時會用到。關於cpu load,參見linux程序排程 - 負載均衡
3493 task_tick的實現方式取決於底層的排程器類。對於完全公平排程器會在該方法中檢測是否有程序執行太長時間,以避免過長的延遲。
__update_rq_clock
382 /*
383 * update the per-runqueue clock, as finegrained as the platform can give
384 * us, but without assuming monotonicity, etc.:
385 */
386 static void __update_rq_clock(struct rq *rq)
387 else else
417 }
418
419 rq->prev_clock_raw = now;
420 rq->clock = clock;
421 }
該函式更新per-cpu執行佇列的rq->prev_clock_raw和rq->clock,這裡的時鐘都是實時時鐘。
388 prev_raw 上一次呼叫__update_req_clock的時鐘;now是當前的系統時間
399 ~401 防止時鐘偶爾會跑錯,那麼簡單對clock加1,然後增加統計量clock_warps
403 ~ 411 時鐘也可能會發生前跳,那麼在這種情況下就要修正clock的值,並增加統計量clock_overflows
task_tick_fair
/*
* scheduler tick hitting a task of our scheduling class:
*/static void task_tick_fair(struct rq *rq, struct task_struct *curr)
}
這個函式非常簡單,實際工作是由entity_tick完成的
645 static void entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
646
650 update_curr 更新當前
652 只有可執行程序數目大於1時,才需要考慮程序搶占的問題,否則乙個程序是不需要搶占的。
653 check_preempt_tick該函式判斷程序執行的時間是否超過了延遲週期,如果超過了延遲週期,那麼就要重新排程(設定tif_need_resched標誌),這樣核心排程器會在乙個合適的地方重新排程。比如在系統呼叫返回之後,會檢查tif_need_resched標誌,如果置位,核心會呼叫主排程器schedule;此外當裝置驅動程式首席執行官而重複的任務時,在每次反覆迴圈中,驅動程式都檢查tif_need_resched的值,如果必要,則呼叫排程程式schedule主動放棄cpu。
週期性排程器scheduler tick
週期性排程器由中斷實現,系統定時產生乙個中斷,然後啟動週期性排程器,週期性排程器執行過程中要關閉中斷,週期性排程器執行完畢後再開啟中斷 handle irq event,irqf disabled 週期性排程器主要做兩個工作 a 更新相關統計量 b 檢查程序執行的時間是否超過了它對應的ideal r...
170 精準的週期性任務排程
這是官方的第5個例程,這個例程以及相應的講解還是給了我一些提示讓我學到了一些東西的。在詳細進行這個學習教程的學習之前,我自己憑感覺用了一陣子freertos,我想實現乙個週期性的任務排程,於是使用了vtaskdelay的介面做了乙個實現。結果測試下來,印象中大約是每47次就會出現一次偏差。一直沒弄明...
設定crontab週期性排程任務中的上下文環境問題
通過oracle資料庫匯出任務進行說明。linux下oracle資料庫定時備份舉例 錯誤的匯出指令碼 exp xgxt 123 orcl owner xgxt file home oracle xgxt date y m d h m dmp 執行任務出現如下錯誤 message 206 not fo...