Linux的進程優先級(5)

發表于:2016-05-10來源:測試窩作者:鄒立巍點擊數: 標簽:linux
當進程從中斷、異?;蛳到y調用返回時,會發生調度檢查。比如時鐘中斷。 CFS的優先級 當然,CFS中還需要支持優先級。在新的體系中,優先級是以時間消

  當進程從中斷、異?;蛳到y調用返回時,會發生調度檢查。比如時鐘中斷。

  CFS的優先級

  當然,CFS中還需要支持優先級。在新的體系中,優先級是以時間消耗(vruntime增長)的快慢來決定的。就是說,對于CFS來說,衡量的時間累積的絕對值都是一樣紀錄在vruntime中的,但是不同優先級的進程時間增長的比率是不同的,高優先級進程時間增長的慢,低優先級時間增長的快。比如,優先級為19的進程,實際占用cpu為1秒,那么在vruntime中就記錄1s。但是如果是-20優先級的進程,那么它很可能實際占CPU用10s,在vruntime中才會紀錄1s。CFS真實實現的不同nice值的cpu消耗時間比例在內核中是按照“每差一級cpu占用時間差10%左右”這個原則來設定的。這里的大概意思是說,如果有兩個nice值為0的進程同時占用cpu,那么它們應該每人占50%的cpu,如果將其中一個進程的nice值調整為1的話,那么此時應保證優先級高的進程比低的多占用10%的cpu,就是nice值為0的占55%,nice值為1的占45%。那么它們占用cpu時間的比例為55:45。這個值的比例約為1.25。就是說,相鄰的兩個nice值之間的cpu占用時間比例的差別應該大約為1.25。根據這個原則,內核對40個nice值做了時間計算比例的對應關系,它在內核中以一個數組存在:

  我們看到,實際上nice值的最高優先級和最低優先級的時間比例差距還是很大的,絕不僅僅是例子中的十倍。由此我們也可以推導出每一個nice值級別計算vruntime的公式為:

  這個公式的意思是說,在nice值為0的時候(對應的比例值為1024),計算這個進程vruntime的實際增長時間值(delta vruntime)為:CPU占用時間(delta Time)* 1024 / load。在這個公式中load代表當前sched_entity的值,其實就可以理解為需要調度的進程(R狀態進程)個數。load越大,那么每個進程所能分到的時間就越少。CPU調度是內核中會頻繁進行處理的一個時間,于是上面的delta vruntime的運算會被頻繁計算。除法運算會占用更多的cpu時間,所以內核編程中的一個原則就是,盡可能的不用除法。內核中要用除法的地方,基本都用乘法和位移運算來代替,所以上面這個公式就會變成:

  內核中為了方便不同nice值的Inverse(load)的相關計算,對做好了一個跟prio_to_weight數組一一對應的數組,在計算中可以直接拿來使用,減少計算時的CPU消耗:

  具體計算細節不在這里細解釋了,有興趣的可以自行閱讀代碼:kernel/shced/fair.c(Linux 4.4)中的__calc_delta()函數實現。

  根據CFS的特性,我們知道調度器總是選擇vruntime最小的進程進行調度。那么如果有兩個進程的初始化vruntime時間一樣時,一個進程被選擇進行調度處理,那么只要一進行處理,它的vruntime時間就會大于另一個進程,CFS難道要馬上換另一個進程處理么?出于減少頻繁切換進程所帶來的成本考慮,顯然并不應該這樣。CFS設計了一個sched_min_granularity_ns參數,用來設定進程被調度執行之后的最小CPU占用時間。

  一個進程被調度執行后至少要被執行這么長時間才會發生調度切換。

  我們知道無論到少個進程要執行,它們都有一個預期延遲時間,即:sched_latency_ns,系統中可以通過如下命令來查看這個時間:

  在這種情況下,如果需要調度的進程個數為n,那么平均每個進程占用的CPU時間為sched_latency_ns/n。顯然,每個進程實際占用的CPU時間會因為n的增大而減小。但是實現上不可能讓它無限的變小,所以sched_min_granularity_ns的值也限定了每個進程可以獲得的執行時間周期的最小值。當進程很多,導致使用了sched_min_granularity_ns作為最小調度周期時,對應的調度延時也就不在遵循sched_latency_ns的限制,而是以實際的需要調度的進程個數n * sched_min_granularity_ns進行計算。當然,我們也可以把這理解為CFS的”時間片”,不過我們還是要強調,CFS是沒有跟O1類似的“時間片“的概念的,具體區別大家可以自己琢磨一下。

原文轉自:http://www.testwo.com/article/659

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97