linux内核杂记(9)-进程调度(4)
1、上下文切換從一個(gè)可執(zhí)行進(jìn)程切換到另一個(gè)要執(zhí)行進(jìn)程。由定義在kernel/sched.c中的context_switch()函數(shù)負(fù)責(zé)處理。
2、每當(dāng)一個(gè)新的進(jìn)程被選出來準(zhǔn)備投入運(yùn)行時(shí),schedule()就會(huì)調(diào)用該函數(shù)。完成兩項(xiàng)基本工作:
(1)調(diào)用聲明在<asm/mmu_context.h>中的switch_mm()。
把虛擬內(nèi)存從上一個(gè)進(jìn)程映射到新進(jìn)程中。
(2)調(diào)用聲明在<asm/system.h>中的switch_to()。從上一進(jìn)程的處理器狀態(tài)切換到新進(jìn)程的處理器狀態(tài)。
3、內(nèi)核必須知道在什么時(shí)候調(diào)用schedule(),不能依賴用戶程序代碼顯式調(diào)用 schedule() ,因?yàn)橛脩舫绦蚩赡芟M肋h(yuǎn)執(zhí)行下去,不希望被替代。
4、內(nèi)核提供了need_resched標(biāo)志表明是否需要重新執(zhí)行調(diào)度。
進(jìn)程應(yīng)被搶占時(shí),scheduler_tick()會(huì)設(shè)置這個(gè)標(biāo)志,優(yōu)先級(jí)高的進(jìn)程進(jìn)入可執(zhí)行狀態(tài)時(shí),try_to_wake_up()設(shè)置這個(gè)標(biāo)志
set_tsk_need_resched() 設(shè)置指定進(jìn)程中的need_resched標(biāo)志
clear_tsk_need_resched()清除指定進(jìn)程中的need_resched標(biāo)志
need_resched()檢查need_resched標(biāo)志的值,如果被設(shè)置返回真,否則返回假
5、返回 用戶空間和從中斷返回時(shí),內(nèi)核會(huì)檢查need_resched標(biāo)志,如果被設(shè)置,內(nèi)核會(huì)在繼續(xù)招手地之前調(diào)用調(diào)度程序,每個(gè)進(jìn)程包含一個(gè)need_resched標(biāo)志,在2.6版中在thread_info結(jié)構(gòu)城,用一個(gè)特別的標(biāo)志變量中的一位來表示。
總結(jié)
以上是生活随笔為你收集整理的linux内核杂记(9)-进程调度(4)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HashMap的底层原理
- 下一篇: Java Collections.emp