內(nèi)核的調(diào)度操作分為觸發(fā)和執(zhí)行兩個部分,觸發(fā)時僅僅設置一下當前進程的TIF_NEED_RESCHED標志,執(zhí)行的時候則是通過schedule()函數(shù)來完成進程的選擇和切換。當前進程的thread_info->flags中TIF_NEED_RESCHED位表示需要調(diào)用schedule()函數(shù)進行調(diào)度。內(nèi)核在兩種情況下會設置該標志,一個是在時鐘中斷進行周期性的檢查時,另一個是在被喚醒進程的優(yōu)先級比正在運行的進程的優(yōu)先級高時。
周期性地更新當前任務的狀態(tài)時:
定時中斷處理函數(shù)中會調(diào)用schedule_tick()用于處理關于調(diào)度的周期性檢查和處理,其調(diào)用路徑是和時鐘處理有關的tick_periodic()->update_process_times()->scheduler_tick()或者tick_sched_handle()->update_process_times()->scheduler_tick(),主要用于更新就緒隊列的時鐘、CPU負載和當前任務的運行時間統(tǒng)計等,如下所示:
//linux-3.13/kernel/sched/core.c void 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); //調(diào)用當前任務的調(diào)度類對應的函數(shù) 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); }
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
新聞標題:詳解Linux內(nèi)核進程調(diào)度函數(shù)schedule()的觸發(fā)和執(zhí)行時機-創(chuàng)新互聯(lián)
分享鏈接:http://m.rwnh.cn/article46/dcephg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設計、網(wǎng)站收錄、網(wǎng)站建設、電子商務、域名注冊、虛擬主機
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容