進程的調(diào)度程序是保證進程能有效工作的一個內(nèi)核子系統(tǒng)。調(diào)度程序負責(zé)決定將哪個進程投入運行,何時運行以及運行多少時間。簡單的來說,調(diào)度程序就是在給一堆就緒的進程分配處理器的時間,調(diào)度程序是多任務(wù)操作系統(tǒng)的基礎(chǔ)。調(diào)度程序的原則就是最大限度的使用cpu的資源,也就是說,當(dāng)系統(tǒng)中只要有可運行的進程,就不能讓cpu處于空閑的狀態(tài),如果系統(tǒng)中沒有就緒的進程時,則cpu會運行一個idle進程。
1.多任務(wù)
多任務(wù)操作系統(tǒng)就是能夠同時并發(fā)的交互執(zhí)行多個進程的操作系統(tǒng),需要注意這里是并發(fā),而不是并行。如果你的計算機有兩個或者兩個以上的cpu那么,你的計算機就可以真正同時、并行的執(zhí)行多個任務(wù)。多任務(wù)操作系統(tǒng)可以分為兩類:搶占式多任務(wù)和非搶占式多任務(wù)。
搶占式多任務(wù)中,由調(diào)度程序來決定什么時候停止一個進程的執(zhí)行,這種由調(diào)度程序強行停止一個進程執(zhí)行的動作稱為搶占(preemption)。進程在被搶占之前運行的時間是固定的,而且有一個專門的名字,叫做時間片(timeslice)。時間片實際上是分配給每個進程的處理器時間段。
而非搶占式多任務(wù)是由進程自己做出讓步,在執(zhí)行了一段時間之后,主動地讓出cpu。進程主動掛起自己的操作稱為讓步(yielding),如果某個進程懸掛起來并且拒不作出讓步的話,可能會導(dǎo)致操作系統(tǒng)崩潰。
所以總述上面的兩種情況,搶占式多任務(wù)就像“法律”,只要時間到了,就把你撤下來。而非搶占式卻像“道德”一樣,你要是有道德,執(zhí)行了一會之后,你就自己撤下來,如果有的“人”占著茅坑不拉屎,那其他進程除了用“道德”譴責(zé)它,也沒有其他的辦法了。
2.linux進程調(diào)度
linux最初的進程調(diào)度程序是非常原始的,很難適應(yīng)一些眾多的可運行進程和多處理器環(huán)境。后來從linux2.5開始,對linux的進程調(diào)度程序做了大的調(diào)整,使用了稱為O(1)的調(diào)度算法,這個算法引起算法行為而得名。O(1)調(diào)度算法雖然在數(shù)以十計的多處理器上能表現(xiàn)出近乎完美的特性和可擴展性,但是由于這個算法在調(diào)度交互進程的時候并沒有表現(xiàn)出很理想的效果。所以在linux2.6的開發(fā)初期,提出了CFS算法,即完全公平調(diào)度算法。
3.策略
(1)IO消耗型進程和處理器消耗型進程
IO消耗型進程指的是進程的大部分時間是用來等待IO的操作,例如圖形用戶界面(GUI)程序就屬于IO消耗型程序,這個程序需要不斷的監(jiān)聽來自用戶的輸入。這樣的進程經(jīng)常處于可運行的狀態(tài),但是每次運行的時間都很短。
處理器消耗型進程是指進程的大部分時間用在執(zhí)行代碼上,比如大型的計算程序MATLAB就屬于處理器消耗型進程。
還有一些應(yīng)用程序雖然劃分為IO消耗型進程,但是也有處理器消耗型進程的特征。例如,字處理程序,在大多數(shù)時間可能等待來自用戶的輸入,但是在某段時間該程序又可能粘住處理器瘋狂的進行語法和拼寫錯誤的檢查。
調(diào)度程序需要在兩個矛盾目標(biāo)中尋找平衡————進程的迅速響應(yīng)和高吞吐量。unix和linux為了獲得良好的用戶響應(yīng),因此都傾向于調(diào)度IO消耗型進程。
(2)進程優(yōu)先級
調(diào)度算法中最基本的一種就是基于進程優(yōu)先級的調(diào)度,這是一種根據(jù)進程的價值和其對處理器的時間需求來對進程分級的一種想法。通常的做法是優(yōu)先級高的進程先執(zhí)行,低的后運行,相同優(yōu)先級的進程按輪轉(zhuǎn)方式進行調(diào)度(一個接一個,重復(fù)進行)。在某些操作系統(tǒng)中,優(yōu)先級高的進程的使用的時間片也長一些。調(diào)度程序總是選擇優(yōu)先級高的,并且時間片尚未用盡的進程。
linux系統(tǒng)采用了兩種不同類別的優(yōu)先級,第一種是使用nice值,范圍是從-20到+19,值越大表示優(yōu)先級越低。這個優(yōu)先級適用于一般的進程。
另外,linux對實時進程采用實時優(yōu)先級,值從0-99,值越大代表優(yōu)先級越高。實時進程的優(yōu)先級都高于普通進程,因此這兩個進程優(yōu)先級是處于兩個互不相交的范圍內(nèi)。
(3)時間片
時間片是一個數(shù)值,他表示進程在被搶占前能夠持續(xù)運行的時間。時間片過長會導(dǎo)致系統(tǒng)對交互的響應(yīng)表現(xiàn)欠佳,時間片過短,卻又明顯增大進程切換帶來的處理器時間消耗。所以IO消耗型進程和處理器消耗型進程的矛盾在這里又再次顯現(xiàn)出來,IO消耗型進程不需要長的時間片,而處理器消耗型進程則希望時間片越長越好。
長時間片將導(dǎo)致系統(tǒng)的交互性表現(xiàn)欠佳,很多的操作系統(tǒng)都很重視這一點,因此將時間片設(shè)置的很短,如10ms。但是linux的CFS調(diào)度算法并沒有直接分配時間片到進程,它是將處理器的使用比分給了進程,這樣進程獲得的處理器的時間是和系統(tǒng)負載密切相關(guān)的。這個比例還會受到nice值的影響,nice值作為權(quán)重將調(diào)整進程使用處理器時間的使用比。具有更高nice值(低優(yōu)先級)的進程將被賦予低權(quán)重,從而喪失一小部分處理器的使用比,而具有低nice值(高優(yōu)先級)的進程江北賦予高權(quán)重,從而獲得更多的處理器使用比。