調(diào)度程序的基本工作是從一堆處于可運(yùn)行狀態(tài)的進(jìn)程中選一個(gè)來(lái)執(zhí)行竹椒;本章討論了一些調(diào)度程序的理論呻畸,對(duì)比了幾種調(diào)度程序写穴,詳細(xì)講解了linux使用的“公平”調(diào)度程序共苛;
多任務(wù)
搶占式多任務(wù)
調(diào)度程序決定進(jìn)程們是運(yùn)行還是掛起非搶占式多任務(wù)
只能等運(yùn)行的進(jìn)程主動(dòng)讓步琼富,其他進(jìn)程才有機(jī)會(huì)執(zhí)行
Linux的調(diào)度算法
這篇blog仪吧,講的很清楚
- O(1)調(diào)度算法
- CFS調(diào)度算法
進(jìn)程調(diào)度常用策略
優(yōu)先級(jí)策略
高優(yōu)先級(jí)先運(yùn)行,低優(yōu)先級(jí)后運(yùn)行;
linux的優(yōu)先級(jí)調(diào)度:
--nice值越低鞠眉,優(yōu)先級(jí)越高
--實(shí)時(shí)優(yōu)先級(jí)越高薯鼠,優(yōu)先級(jí)越高時(shí)間片策略
進(jìn)程被搶占前所能持續(xù)運(yùn)行的時(shí)間
CFS實(shí)現(xiàn)
時(shí)間記帳
vruntime記錄了一個(gè)可執(zhí)行進(jìn)程到當(dāng)前時(shí)刻為止執(zhí)行的總時(shí)間(需要以進(jìn)程總數(shù)n進(jìn)行歸一化,并且根據(jù)進(jìn)程的優(yōu)先級(jí)進(jìn)行加權(quán))進(jìn)程選擇
根據(jù)vruntime的定義可以知道械蹋,vruntime越大出皇,說(shuō)明該進(jìn)程運(yùn)行的越久,所以被調(diào)度的可能性就越小哗戈。所以我們的調(diào)度算法就是每次選擇vruntime值最小的進(jìn)程進(jìn)行調(diào)度郊艘,內(nèi)核中使用紅黑樹(shù)可以方便的得到vruntime值最小的進(jìn)程調(diào)度器入口
schedule()睡眠與喚醒
睡眠:進(jìn)程將自己標(biāo)記為休眠,從可執(zhí)行紅黑樹(shù)中移除唯咬,放入等待隊(duì)列纱注;
喚醒:進(jìn)程被設(shè)置成可執(zhí)行態(tài),再?gòu)牡却?duì)列移到可執(zhí)行紅黑樹(shù)中胆胰;
搶占
用戶(hù)搶占
從系統(tǒng)調(diào)用返回用戶(hù)空間時(shí)
從中斷處理返回用戶(hù)空間時(shí)內(nèi)核搶占
從中斷處理返回內(nèi)核空間之前
內(nèi)核空間再次具備可搶占性時(shí)(無(wú)鎖狞贱,需要被搶占)
顯示調(diào)用schedule()
任務(wù)阻塞