代碼邏輯比較簡單:
1、確定就緒隊(duì)列的當(dāng)前執(zhí)行的調(diào)度實(shí)體
/* 確定就緒隊(duì)列的當(dāng)前執(zhí)行進(jìn)程curr */
struct sched_entity *curr = cfs_rq- >curr;
2、根據(jù)獲取的當(dāng)前執(zhí)行進(jìn)程,計(jì)算當(dāng)前和上一次更新負(fù)荷權(quán)重時(shí)兩次的時(shí)間的差值
u64 now = rq_clock_task(rq_of(cfs_rq));
u64 delta_exec;
if (unlikely(!curr))
return;
delta_exec = now - curr- >exec_start;
if (unlikely((s64)delta_exec <= 0))
return;
3、重新更新啟動時(shí)間exec_start為now,以備下次計(jì)算時(shí)使用,最后將計(jì)算出的時(shí)間差加到先前的統(tǒng)計(jì)時(shí)間上。
/* 重新更新啟動時(shí)間exec_start為now */
curr- >exec_start = now;
schedstat_set(curr- >statistics.exec_max,
max(delta_exec, curr- >statistics.exec_max));
/* 將時(shí)間差加到先前統(tǒng)計(jì)的時(shí)間即可 */
curr- >sum_exec_runtime += delta_exec;
schedstat_add(cfs_rq, exec_clock, delta_exec);
這也是通過cat /proc/$pid/sched看到的一些統(tǒng)計(jì)信息
4、開始計(jì)算虛擬時(shí)間
curr- >vruntime += calc_delta_fair(delta_exec, curr);
5、計(jì)算虛擬時(shí)間函數(shù)calc_delta_fair如下,忽略舍入和溢出檢查,calc_delta_fair函數(shù)所做的計(jì)算如下:
/*
* delta /= w
*/
static inline u64 calc_delta_fair(u64 delta, struct sched_entity *se)
{
if (unlikely(se- >load.weight != NICE_0_LOAD))
delta = __calc_delta(delta, NICE_0_LOAD, &se- >load);
return delta;
}
其中NICE_0_LOAD的值為:1024,當(dāng)進(jìn)程的nice=0時(shí),不需要進(jìn)行加權(quán)處理,其虛擬時(shí)間就等于其實(shí)際運(yùn)行時(shí)間。
# define SCHED_FIXEDPOINT_SHIFT 10
#define NICE_0_LOAD_SHIFT (SCHED_FIXEDPOINT_SHIFT)
#define NICE_0_LOAD (1L < < NICE_0_LOAD_SHIFT)
?1024也就是Nice值為0對應(yīng)的權(quán)重值,權(quán)重值在內(nèi)核中是預(yù)先定義好的,如下所示:
const int sched_prio_to_weight[40] = {
/* -20 */ 88761, 71755, 56483, 46273, 36291,
/* -15 */ 29154, 23254, 18705, 14949, 11916,
/* -10 */ 9548, 7620, 6100, 4904, 3906,
/* -5 */ 3121, 2501, 1991, 1586, 1277,
/* 0 */ 1024, 820, 655, 526, 423,
/* 5 */ 335, 272, 215, 172, 137,
/* 10 */ 110, 87, 70, 56, 45,
/* 15 */ 36, 29, 23, 18, 15,
};
通過公式和內(nèi)核預(yù)先設(shè)定的權(quán)重表,可以看出來:
Nice值越高(對應(yīng)的優(yōu)先級越低),權(quán)重越小,虛擬時(shí)間累加的越快(虛擬時(shí)間過得越快),Nice值越低(對應(yīng)的優(yōu)先級越高),權(quán)值越高,虛擬時(shí)間累加的越慢(虛擬時(shí)間過得越慢)。CFS的思想核心也就是這樣,讓每個(gè)調(diào)度實(shí)體的虛擬時(shí)間增加速度不同,使用虛擬時(shí)間來衡量調(diào)度實(shí)體在CPU上已經(jīng)執(zhí)行的時(shí)間。
總結(jié):
不同優(yōu)先級的進(jìn)程以各自對應(yīng)的速度推進(jìn)虛擬時(shí)間,只要保證在一個(gè)調(diào)度延遲內(nèi)虛擬時(shí)間的推進(jìn)進(jìn)展相同,就實(shí)現(xiàn)了完成公平,公平指的是相對公平,即按進(jìn)程的權(quán)重給予不同的運(yùn)行時(shí)間,虛擬時(shí)間越小,代表著受到了"不公平"對待,因此下一個(gè)參與調(diào)度的調(diào)度實(shí)體就是紅黑樹中的最左邊(虛擬時(shí)間最小)的節(jié)點(diǎn),如此一來既能公平選擇進(jìn)程,又能保證高權(quán)重進(jìn)程獲得較多的運(yùn)行時(shí)間。
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209326 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68521
發(fā)布評論請先 登錄
相關(guān)推薦
評論