|
一個(gè)CPU只有一個(gè)就緒隊(duì)列rq,然而這個(gè)就緒隊(duì)列并不直接管理進(jìn)程,它又包含子就緒隊(duì)列,例如完全公平就緒隊(duì)列、實(shí)時(shí)就緒隊(duì)列。進(jìn)程的調(diào)度主要基于兩個(gè)調(diào)度器:周期性調(diào)度器和主調(diào)度器。周期性調(diào)度器是在內(nèi)核頻率HZ中斷中統(tǒng)計(jì)一些進(jìn)程時(shí)間信息,并判斷進(jìn)程是否需要調(diào)度,如果需要就發(fā)起調(diào)度請(qǐng)求;主調(diào)度器是進(jìn)程主動(dòng)放棄CPU控制權(quán),切換到其他進(jìn)程運(yùn)行,在住調(diào)度器中做了很多進(jìn)程上下文切換的工作。 上層調(diào)度器并不直接對(duì)進(jìn)程進(jìn)行操作,而是通過進(jìn)程所屬調(diào)度類對(duì)進(jìn)城進(jìn)行操作。調(diào)度類主要有兩種:完全公平調(diào)度類、實(shí)時(shí)調(diào)度類。內(nèi)核中用0到139來表示進(jìn)程優(yōu)先級(jí),0到99供實(shí)時(shí)進(jìn)程使用,100到139供普通進(jìn)程使用,在用戶空間對(duì)應(yīng)-20到19的nice值。完全公平調(diào)度類提供類一些方法,這些方法對(duì)完全公平隊(duì)列上的進(jìn)程進(jìn)行插入、移除、時(shí)間統(tǒng)計(jì)等操作。在完全公平隊(duì)列上進(jìn)程是按虛擬時(shí)間大小通過紅黑樹排序的,虛擬時(shí)間越小的進(jìn)程排在紅黑樹越靠左邊,得到運(yùn)行的可能就越大。虛擬時(shí)間跟進(jìn)程權(quán)重緊密相關(guān),而權(quán)重又跟進(jìn)程優(yōu)先級(jí)相對(duì)應(yīng)。隨著時(shí)間的推移,權(quán)重越大的進(jìn)程虛擬時(shí)間增加越慢,向右移動(dòng)的速度就越慢,得到調(diào)度的機(jī)會(huì)就越多,所以優(yōu)先級(jí)越高的進(jìn)程得到運(yùn)行的機(jī)會(huì)就越大。實(shí)時(shí)進(jìn)程類與完全公平調(diào)度類大體相同,不同的是在實(shí)時(shí)就緒隊(duì)列上,有100個(gè)鏈表頭,分別掛接100個(gè)不同優(yōu)先級(jí)的實(shí)時(shí)進(jìn)程。選擇下一個(gè)進(jìn)程運(yùn)行時(shí),從小到大掃描鏈表找出第一個(gè)進(jìn)程運(yùn)行。實(shí)時(shí)進(jìn)程包含SCHED_RR和SCHED_FIFO,它們?cè)谕瑑?yōu)先級(jí)隊(duì)列中都是先進(jìn)先出,不過SCHED_RR有時(shí)間片,時(shí)間片用完后重新分配時(shí)間片將進(jìn)程放入優(yōu)先級(jí)隊(duì)列尾,然后就調(diào)度其他進(jìn)程運(yùn)行。SCHED_FIFO進(jìn)程一旦調(diào)度運(yùn)行就可以一直運(yùn)行下去,除非主動(dòng)放棄CPU控制權(quán)。 在SMP多處理器系統(tǒng)中還要實(shí)現(xiàn)負(fù)載均衡,將忙碌CPU隊(duì)列上的進(jìn)程移動(dòng)到空閑CPU上。 運(yùn)行新程序: 新進(jìn)程運(yùn)行之初,它的地址空間與其父進(jìn)程相同,為運(yùn)行新的程序它需要調(diào)用exec函數(shù)將新的可執(zhí)行程序加載到進(jìn)程空間,從而運(yùn)行不同于父進(jìn)程的程序 |
|
|