Linux核心進程調度函數schedule()的觸發和執行時機__Oracle

來源:互聯網
上載者:User

核心的調度操作分為觸發和執行兩個部分,觸發時僅僅設定一下當前進程的TIF_NEED_RESCHED標誌,執行的時候則是通過schedule()函數來完成進程的選擇和切換。當前進程的thread_info->flags中TIF_NEED_RESCHED位表示需要調用schedule()函數進行調度。核心在兩種情況下會設定該標誌,一個是在時鐘中斷進行周期性的檢查時,另一個是在被喚醒進程的優先順序比正在啟動並執行進程的優先順序高時。

周期性地更新當前任務的狀態時:

定時中斷處理函數中會調用schedule_tick()用於處理關於調度的周期性檢查和處理,其調用路徑是和時鐘處理有關的tick_periodic()->update_process_times()->scheduler_tick()或者tick_sched_handle()->update_process_times()->scheduler_tick(),主要用於更新就緒隊列的時鐘、CPU負載和當前任務的已耗用時間統計等,如下所示:

//linux-3.13/kernel/sched/core.cvoid scheduler_tick(void){    int cpu = smp_processor_id();                 //擷取當前cpu編號    struct rq *rq = cpu_rq(cpu);                  //取得對應cpu的rq(就緒隊列)    struct task_struct *curr = rq->curr;          //擷取當前啟動並執行任務    sched_clock_tick();    raw_spin_lock(&rq->lock);    update_rq_clock(rq);                          //更新隊列時鐘    curr->sched_class->task_tick(rq, curr, 0);    //調用當前任務的調度類對應的函數    update_cpu_load_active(rq);                   //更新本處理器的負載    raw_spin_unlock(&rq->lock);    perf_event_task_tick();#ifdef CONFIG_SMP    rq->idle_balance = idle_cpu(cpu);    trigger_load_balance(rq, cpu);                //必要時進行負載平衡#endif    rq_last_tick_reset(rq);}

其中curr->sched_class->task_tick(rq, curr, 0);這行代碼調用了當前任務的調度類的task_tick()函數,這個函數根據具體情況決定是否需要對當前任務設定TIF_NEED_RESCHED標誌,如果需要則最終調用set_tsk_need_resched()設定該標誌。需要注意的是,此處僅僅是設定標誌而沒有執行schedule()函數,在各種系統調用、中斷的傳回碼最後,才會根據這個標誌來決定是否執行schedule()函數。

睡眠的任務被喚醒時:

當睡眠任務所等待的事件到達時,核心(例如驅動程式的中斷處理函數)將會調用wake_up()喚醒相關的任務,並最終調用try_to_wake_up()。它完成三件事:將任務重新添加到就緒隊列,將運行標誌設定為TASK_RUNNING,如果被喚醒的任務可以搶佔當前運行任務則設定當前任務的TIF_NEED_RESCHED標誌。

設定了TIF_NEED_RESCHED標誌之後,真正調用執行schedule()函數的時機只有兩種,第一種是系統調用或者中斷返回時,根據TIF_NEED_RESCHED標誌決定是否調用schedule()函數(從效率方面考慮,趁著還在核心態把該處理的事情處理完畢);第二種情況是當前任務因為原因需要睡眠,進程睡眠後立即調用schedule()函數,在核心中這種情況也比較多,比如磁碟、網卡等裝置驅動程式中。

參考文獻:《Linux技術內幕》
PS:剛開始學習Linux核心的時候很容易被各種結構體各種概念充斥腦海,一團亂麻。這時候需要把它們各自負責的功能以及之間相互的配合理清楚,推薦這本書。看完《Linux核心設計與實現》後可以相互比照,效果不錯。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.