linux原始碼學習 1(CFS)

2021-08-19 06:23:10 字數 3516 閱讀 2843

這兩天心血來潮,打算讀一波linux原始碼,不過當然有可能是三分鐘熱度,能讀多少就看造化吧。

linux 核心版本v2.6.39.4

第一篇文章,我也不打算按順序寫,到時候如果寫多了再整理。

1193行到1543行。太多了,只把我覺得比較關鍵的地方標註了出來。

struct task_struct 

;

然後我想談的就是cfs了。。。(完全公平的排程程式)

completely fair scheduling

一些參考:借鑑了很多

cfs使用一種名為 「sleeper fairness」 的概念,該概念考慮睡眠或等待任務等同於 執行佇列 上的任務。這意味著大部分時間等待使用者輸入或其他事件的互動式任務在需要時可以獲得相當的cpu時間份額。

struct sched_entity ;
cfs排程演算法的思想:理想狀態下每個程序都能獲得相同的時間片,並且同時執行在cpu上,但實際上乙個cpu同一時刻執行的程序只能有乙個。也就是說,當乙個程序占用cpu時,其他程序就必須等待。cfs為了實現公平,必須懲罰當前正在執行的程序,以使那些正在等待的程序下次被排程。

虛擬時鐘可以根據現存的實際時鐘和每個程序相關的負荷權重推算出來。

權重越高,說明程序的優先順序比較高,進而該程序虛擬時鐘增長的就慢。

vruntime通過呼叫update_curr更新。

當排程程式被呼叫來執行乙個新的程序時,排程程式的操作如下:

1. 排程樹的最左邊的節點被選中(因為它具有最低的花費執行時間),並被傳送用於執行。

2. 如果程序完成執行,它將從系統和排程樹中刪除。

3. 如果程序達到最大執行時間或以其他方式停止(自動或通過中斷),則基於其新的執行時間將其重新插入排程樹。

4. 然後從樹中選擇新的最左邊的節點,重複迭代。

—–2018-05-17更新

(注:假設讀者已經通曉紅黑樹,參考

cfs 排程(參考《深入linux核心架構》)

sched_class 定義於 4237-4271行。

cfs_rq 定義於 309-373行。

struct cfs_rq ;

cfs排程完全依賴於虛擬時鐘,即通過負荷權重和實際執行權重推導出來的乙個值。

相關計算於update_curr中執行

update_curr 定義於573-601行,__update_curr 定義於 553-571行。

}關於虛擬時鐘的計算,通過物理時間和負荷權重得出,而負荷權重與程序優先順序有關。運算過程委託給 __update_curr函式。

注:越重要的程序會有越高的優先順序(即 越低的nice值,),會得到更大的權重,因此累加的虛擬執行時間會小一些。

/* 定義於sched_fair.c 477-484行

* delta /= w

*/static

inline

unsigned

long

calc_delta_fair(unsigned

long delta, struct sched_entity *se)

/* 定義於sched_fair.c 1304-1329行

* delta *= weight / lw

* 運算過程**中很清楚,就不寫了。

*/static

unsigned

long

calc_delta_mine(unsigned

long delta_exec, unsigned

long weight,

struct load_weight *lw)

tmp = (u64)delta_exec * weight;

/** check whether we'd overflow the 64-bit multiplication:

*/if (unlikely(tmp > wmult_const))

tmp = srr(srr(tmp, wmult_shift/2) * lw->inv_weight,

wmult_shift/2);

else

tmp = srr(tmp * lw->inv_weight, wmult_shift);

return (unsigned

long)min(tmp, (u64)(unsigned

long)long_max);

}//定義於sched_fair.c 342-361行

static

void update_min_vruntime(struct cfs_rq *cfs_rq)

cfs_rq->min_vruntime = max_vruntime(cfs_rq->min_vruntime, vruntime); //保證遞增

}上文最後乙個函式 update_min_vruntime,做了一些操作,以保證 min_vruntime 是單調遞增的

(下面和書上有些出入,原文為 first_fair函式,原因是書中核心版本為v2.6.24)

檢測rb樹上最左端結點,即檢測是否有程序在樹上等待排程。再和當前執行實體(running entity) 取最小值。最後,取max保證 min_vruntime 遞增。

spring 原始碼學習 1

1.spring 是乙個非侵入性 non invasive 框架,其目標是使應用程式 對框架的依賴最小化,應用 可以在沒有spring或者其它的容器下執行。2.spring提供了乙個一致的程式設計模型,使用應用直接使用pojo開發,從需可以與應用環境 如web伺服器 隔離開來。3.spring推動應...

Android原始碼學習1

1 logger日誌系統是基於核心中的logger日誌驅動程式實現的 四種日誌型別 main,system,radio,events 四個裝置檔案 dev log main,dev log system,dev log radio,dev log events main型別的日誌檔案 應用程式級別的...

kernel imx原始碼學習 1

首先看看檔案下包含的內容 這裡通過查詢資料對每個檔案做簡要注釋 1.arch資料夾下包含體系結構的相關 對於每個架構的cpu都有乙個對應的子目錄。2.block塊裝置的通用函式 塊裝置是i o裝置的一類 4.credits是對linux專案的貢獻者名單列表。5.crypto包含常用加密演算法和一些壓...