日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2025/6/17 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 内核】实时调度类 ⑥ ( 实时调度类核心函数源码分析 | 插入进程到执行队列 | 从执行队列中选择优先级最高的进程 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。