linux系統主排程函式,當執行到該函式時,從當前cpu的rq佇列中選擇乙個task投入執行:
1, cfs組排程
pick_next_entity從系統cfs佇列(csf_rq)中選擇乙個排程實體se(紅黑樹最左邊的節點);
set_next_entity設定cfs_rq->curr = se 等;
group_cfs_rq會判斷選擇到的se是對應乙個task還是乙個task_group,如果是task可直接切換到該task執行,如果是task_group還需要繼續往下執行。可根據se->my_q判斷se對應什麼,如果se->my_q為空表示se是乙個task,如果不為空se表示是乙個task_group(排程組):
/* runqueue "owned" by this group */
static inline struct cfs_rq *
group_cfs_rq(struct sched_entity *grp)
struct sched_entity中my_q欄位的意義,
如果排程實體代表task_group,則它的my_q欄位指向這個排程組對應的執行佇列;否則my_q欄位為null,排程實體代表task。
所以如果group_cfs_rq判斷se是排程組,那麼該排程組自己的cfs佇列就是cfs_rq = group_cfs_rq(se)。下次迴圈就從排程組自己的cfs佇列中選擇乙個排程實體se(紅黑樹最左邊的節點),如果se還是對應排程組,就繼續遞迴下去,直到在某個子(後代)排程組的cfs佇列中找到對應乙個task的se,然後將其投入執行。
乙個組排程對應核心要為其建立乙個task_group。例如,在系統cpu子系統/sys/fs/cgroup/cpu/下面建立乙個目錄my_test,即/sys/fs/cgroup/cpu/my_test,然後將系統中的某些程序轉移到my_test中去,echo pid*** > /sys/fs/cgroup/cpu/my_test/tasks。 核心將為你的my_test cpu子系統建立乙個task_group用於my_test的組排程, 並為該task_group初始化它自己的se與cfs,rt佇列(為task_group結構體的變數),如下**所示:
為my_test建立struct task_group:
初始化struct task_group的cfs_rq佇列與cfs_se(用於組中normal程序的排程):
初始化struct task_group的rt_rq佇列與rt_se(用於組中實時程序的排程):
初始化結果(假設系統有兩個cpu):
例如,在my_test下又建立了my_test_child,
/sys/fs/cgroup/cpu/my_test =>對應乙個task_group
/sys/fs/cgroup/cpu/my_test/my_test_child =>對應乙個task_group
echo pid*** > /sys/fs/cgroup/cpu/my_test/my_test_child/tasks
其在cpu0上的排程過程如下:
從cpu_rq(0)->cfs_rq中得到紅黑樹最左側節點se
--->
如果該se是my_test對應task_group->se[0], 那麼se[0]->my_q != null,說明是個組排程實體, 從該組排程實體相應佇列se[0]->my_q中獲取紅黑樹最左側節點se
--->
如果該se是my_test_child對應task_group->se[0],如果se[0]->my_q != null,說明仍然是個組排程實體, 繼續從該組排程實體相應佇列se[0]->my_q中獲取紅黑樹最左側節點se
--->
se[0]->my_q == null, 說明se是個task,其pid正是pid*** ,然會返回給__schedule函式投入排程。
2, rt組排程
什麼是運維?什麼是遊戲運維?
1 運維是指大型組織已經建立好的網路軟硬體的維護,就是要保證業務的上線與運作的正常,在他運轉的過程中,對他進行維護,他集合了網路 系統 資料庫 開發 安全 監控於一身的技術 運維又包括很多種,有dba運維 運維 虛擬化運維 監控運維 遊戲運維等等 2 遊戲運維又有分工,分為開發運維 應用運維 業務運...
什麼是運維?什麼是遊戲運維?
1 運維是指大型組織已經建立好的網路軟硬體的維護,就是要保證業務的上線與運作的正常,在他運轉的過程中,對他進行維護,他集合了網路 系統 資料庫 開發 安全 監控於一身的技術 運維又包括很多種,有dba運維 運維 虛擬化運維 監控運維 遊戲運維等等 2 遊戲運維又有分工,分為開發運維 應用運維 業務運...
什麼是運維?什麼是遊戲運維?
1 運維是指大型組織已經建立好的網路軟硬體的維護,就是要保證業務的上線與運作的正常,在他運轉的過程中,對他進行維護,他集合了網路 系統 資料庫 開發 安全 監控於一身的技術 運維又包括很多種,有dba運維 運維 虛擬化運維 監控運維 遊戲運維等等 2 遊戲運維又有分工,分為開發運維 應用運維 業務運...