技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機(jī)純凈版,64位旗艦版,綠色軟件,免費(fèi)軟件下載基地!

當(dāng)前位置:主頁 > 教程 > 服務(wù)器類 >

linux內(nèi)核設(shè)計與實(shí)現(xiàn)讀書筆記

來源:技術(shù)員聯(lián)盟┆發(fā)布時間:2018-08-26 00:02┆點(diǎn)擊:

  進(jìn)程的調(diào)度程序是保證進(jìn)程能有效工作的一個內(nèi)核子系統(tǒng)。調(diào)度程序負(fù)責(zé)決定將哪個進(jìn)程投入運(yùn)行,何時運(yùn)行以及運(yùn)行多少時間。簡單的來說,調(diào)度程序就是在給一堆就緒的進(jìn)程分配處理器的時間,調(diào)度程序是多任務(wù)操作系統(tǒng)的基礎(chǔ)。調(diào)度程序的原則就是最大限度的使用cpu的資源,也就是說,當(dāng)系統(tǒng)中只要有可運(yùn)行的進(jìn)程,就不能讓cpu處于空閑的狀態(tài),如果系統(tǒng)中沒有就緒的進(jìn)程時,則cpu會運(yùn)行一個idle進(jìn)程。

  1.多任務(wù)

  多任務(wù)操作系統(tǒng)就是能夠同時并發(fā)的交互執(zhí)行多個進(jìn)程的操作系統(tǒng),需要注意這里是并發(fā),而不是并行。如果你的計算機(jī)有兩個或者兩個以上的cpu那么,你的計算機(jī)就可以真正同時、并行的執(zhí)行多個任務(wù)。多任務(wù)操作系統(tǒng)可以分為兩類:搶占式多任務(wù)和非搶占式多任務(wù)。

  搶占式多任務(wù)中,由調(diào)度程序來決定什么時候停止一個進(jìn)程的執(zhí)行,這種由調(diào)度程序強(qiáng)行停止一個進(jìn)程執(zhí)行的動作稱為搶占(preemption)。進(jìn)程在被搶占之前運(yùn)行的時間是固定的,而且有一個專門的名字,叫做時間片(timeslice)。時間片實(shí)際上是分配給每個進(jìn)程的處理器時間段。

  而非搶占式多任務(wù)是由進(jìn)程自己做出讓步,在執(zhí)行了一段時間之后,主動地讓出cpu。進(jìn)程主動掛起自己的操作稱為讓步(yielding),如果某個進(jìn)程懸掛起來并且拒不作出讓步的話,可能會導(dǎo)致操作系統(tǒng)崩潰。

  所以總述上面的兩種情況,搶占式多任務(wù)就像“法律”,只要時間到了,就把你撤下來。而非搶占式卻像“道德”一樣,你要是有道德,執(zhí)行了一會之后,你就自己撤下來,如果有的“人”占著茅坑不拉屎,那其他進(jìn)程除了用“道德”譴責(zé)它,也沒有其他的辦法了。

  2.linux進(jìn)程調(diào)度

  linux最初的進(jìn)程調(diào)度程序是非常原始的,很難適應(yīng)一些眾多的可運(yùn)行進(jìn)程和多處理器環(huán)境。后來從linux2.5開始,對linux的進(jìn)程調(diào)度程序做了大的調(diào)整,使用了稱為O(1)的調(diào)度算法,這個算法引起算法行為而得名。O(1)調(diào)度算法雖然在數(shù)以十計的多處理器上能表現(xiàn)出近乎完美的特性和可擴(kuò)展性,但是由于這個算法在調(diào)度交互進(jìn)程的時候并沒有表現(xiàn)出很理想的效果。所以在linux2.6的開發(fā)初期,提出了CFS算法,即完全公平調(diào)度算法。

  3.策略

  (1)IO消耗型進(jìn)程和處理器消耗型進(jìn)程

  IO消耗型進(jìn)程指的是進(jìn)程的大部分時間是用來等待IO的操作,例如圖形用戶界面(GUI)程序就屬于IO消耗型程序,這個程序需要不斷的監(jiān)聽來自用戶的輸入。這樣的進(jìn)程經(jīng)常處于可運(yùn)行的狀態(tài),但是每次運(yùn)行的時間都很短。

  處理器消耗型進(jìn)程是指進(jìn)程的大部分時間用在執(zhí)行代碼上,比如大型的計算程序MATLAB就屬于處理器消耗型進(jìn)程。

  還有一些應(yīng)用程序雖然劃分為IO消耗型進(jìn)程,但是也有處理器消耗型進(jìn)程的特征。例如,字處理程序,在大多數(shù)時間可能等待來自用戶的輸入,但是在某段時間該程序又可能粘住處理器瘋狂的進(jìn)行語法和拼寫錯誤的檢查。

  調(diào)度程序需要在兩個矛盾目標(biāo)中尋找平衡————進(jìn)程的迅速響應(yīng)和高吞吐量。unix和linux為了獲得良好的用戶響應(yīng),因此都傾向于調(diào)度IO消耗型進(jìn)程。

  (2)進(jìn)程優(yōu)先級

  調(diào)度算法中最基本的一種就是基于進(jìn)程優(yōu)先級的調(diào)度,這是一種根據(jù)進(jìn)程的價值和其對處理器的時間需求來對進(jìn)程分級的一種想法。通常的做法是優(yōu)先級高的進(jìn)程先執(zhí)行,低的后運(yùn)行,相同優(yōu)先級的進(jìn)程按輪轉(zhuǎn)方式進(jìn)行調(diào)度(一個接一個,重復(fù)進(jìn)行)。在某些操作系統(tǒng)中,優(yōu)先級高的進(jìn)程的使用的時間片也長一些。調(diào)度程序總是選擇優(yōu)先級高的,并且時間片尚未用盡的進(jìn)程。

  linux系統(tǒng)采用了兩種不同類別的優(yōu)先級,第一種是使用nice值,范圍是從-20到+19,值越大表示優(yōu)先級越低。這個優(yōu)先級適用于一般的進(jìn)程。

  另外,linux對實(shí)時進(jìn)程采用實(shí)時優(yōu)先級,值從0-99,值越大代表優(yōu)先級越高。實(shí)時進(jìn)程的優(yōu)先級都高于普通進(jìn)程,因此這兩個進(jìn)程優(yōu)先級是處于兩個互不相交的范圍內(nèi)。

  (3)時間片

  時間片是一個數(shù)值,他表示進(jìn)程在被搶占前能夠持續(xù)運(yùn)行的時間。時間片過長會導(dǎo)致系統(tǒng)對交互的響應(yīng)表現(xiàn)欠佳,時間片過短,卻又明顯增大進(jìn)程切換帶來的處理器時間消耗。所以IO消耗型進(jìn)程和處理器消耗型進(jìn)程的矛盾在這里又再次顯現(xiàn)出來,IO消耗型進(jìn)程不需要長的時間片,而處理器消耗型進(jìn)程則希望時間片越長越好。

  長時間片將導(dǎo)致系統(tǒng)的交互性表現(xiàn)欠佳,很多的操作系統(tǒng)都很重視這一點(diǎn),因此將時間片設(shè)置的很短,如10ms。但是linux的CFS調(diào)度算法并沒有直接分配時間片到進(jìn)程,它是將處理器的使用比分給了進(jìn)程,這樣進(jìn)程獲得的處理器的時間是和系統(tǒng)負(fù)載密切相關(guān)的。這個比例還會受到nice值的影響,nice值作為權(quán)重將調(diào)整進(jìn)程使用處理器時間的使用比。具有更高nice值(低優(yōu)先級)的進(jìn)程將被賦予低權(quán)重,從而喪失一小部分處理器的使用比,而具有低nice值(高優(yōu)先級)的進(jìn)程江北賦予高權(quán)重,從而獲得更多的處理器使用比。