【Linux 内核】实时调度类 ⑥ ( 实时调度类核心函数源码分析 | 插入进程到执行队列 | 从执行队列中选择优先级最高的进程 )
文章目錄
- 一、enqueue_task_rt 函數 ( 插入進程到執行隊列 )
- 二、pick_next_task_rt 函數 ( 從執行隊列中選擇優先級最高的進程 )
本篇博客中 , 開始分析 struct sched_class rt_sched_class 結構體變量 中的各個 函數指針 指向的 函數源碼 ;
rt_sched_class 結構體 在 Linux 內核源碼的 linux-5.6.18\kernel\sched\rt.c 源文件中定義 , 實時調度 相關的 核心函數 也定義在該源碼中 ;
一、enqueue_task_rt 函數 ( 插入進程到執行隊列 )
enqueue_task_rt 函數用于 更新 " 調度信息 " , 將 " 實時調度實體 " sched_rt_entity 插入到 " 執行隊列 " ( 紅黑樹 ) 的 末尾 ( 紅黑樹最右側 ) ;
該函數的核心代碼是 調用 enqueue_pushable_task 函數 , 將 當前的 " 實時調度實體 " 插入到 對應的優先級列表 中 ;
/** Adding/removing a task to/from a priority array:*/ static void enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags) {struct sched_rt_entity *rt_se = &p->rt;if (flags & ENQUEUE_WAKEUP)rt_se->timeout = 0;enqueue_rt_entity(rt_se, flags);if (!task_current(rq, p) && p->nr_cpus_allowed > 1)enqueue_pushable_task(rq, p); }源碼路徑 : linux-5.6.18\kernel\sched\rt.c#1367
二、pick_next_task_rt 函數 ( 從執行隊列中選擇優先級最高的進程 )
enqueue_task_rt 函數用于 在 " 執行隊列 " ( 紅黑樹 ) 中 , 選擇 " 優先級最高 " 的 " 實時進程 " , 用于執行 ;
該函數的核心代碼是 調用 _pick_next_task_rt 函數 ;
static struct task_struct *pick_next_task_rt(struct rq *rq) {struct task_struct *p;if (!sched_rt_runnable(rq))return NULL;p = _pick_next_task_rt(rq);set_next_task_rt(rq, p, true);return p; }源碼路徑 : linux-5.6.18\kernel\sched\rt.c#1616
在 _pick_next_task_rt 函數 中 , 又調用了 pick_next_rt_entity 函數 ;
static struct task_struct *_pick_next_task_rt(struct rq *rq) {struct sched_rt_entity *rt_se;struct rt_rq *rt_rq = &rq->rt;do {rt_se = pick_next_rt_entity(rq, rt_rq);BUG_ON(!rt_se);rt_rq = group_rt_rq(rt_se);} while (rt_rq);return rt_task_of(rt_se); }源碼路徑 : linux-5.6.18\kernel\sched\rt.c#1602
pick_next_rt_entity 函數 源碼如下 :
idx = sched_find_first_bit(array->bitmap); 作用是 找到 可用的實體 ;
queue = array->queue + idx; 作用是 從 " 鏈表組 " 找到對應的鏈表 ;
return next 返回找到的 實時運行實體 ;
static struct sched_rt_entity *pick_next_rt_entity(struct rq *rq,struct rt_rq *rt_rq) {struct rt_prio_array *array = &rt_rq->active;struct sched_rt_entity *next = NULL;struct list_head *queue;int idx;idx = sched_find_first_bit(array->bitmap);BUG_ON(idx >= MAX_RT_PRIO);queue = array->queue + idx;next = list_entry(queue->next, struct sched_rt_entity, run_list);return next; }源碼路徑 : linux-5.6.18\kernel\sched\rt.c#1585
總結
以上是生活随笔為你收集整理的【Linux 内核】实时调度类 ⑥ ( 实时调度类核心函数源码分析 | 插入进程到执行队列 | 从执行队列中选择优先级最高的进程 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux 内核】实时调度类 ③ (
- 下一篇: 【Linux 内核】实时调度类 ⑦ (