linux4 19排程類分析

2021-10-20 07:21:55 字數 2636 閱讀 2365

目錄

1 排程類

1.1 排程類結構體:struct sched_class

1.2 停機排程類:stop_sched_class

1.3 限期排程類:dl_sched_class

1.4 實時排程類:rt_sched_class

1.5 公平排程類:fair_sched_class

1.6 空閒排程類:idle_sched_class

2 排程的實體struct sched_entity;

2.1 簡介

2.2 結構體**

2.3 程序描述符 task_struct裡排程相關的成員

3 排程器

3.1 基礎知識

3.2 pick_next_task()

3.3 上下文切換 / context_switch()

3.3.1 switch_mm()

3.3.2 switch_to()

//kernel/sched/sched.h

struct sched_class ;

enqueue_task

向就緒佇列新增乙個新程序。在程序從睡眠狀態變為可執行狀態時,即發生該操作。

dequeue_task

將乙個程序從就緒佇列去除。在程序從可執行狀態切換到不可執行狀態時,就會發生該操作。

yield_task

在程序想要自願放棄對處理器的控制權時,可以使用sched_yield系統呼叫。這導致核心呼叫yield_task。

check_preempt_curr

用乙個新喚醒的程序來搶占當前程序。例如在用wake_up_new_task喚醒信程序時,會呼叫該函式。

pick_next_task

用於選擇下乙個將要執行的程序。

put_prev_task

set_curr_task

在程序的排程策略發生變化時,需要呼叫set_curr_task。還有其他一些場合也呼叫該函式。

task_tick

在每次啟用週期性排程器時,由週期性排程器呼叫。

《深入 linux 核心架構》p72

//kernel/sched/stop_task.c

/* * ******, special scheduling class for the per-cpu stop tasks:

*/const struct sched_class stop_sched_class = ;

//kernel/sched/deadline.c

const struct sched_class dl_sched_class = ;

//kernel/sched/rt.c

const struct sched_class rt_sched_class = ;

//kernel/sched/fair.c

/* * all the scheduling class methods:

*/const struct sched_class fair_sched_class = ;

//kernel/sched/idle.c

/* * ******, special scheduling class for the per-cpu idle tasks:

*/const struct sched_class idle_sched_class = ;

排程器並不直接操作程序,而是處理可排程實體。乙個實體由sched_entity的乙個例項表示。       《深入 linux 核心架構》p70

在程序註冊到就緒佇列時,嵌入的sched_entity例項的on_rq成員設定為1,否則為0。     《深入 linux 核心架構》p72

//include/linux/sched.h

struct sched_entity ;

//include/linux/sched.h

struct task_struct ;

成員的解釋請參考《深入 linux 核心架構》p70

排程程式依靠幾個函式來完成排程工作,其中最重要的函式是:

scheduler_tick();

維持當前最新的time_slice計數器。

try_to_wake_up();

喚醒睡眠程序。

schedule();

選擇要被執行的新程序。

load_balance();

維持多處理器系統中執行佇列的平衡。

《深入理解 linux 核心》p270

pick_next_task()會以優先順序為順序,從高到低,依次檢查每乙個排程類,並且從最高優先順序的排程類中,選擇最高優先順序的程序。

《linux 核心設計與實現》p48

每乙個排程類都實現了pick_next_task()函式,它會返回指向下乙個可執行程序的指標,或者沒有時返回null。

《linux 核心設計與實現》p49

該函式負責把虛擬記憶體從上乙個程序對映切換到新程序中。        《linux 核心設計與實現》p51

《linux 核心設計與實現》p52

Minix檔案系統在Linux 4 19核心的編譯

ubuntu16.04虛擬機器 核心版本 v4.19 minix原始碼獲取 minix原始碼在linux原始碼 fs minix 目錄 進入minix目錄,修改makefile為obj config minix fs minix.o minix objs bitmap.o itree v1.o it...

linux程序排程 完全公平排程類

完全公平排程類是排程類的乙個例項 static const struct sched class fair sched class 在主排程器和週期排程器中會根據程序型別呼叫完全公平排程類或者實時排程類的函式。next,指向空閒排程類,而實時排程類的next則指向完全公平排程類。這個順序在編譯之前已...

linux核心分析之排程演算法 CFS排程分析

前面對linux排程演算法的框架進行了介紹,在這裡對cfs 完全公平排程 演算法進行分析。cfs允許每個程序執行一段時間 迴圈輪轉 選擇執行最少的程序作為下乙個執行程序,而不再採用分配給每個程序時間片的做法了,cfs在所有可執行程序總數基礎上計算出乙個程序應該執行多久,而不是依靠nice值來計算時間...