调度器的精髓--优先级下兼顾公平
現(xiàn)在回讀linux的調(diào)度器,O(1)調(diào)度器簡(jiǎn)直就是一個(gè)過(guò)渡,2.4之前的O(n)調(diào)度器曾經(jīng)和cfs調(diào)度器是多么的接近啊!我們不應(yīng)該只把眼光注意在O(X)的括號(hào)內(nèi),要知道這個(gè)括號(hào)內(nèi)的數(shù)字并不能說(shuō)明這個(gè)調(diào)度器的優(yōu)劣,它僅僅是調(diào)度行為中的一環(huán)而已,是一個(gè)理想化的基本原則,正如80/20原則所言,真正為了修復(fù)這個(gè)理想情況中所有的不理想因素所花費(fèi)的時(shí)間和空間要大得多,所以cfs調(diào)度器便拋棄了以前的命名法,難道它還能比O(1)命名法括號(hào)內(nèi)的數(shù)字更小嗎?顯然不能!
O(n)調(diào)度器下,只有運(yùn)行隊(duì)列中再?zèng)]有進(jìn)程的時(shí)候才會(huì)重新計(jì)算所有已經(jīng)被剝奪運(yùn)行進(jìn)程的時(shí)間片,睡眠中的進(jìn)程并沒(méi)有得到特別的照顧,因?yàn)樗鼈冊(cè)谶€沒(méi)有耗盡時(shí)間片的時(shí)候就被剝奪了運(yùn)行機(jī)會(huì),因此其時(shí)間片可以被累加,這樣的話,一旦運(yùn)行隊(duì)列中沒(méi)有進(jìn)程了,實(shí)際上還有一些進(jìn)程在睡眠,比如IO進(jìn)程,比如交互進(jìn)程。這個(gè)調(diào)度器和cfs調(diào)度器是多么得相似,只是缺少了:1.pick-next的高效算法;2.多處理器獨(dú)立隊(duì)列;...要知道算法的效率直接來(lái)源于數(shù)據(jù)結(jié)構(gòu)而不是思想,另外向多處理器的擴(kuò)展本身就是一個(gè)擴(kuò)展,也不能否定調(diào)度器的設(shè)計(jì)思想。很多人都對(duì)O(1)調(diào)度器情有獨(dú)鐘,拋開(kāi)宣傳因素不講,其本身也算是帶來(lái)了兩三年的高效率,然而我個(gè)人在接觸了cfs調(diào)度器之后卻總是對(duì)O(1)調(diào)度器不甚看好,看看其設(shè)計(jì)是多么的復(fù)雜吧,有多少行代碼浪費(fèi)在計(jì)算動(dòng)態(tài)優(yōu)先級(jí)上,而計(jì)算動(dòng)態(tài)優(yōu)先級(jí)本身就要涉及到睡眠時(shí)間,一個(gè)運(yùn)行隊(duì)列分裂為兩個(gè)數(shù)組本身僅僅對(duì)于pick-next算法有利,為了這點(diǎn)微薄的利益,再看看饑餓避免算法吧...暴露在proc文件系統(tǒng)中的眾多調(diào)度器微調(diào)開(kāi)關(guān)真的迷惑了很多年輕的程序員,當(dāng)然也包括我自己。到頭來(lái)發(fā)現(xiàn),真的不需要這么多的開(kāi)關(guān),cfs調(diào)度器實(shí)際上就是在O(n)調(diào)度器上進(jìn)行了兩點(diǎn)修改,一個(gè)是將數(shù)組變成了紅黑樹(shù),另一個(gè)就是支持了每cpu一棵樹(shù),分級(jí)調(diào)度暫且不考慮。如果說(shuō)cfs是一個(gè)去偽存真的調(diào)度器的話,它更多的是去除了O(1)的偽而保留了O(1)的真諦!雖然O(1)調(diào)度器和cfs調(diào)度器的設(shè)計(jì)者是一個(gè)人,我寧愿相信他在O(1)中繞了一大圈后回歸了原點(diǎn)。如果說(shuō)O(n)調(diào)度器的時(shí)間大多浪費(fèi)在pick-next,那么O(1)調(diào)度器確實(shí)可以迷惑很多人,因?yàn)檎{(diào)度器的命名法,很多人都以為調(diào)度器的工作就是pick-next。
去了華為面試,面試官看了我的簡(jiǎn)歷,以調(diào)度器為題目企圖難為一個(gè)叫趙亞的大專生,茲以上文駁斥,遂無(wú)言,歸,不語(yǔ)!
轉(zhuǎn)載于:https://blog.51cto.com/dog250/1274132
總結(jié)
以上是生活随笔為你收集整理的调度器的精髓--优先级下兼顾公平的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Hyper-V P2V转换遇到的问题
- 下一篇: C#字符串及数组操作