日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

【Linux 内核】实时调度类 ⑥ ( 实时调度类核心函数源码分析 | 插入进程到执行队列 | 从执行队列中选择优先级最高的进程 )

發(fā)布時間:2025/6/17 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux 内核】实时调度类 ⑥ ( 实时调度类核心函数源码分析 | 插入进程到执行队列 | 从执行队列中选择优先级最高的进程 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、enqueue_task_rt 函數(shù) ( 插入進(jìn)程到執(zhí)行隊列 )
  • 二、pick_next_task_rt 函數(shù) ( 從執(zhí)行隊列中選擇優(yōu)先級最高的進(jìn)程 )


本篇博客中 , 開始分析 struct sched_class rt_sched_class 結(jié)構(gòu)體變量 中的各個 函數(shù)指針 指向的 函數(shù)源碼 ;

rt_sched_class 結(jié)構(gòu)體 在 Linux 內(nèi)核源碼的 linux-5.6.18\kernel\sched\rt.c 源文件中定義 , 實時調(diào)度 相關(guān)的 核心函數(shù) 也定義在該源碼中 ;





一、enqueue_task_rt 函數(shù) ( 插入進(jìn)程到執(zhí)行隊列 )



enqueue_task_rt 函數(shù)用于 更新 " 調(diào)度信息 " , 將 " 實時調(diào)度實體 " sched_rt_entity 插入到 " 執(zhí)行隊列 " ( 紅黑樹 )末尾 ( 紅黑樹最右側(cè) ) ;

該函數(shù)的核心代碼是 調(diào)用 enqueue_pushable_task 函數(shù) , 將 當(dāng)前的 " 實時調(diào)度實體 " 插入到 對應(yīng)的優(yōu)先級列表 中 ;

/** 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 函數(shù) ( 從執(zhí)行隊列中選擇優(yōu)先級最高的進(jìn)程 )



enqueue_task_rt 函數(shù)用于 在 " 執(zhí)行隊列 " ( 紅黑樹 ) 中 , 選擇 " 優(yōu)先級最高 " 的 " 實時進(jìn)程 " , 用于執(zhí)行 ;

該函數(shù)的核心代碼是 調(diào)用 _pick_next_task_rt 函數(shù) ;

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 函數(shù) 中 , 又調(diào)用了 pick_next_rt_entity 函數(shù) ;

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 函數(shù) 源碼如下 :

idx = sched_find_first_bit(array->bitmap); 作用是 找到 可用的實體 ;

queue = array->queue + idx; 作用是 從 " 鏈表組 " 找到對應(yīng)的鏈表 ;

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

總結(jié)

以上是生活随笔為你收集整理的【Linux 内核】实时调度类 ⑥ ( 实时调度类核心函数源码分析 | 插入进程到执行队列 | 从执行队列中选择优先级最高的进程 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。