中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

詳解Linux內(nèi)核進(jìn)程調(diào)度函數(shù)schedule()的觸發(fā)和執(zhí)行時(shí)機(jī)

服務(wù)器

內(nèi)核的調(diào)度操作分為觸發(fā)和執(zhí)行兩個(gè)部分,觸發(fā)時(shí)僅僅設(shè)置一下當(dāng)前進(jìn)程的TIF_NEED_RESCHED標(biāo)志,執(zhí)行的時(shí)候則是通過schedule()函數(shù)來完成進(jìn)程的選擇和切換。當(dāng)前進(jìn)程的thread_info->flags中TIF_NEED_RESCHED位表示需要調(diào)用schedule()函數(shù)進(jìn)行調(diào)度。內(nèi)核在兩種情況下會設(shè)置該標(biāo)志,一個(gè)是在時(shí)鐘中斷進(jìn)行周期性的檢查時(shí),另一個(gè)是在被喚醒進(jìn)程的優(yōu)先級比正在運(yùn)行的進(jìn)程的優(yōu)先級高時(shí)。

創(chuàng)新互聯(lián)長期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為自貢企業(yè)提供專業(yè)的做網(wǎng)站、網(wǎng)站制作,自貢網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

周期性地更新當(dāng)前任務(wù)的狀態(tài)時(shí):

定時(shí)中斷處理函數(shù)中會調(diào)用schedule_tick()用于處理關(guān)于調(diào)度的周期性檢查和處理,其調(diào)用路徑是和時(shí)鐘處理有關(guān)的tick_periodic()->update_process_times()->scheduler_tick()或者tick_sched_handle()->update_process_times()->scheduler_tick(),主要用于更新就緒隊(duì)列的時(shí)鐘、CPU負(fù)載和當(dāng)前任務(wù)的運(yùn)行時(shí)間統(tǒng)計(jì)等,如下所示:

//linux-3.13/kernel/sched/core.c
void scheduler_tick(void)
{
  int cpu = smp_processor_id();         //獲取當(dāng)前cpu編號
  struct rq *rq = cpu_rq(cpu);         //取得對應(yīng)cpu的rq(就緒隊(duì)列)
  struct task_struct *curr = rq->curr;     //獲取當(dāng)前運(yùn)行的任務(wù)

  sched_clock_tick();

  raw_spin_lock(&rq->lock);
  update_rq_clock(rq);             //更新隊(duì)列時(shí)鐘
  curr->sched_class->task_tick(rq, curr, 0);  //調(diào)用當(dāng)前任務(wù)的調(diào)度類對應(yīng)的函數(shù)
  update_cpu_load_active(rq);          //更新本處理器的負(fù)載
  raw_spin_unlock(&rq->lock);

  perf_event_task_tick();

#ifdef CONFIG_SMP
  rq->idle_balance = idle_cpu(cpu);
  trigger_load_balance(rq, cpu);        //必要時(shí)進(jìn)行負(fù)載均衡
#endif
  rq_last_tick_reset(rq);
}

其中curr->sched_class->task_tick(rq, curr, 0);這行代碼調(diào)用了當(dāng)前任務(wù)的調(diào)度類的task_tick()函數(shù),這個(gè)函數(shù)根據(jù)具體情況決定是否需要對當(dāng)前任務(wù)設(shè)置TIF_NEED_RESCHED標(biāo)志,如果需要則最終調(diào)用set_tsk_need_resched()設(shè)置該標(biāo)志。需要注意的是,此處僅僅是設(shè)置標(biāo)志而沒有執(zhí)行schedule()函數(shù),在各種系統(tǒng)調(diào)用、中斷的返回代碼最后,才會根據(jù)這個(gè)標(biāo)志來決定是否執(zhí)行schedule()函數(shù)。

睡眠的任務(wù)被喚醒時(shí):

當(dāng)睡眠任務(wù)所等待的事件到達(dá)時(shí),內(nèi)核(例如驅(qū)動程序的中斷處理函數(shù))將會調(diào)用wake_up()喚醒相關(guān)的任務(wù),并最終調(diào)用try_to_wake_up()。它完成三件事:將任務(wù)重新添加到就緒隊(duì)列,將運(yùn)行標(biāo)志設(shè)置為TASK_RUNNING,如果被喚醒的任務(wù)可以搶占當(dāng)前運(yùn)行任務(wù)則設(shè)置當(dāng)前任務(wù)的TIF_NEED_RESCHED標(biāo)志。

設(shè)置了TIF_NEED_RESCHED標(biāo)志之后,真正調(diào)用執(zhí)行schedule()函數(shù)的時(shí)機(jī)只有兩種,第一種是系統(tǒng)調(diào)用或者中斷返回時(shí),根據(jù)TIF_NEED_RESCHED標(biāo)志決定是否調(diào)用schedule()函數(shù)(從效率方面考慮,趁著還在內(nèi)核態(tài)把該處理的事情處理完畢);第二種情況是當(dāng)前任務(wù)因?yàn)樵蛐枰?,進(jìn)程睡眠后立即調(diào)用schedule()函數(shù),在內(nèi)核中這種情況也比較多,比如磁盤、網(wǎng)卡等設(shè)備驅(qū)動程序中。

參考文獻(xiàn):《Linux技術(shù)內(nèi)幕》

PS:剛開始學(xué)習(xí)Linux內(nèi)核的時(shí)候很容易被各種結(jié)構(gòu)體各種概念充斥腦海,一團(tuán)亂麻。這時(shí)候需要把它們各自負(fù)責(zé)的功能以及之間相互的配合理清楚,推薦這本書??赐辍禠inux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》后可以相互比照,效果不錯(cuò)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

名稱欄目:詳解Linux內(nèi)核進(jìn)程調(diào)度函數(shù)schedule()的觸發(fā)和執(zhí)行時(shí)機(jī)
轉(zhuǎn)載源于:http://www.rwnh.cn/article42/cjdcec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司電子商務(wù)、網(wǎng)站策劃、動態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
亚东县| 犍为县| 厦门市| 通州区| 溧阳市| 图木舒克市| 定南县| 天台县| 新巴尔虎左旗| 忻州市| 保德县| 张掖市| 桐梓县| 当雄县| 济源市| 安陆市| 芒康县| 九龙县| 锦屏县| 米泉市| 资讯| 满洲里市| 大同县| 连山| 历史| 囊谦县| 玛纳斯县| 电白县| 哈巴河县| 遂昌县| 临澧县| 阳西县| 宽甸| 景东| 荔浦县| 乌海市| 南江县| 石景山区| 北宁市| 上犹县| 巴彦县|