宜興建設(shè)局 審圖中心 網(wǎng)站seo快速排名軟件案例
目錄
系統(tǒng)調(diào)度過程
用戶空間角度:
內(nèi)核角度
1、調(diào)用fork創(chuàng)建一個(gè)新進(jìn)程
2、使用_fo_fork創(chuàng)建新進(jìn)程
3、父進(jìn)程調(diào)用wake_up_new_task嘗試喚醒新進(jìn)程
4、CPU選擇一個(gè)合適的進(jìn)程來運(yùn)行;
5、運(yùn)行新進(jìn)程
6、實(shí)現(xiàn)負(fù)載均衡
系統(tǒng)調(diào)度過程
分析在命令行下使用./test程序。程序在用戶態(tài)和內(nèi)核臺中運(yùn)行的流程
用戶空間角度:
shell 運(yùn)行test程序,調(diào)用fork()系統(tǒng)調(diào)用函數(shù)來創(chuàng)建一個(gè)新進(jìn)程;
調(diào)用exec系統(tǒng)調(diào)用函數(shù)來裝載test程序。
ret = fork()
if(ret > 0)
{//父進(jìn)程
}
else if(ret == 0)//子進(jìn)程
{execve()
}
else
{//失敗
}
內(nèi)核角度
do_fork ->新進(jìn)程
1、調(diào)用fork創(chuàng)建一個(gè)新進(jìn)程
2、使用_fo_fork創(chuàng)建新進(jìn)程
- 創(chuàng)建新進(jìn)程的task_struct數(shù)據(jù)結(jié)構(gòu)
- 復(fù)制父進(jìn)程的task_struct數(shù)據(jù)結(jié)構(gòu)到新進(jìn)程
- 復(fù)制父進(jìn)程相關(guān)的頁表項(xiàng)到新進(jìn)程
- 設(shè)置新進(jìn)程的內(nèi)核棧
3、父進(jìn)程調(diào)用wake_up_new_task嘗試喚醒新進(jìn)程
- 調(diào)用調(diào)度類select_task_rq(),為新進(jìn)程尋找一個(gè)負(fù)載最輕的CPU(如果CPU0有四個(gè)線程在運(yùn)行,CPU有一個(gè)線程在運(yùn)行,那么新進(jìn)程在尋址負(fù)載最輕的CPU為CPU1)
- 調(diào)用調(diào)度類的enqueue_task(),把新進(jìn)程添加到CPU1的就緒隊(duì)列里
4、CPU選擇一個(gè)合適的進(jìn)程來運(yùn)行;
- 每次時(shí)鐘節(jié)拍到來時(shí),scheduler_tick()檢查是否需要重新調(diào)度;check_preempt_tick會(huì)做檢查,當(dāng)需要重新調(diào)度時(shí)會(huì)設(shè)置當(dāng)前進(jìn)程的thread_info中的TIF_NEED_RESCHED標(biāo)志位。
- 在中斷返回前會(huì)檢查當(dāng)前進(jìn)程是否需要調(diào)度。如需要調(diào)度,調(diào)用preempt_schedule_irq來切換進(jìn)程運(yùn)行。
- 調(diào)度器的schedule函數(shù)會(huì)調(diào)用調(diào)度類的pick_next_task來選擇下一個(gè)最合適的進(jìn)程
- switch_mm切換父進(jìn)程和新進(jìn)程的頁表
- switch_to切換進(jìn)程來運(yùn)行?
5、運(yùn)行新進(jìn)程
- 新進(jìn)程第一次調(diào)用時(shí)會(huì)調(diào)用ret_from_fork函數(shù)
- 返回用戶空間運(yùn)行shell程序
- shell程序調(diào)用exec來運(yùn)行test程序,最終新進(jìn)程編程test進(jìn)程
6、實(shí)現(xiàn)負(fù)載均衡
- 在每個(gè)時(shí)鐘節(jié)拍到來,檢查是否需要觸發(fā)軟中斷來實(shí)現(xiàn)SMP負(fù)載均衡,調(diào)用函數(shù)為scheduler_tick->trigger_load_balabce()。下一次實(shí)現(xiàn)負(fù)載均衡的時(shí)間點(diǎn)存放在就緒隊(duì)列的next_balance成員里。
- 觸發(fā) SCHED_SOFTIRQ軟中斷
- 在軟中斷函數(shù)run_rebalance_domains里,從當(dāng)前CPU開始遍歷CPU拓?fù)潢P(guān)系,尋找負(fù)載不均勻的調(diào)度組;
- 找到調(diào)度組最繁忙的,然后計(jì)算遷移多少到CPU1上才能保持兩個(gè)調(diào)度組負(fù)載平衡;
- 從CPU0遷移部分進(jìn)程到CPU1?