cfs不再有時間片的概念,他維護的是每個程序執行的時間記賬
使用排程器實體結構來追蹤程序執行記賬:
無數統計變數… …,但是演算法核心就是圍繞vruntime設計。
排程器實體,作為程序的乙個名為se的成員變數。
cfs使用vruntime變數來記錄乙個程式到底執行了多長時間以及他要應該執行多久。
中,up_date_curr()實現這個功能。
update_curr()由系統定時器週期性呼叫,使得vruntime可以精準測量給定程序的執行時間。
delta_exec 執行時間,然後根據當前可執行程序總數隊執行時間進行加權計算。
__update_curr()
rb_leftmost儲存當前最小的vruntime。無需在紅黑樹上進行查詢。
在程序變為可執行狀態(被喚醒)或者fork()建立程序時,enqueue_entity()實現這個步驟。
先更新當前任務的執行時間和其他統計資料。
然後__enqueue_entity() 進行紅黑樹插入操作。
當程序阻塞,或者終止時:dequeuer_entity
同理先更新實時統計資料,然後在程序紅黑樹中刪除。
排程器入口函式schedule(),
以優先順序為序,從高到低,一次檢視每乙個排程類。其中,pick_next_task(),實現會呼叫pick_next_entity()。
當不願意被執行的程序(進行檔案i/0操作)進入睡眠狀態。
新增睡眠等待佇列。
喚醒:wake_up()呼叫try_to_wake_up()。
參考於wikipedia
cfs主要由sched_entity 內含的 vruntime所決定,不再跟蹤process的sleep time,並揚棄active/expire的概念, runqueue裡面所有的程序都平等對待,cfs使用「虛擬執行時」(virtual running time)來表示某個任務的時間量。
cfs改使用紅黑樹演算法,將執行時間越少的工作(即 sched_entity)排列在紅黑樹的左邊[3]
,時間複雜度是o(log n),節點(即rb_node)的安插工作則由dequeue_entity()和enqueue_entity()來完成。當前執行的task通過呼叫 put_prev_task 返回紅黑樹,下乙個待執行的task則由pick_next_task來呼叫。蒙內表示, cfs在百分之八十時間都在確實模擬處理器的處理時間。
linux核心分析之排程演算法 CFS排程分析
前面對linux排程演算法的框架進行了介紹,在這裡對cfs 完全公平排程 演算法進行分析。cfs允許每個程序執行一段時間 迴圈輪轉 選擇執行最少的程序作為下乙個執行程序,而不再採用分配給每個程序時間片的做法了,cfs在所有可執行程序總數基礎上計算出乙個程序應該執行多久,而不是依靠nice值來計算時間...
inux核心 CFS程序排程器
現代作業系統設計的目的在於管理底層硬體資源並使整個計算機系統執行效能達到最優。我們可以發現實現這一目的的方法可以歸結為兩點 cpu虛擬化和記憶體虛擬化。現代作業系統一般都能提供多工執行環境,每個程序都可以擁有自己的虛擬cpu,程序在執行過程中感覺自己是獨佔cpu。類似地,記憶體虛擬化是通過讓每個程序...
Linux核心 CFS 完全公平排程演算法
1.cfs的原理 cfs給每乙個程序安排乙個虛擬執行時鐘vruntime,當乙個程序得以執行,隨著時間的推移,vruntime的值不斷的增大。而沒有執行的程序的vruntime的是不會改變的。而排程器總是選擇程序佇列中vrutime最小的程序執行,這就體現了 完全公平性 那如何區分不同程序之間的優先...