Linux kernel是如何執行組排程的

2021-08-13 21:12:38 字數 2826 閱讀 2760

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 遊戲運維又有分工,分為開發運維 應用運維 業務運...