linux調度器_第三代cfs(1)_引入

不計其數的妹子又來了,真是煩惱啊,該怎麼辦,讓我很快就選擇一個最好的妹子呢?

爲什麼要從第三代開始呢?不應該是從簡單的先來嗎?我是想着有些朋友可能就想學習最新的,就像大家都搶着買最新款的手機一樣,據說九月份iphone7要出了。

讓CFS這種算法來吧,核心思想就是完全公平,這種思想也算是打破之前的一種觀念。以前的時候,大家會把進程分爲交互式進程,實時進程,以及一般的進程,交互進程就是想我們這樣打字,鼠標點點這樣的,我們不能讓用戶等待,點一下鼠標,半天沒動靜,人可受不了,就算你再吹噓你電腦配置怎麼怎麼好,幾G的內存,多少的主頻,甚至還是多核的,但對於普通用戶來說,這電腦“卡”,不要。爲了滿足用戶體驗,所以交互式進程一般都會特殊對待,就像是拿了張特權證書一樣,更別說實時進程了,實時進程就像飛飛機一樣,你點下右轉,它立馬就得轉,你敢卡下,那估計又有多少墜機了。那既然分了這麼多種,讀者,你記下了幾種類型的進程?都記住了?算你厲害。一個都沒記住?這就對了,你可以去跟張三丰學習學習太極拳。所以對於內核來說,也迫切希望,別讓我記那麼多東西,我又要拉出這位算法的作者了Ingo Molnar。搞出了一種完全公平的算法,就是把所有進程都排到一個隊列裏,你們誰把其他所有進程都幹過了誰排前面,簡言之就是,you can,you up。

在這個算法裏,引入了一種虛擬運行時間的概念,還會涉及到紅黑樹,也就是數據結構 中的樹那一塊的知識,如果你不懂,可以去查點資料,或者乾脆把它就當成一個有序的隊列,小的拍前面大的拍後面。然後CPU一下就可以從這個紅黑樹(O(lgN))裏選擇一個進程開始執行了。

對於這種程序的大概流程,不知道,你們有點概念了嗎?如果有的話,我就要開始上代碼了。要是沒有,就想着把所有進程扔一個隊列裏,然後他們自己排個序,每次我選擇最小的開始執行,這樣理解也可以。

我認爲一種正常的邏輯是,我餓了,所以就去找吃的。需要什麼,找什麼。然而好多書,都是列出一大堆吃的,然後讓用戶自己去找,也許後來會發現或許作者有先見之名,但這對於初學者來說,是不合適的,過多的引入一些信息,往往會讓學習的人沒了思路,不知道哪是芝麻,哪是西瓜。所以,接下來行文都會以這種方式,需要什麼,找什麼。


上代碼

第一件事,如何幹掉其他進程,或者說是,你憑什麼排在前面?對於算法來說就是,你是怎麼計算的,讓這個進程排前面。以下代碼來自linux_2.6.24。來看看怎麼計算的,答案是以實體鍵值排序的。問題來了:什麼事實體鍵。

//kernel\sched_fair.c 138行

static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se) 
{
return se->vruntime - cfs_rq->min_vruntime;
}

哎,真遺憾,源碼中竟然沒有英文註釋,想吹下牛,show下英文都沒給機會,別緊張我是英文剛過四級的小渣渣。好吧從名字開始entity_key實體鍵值的意思,因爲調度不僅僅可以調度進程,有時候可以是進程組等其他的,我們在這裏就把它當成是進程吧,se->vruntime就是虛擬運行時間,v=virtual虛擬的,se代表sched_entity,後面一個是cfs_rq->min_vruntime,即完全公平調度_就緒隊列_最小_虛擬運行時間。簡言之,就是虛擬運行時間減去最小虛擬運行時間。

感覺這篇引入就寫到這裏吧,畢竟一上來就擺大段的代碼,會懵B的,讓我們把開始的學習的曲線搞的平滑點,前奏做的更好點。

總結

這篇就說了一件事,完全公平調度把所有就緒進程不分什麼實時進程,交互進程,等一股腦的扔到一個叫紅黑樹的結構裏(紅黑樹本來就是有序的,後面說有序隊列就是紅黑樹,是爲了理解所有說成有序隊列),然後進程依據鍵值大小,排了一個隊,鍵值越小,就CPU”運行“它的時間越小,所以爲了公平,CPU就優先運行鍵值小的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章