調度:比例份額

操作系統有一個非常有趣的調度程序,比例份額調度(proportional-share),也被稱爲公平份額調度(fair-share)。比例份額基於一個簡單的想法:調度程序的最終目標,就是爲了給每一個進程獲得一定比例的CPU使用時間,而不考慮週轉時間與響應時間。比例份額調度有一個很優秀的例子,由Waldspurger和Weihl提出的彩票調度,顧名思義,就是讓進程像彩票一樣分配佔用時間,哪個進程中獎就能獲得更多的佔用CPU時間,更越活越的進程,也就得到更多的抽獎機會。

首先,彩票調度中彩票數代表進程佔用資源的比例。將整個CPU的所有使用時間定義爲100,對所有當前操作系統中的進程進行抽獎,假如有兩個進程,那麼先抽一次獎,簡單理解就可以認爲是隨機得到一個0-100的隨機數,得到的數字就是第一個進程所可以佔用CPU的時間份額,第二個進程可佔用的份額即爲100減去第一個的份額;當有更多的進程數時,只需要進行更多次的抽獎。這個算法最精彩的地方在於其決定性完全來自於隨機,只要你的隨機數算法夠真實,那麼得到的結果也就是完全不可預測的。不可預測就可以爲開發者帶來很多好處,首先是避免了關於算法分配的很多問題,例如時間片輪轉的時間片大小問題;然後完全隨機的調度只需要記錄進程的很少一些狀態,因爲不需要根據進程的運行時間、優先級、到達時間等等考慮後續的時間片分配,只需要爲每個進程記錄一個某一時刻屬於它的比例份額即可。最後隨機方法很快,因爲整個調度算法所需要計算的部分只是生成多個隨機數,相對於那些爲了追求公平而複雜很多的算法,速度上會有很大的提升。

上面是我用隨機數隨機生成的10次比例份額,當然真正的彩票調度算法不可能使用srand這種僞隨機。。。。

假設此時操作系統中有兩個進程A和B,分別具有的彩票數爲75與25,A爲0-74,B爲75-99,那麼按照上面的隨機數來看,執行順序爲: A  A  B  A  B  A  B  A  A  A ;

A佔用的比例是70%,與他的彩票數份額大致相似,當然這種分配時間越長這個比例也就越接近他的票數份額。

作爲一個操作系統的調度算法,如果只是這樣那麼也沒什麼值得學習的了,彩票調度自然還有其獨有的機制。一種方式是實現彩票貨幣(ticket currency)的概念。貨幣自然是用來交易的,也就是說允許進程將自己擁有的彩票,也就是時間份額按照其自有的分配方式分配給自己的各部分工作,然後再由操作系統將交易的份額轉換爲真正的資源佔用時間。另外既然進程中的工作之間可以重分配彩票貨幣,那麼不同進程自然也可以,也就是彩票轉讓機制(ticket transfer),通過轉讓,允許一個進程臨時將自己的時間份額交給另一個進程。這種機制在C/S交互時極爲有用,例如當客戶端向服務器發送消息要求其執行某些工作時,爲了加速執行,客戶端可以將自己的彩票轉讓給服務器,當服務器執行完客戶端所需要的操作後,在將得到的臨時彩票返還給客戶端,這樣可以有效的轉化客戶端等待時的CPU佔用效率。最後,還有彩票通脹機制(ticket inflation),利用通脹,一個進程可以臨時提升或降低自己的彩票數量,當然這種行爲如果控制不好就會是個極大的問題,因爲肯定會有一些惡意進程想要無限的佔用CPU。

那麼又遇到了與當初時間片輪轉算法類似的問題,彩票數該如何分配?

時間片好歹還有時鐘中斷可以作爲基準,那麼彩票數該如何分配?很遺憾這個問題沒有標準答案,也因爲彩票算法並沒有在操作系統中被大規模應用,所以我也沒法給出一個合適的建議。當然彩票算法沒有被大規模應用可能就是因爲這個問題沒能找到一個令大部分人滿意的答案。。。所以這個問題只能你自己去思考了。

另外雖然彩票算法的隨機性提供了一個簡單的(並且近似正確的)調度器,但它偶爾也不會提供精確的比例,尤其是在短時間內。由於這個原因,Waldspurger提出了步長調度(stride scheduling)。步長調度也很簡單,系統中的每一個進程都有一個步長,步長與它所擁有的彩票數量成反比。例如此時擁有三個進程ABC,,分別有100、50和250張彩票。可以用一個很大的數字分別除以他們的票數來獲得每個進程的步長。例如,將這個大數設置爲10,000,可以得到A、B和C的步長爲100、200和40。這個值就是每一個過程的步長,每次進程運行時,會讓它的計數器(行程,pass)值增加它的步長,來記錄它的總體進展。

例如上面的三個進程從頭開始運行,其步長分別爲100、200和40,所有這些進程的初始行程爲0。因此,假設從0時刻A先開始運行,完成時間片後,將其行程更新爲100。然後運行B,它的行程被設置爲200。最後運行C,其傳遞值增加到40。此時,算法將選擇最低行程的進程,即C,運行它,更新它的傳遞到80。然後C將再次運行,因爲此時仍然是C具有最低的行程,將其傳遞到120。於是A將被運行,更新到200,此時A等於B,然後C又將運行兩次,更新到200。這時,所有的進程行程都是相等的,就又會開始重複從0開始的進程調度操作,一直無限執行下去。從第一階段可以看出,C運行了5次,A兩次,B一次,剛好與它們的彩票數250,100,和50對應,這表明彩票調度隨着時間的推移達到了概率的比例,在每一個調度週期的末尾,步長調度完全正確。

 

最後,想一想爲什麼彩票調度沒有被大規模的應用在操作系統上。一是因爲彩票分配算法沒有一個令人滿意的實現,二是彩票調度對具有I/O的情況還無法很好的適應。所以現在的彩票調度算法只在某些領域被應用,例如虛擬機,具體實現請參閱文章“Memory Resource Management in VMware ESX Server”,瞭解如何在VMWare ESX服務器中按比例共享內存。

 

 

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