linux調度器概觀

由來

想問問你,想找個什麼樣的對象?假如有一大波妹子,讓你在其中選一個做女朋友,你會怎麼選?這種情況對於理工科的男生是不存在的,聽到那些外國語大學的男生們說看到學校裏倆男生一起去吃飯都不正常,我就憤怒了要。好了還是假如,你會選個什麼樣的,白富美,然後氣質再好一點,最好會什麼樂器,會唱歌,然後身材在好一點,這樣的,不知道你滿意了嗎?如果有,就要了吧。一開始選擇的時候,我們可能會把每個妹子都看一遍,然後再做決定選哪個交往,還一邊向小夥伴們炫耀一下,慢慢的妹子多了感覺有點吃不消了,把每個妹子看一遍,可能就夠談一次戀愛的時間了,所以決定把她們分一下等級,身高160以下,就不考慮了,不白的也不考慮了,然後就從最白最高裏面選一個;突然想到了國民老公王思聰,他該怎麼選女朋友,最白最高裏面都不計其數了,怎麼再細分啊?

當然都是想象,我等屌絲怎麼遇到一波妹子,但是CPU會啊。

CPU這貨真的會啊,一大波進程都跑過來,跟它說,i want you,這輩子缺愛的小夥伴,下輩子可以考慮去投胎做個CPU,一開始CPU也是把一波進程都看一遍,看誰的優先級搞就選擇哪一個,這是第一代O(n)。

      然而進程越來越多,看一遍的時間,都夠把幾個進程處理完了,所以就分出了140等級(0最高,139最低),把有跑來要運行的進程都掛在這些0到139的隊列裏,然後就可以從0的隊列裏找,如果0沒有就1隊列裏找,這是第二代O(1),這個算法的是Ingo Molnar寫的,請記住這個牛人的名字,因爲在不久的將來,你會再次看到這個人的名字。

也許在我們凡人看來,這樣的選擇方法已經很好了,但是卻有一個致命的缺點,就是沒把副校長跟校長分開來,進程多了以後,可能有200個,校長級本來都是0級的了,CPU就從0級了選了個來的早的,一不小心讓副校長先運行,這樣是不合適的,所以這個缺點就是分的粒度不夠,進程多了以後就不好用了。於是這位牛人Ingo Molnar,把前面辛辛苦苦寫的算法,推倒了寫出了一種全新的算法,解決了這個粒度不夠的問題。一直用到現在linux4.0.1。這種放棄原有的所擁有的一切,而重新構造一種新的世界。這種勇氣是我們應該學習的。

總結一下:

第一代O(n),從第一個找到最後一個看哪個優先級高;

第二代O(1),把優先級分成一百四十個等級,然後從最高的開始找,然而,進程多了以後,粒度不夠細,把副教授跟正教授分到了一塊;

第三代O(LgN),很牛,引入虛擬運行時間的概念,經本人剛剛查證,從Linux2.6.23(kernel/sched.c)到Linux4.0.1(linux-4.0.1\kernel\sched\fair.c)也就是現在都在用。

插入幾個小的知識點:

goto通常被老師告訴說,一般情況不要使用,甚至有的書裏都不對這個做介紹了,但在調度器裏,內核使用goto語句,可以生成最優的彙編代碼。


下期準備把第三代剖析下。

參考資料:

和朋友吹牛B的一些想法

Linux 調度器發展簡述http://www.ibm.com/developerworks/cn/linux/l-cn-scheduler/

深入linux內核架構

深入理解linux內核

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