前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux 内核】CFS 调度器 ⑤ ( CFS 调度器类 fair_sched_class 源码 | next 赋值 | enqueue_task 赋值 | dequeue_task 赋值 )

【Linux 内核】CFS 调度器 ⑤ ( CFS 调度器类 fair_sched_class 源码 | next 赋值 | enqueue_task 赋值 | dequeue_task 赋值 )

作者头像
韩曙亮
发布2023-03-30 13:59:25
1.8K0
发布2023-03-30 13:59:25
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、调度器类 sched_class 简介


在之前的博客

中 , 介绍了 调度类 sched_class 结构体的源码 , 重要的 字段 以及 函数指针 ;

CFS 调度器类 fair_sched_classsched_class 结构体类型的 ;

二、CFS 调度器类源码


CFS 调度器类 fair_sched_class 的 源码 在 Linux 内核源码 linux-5.6.18\kernel\sched\fair.c 中 ,

代码语言:javascript
复制
/*
 * All the scheduling class methods:
 */
const struct sched_class fair_sched_class = {
	.next			= &idle_sched_class,
	.enqueue_task		= enqueue_task_fair,
	.dequeue_task		= dequeue_task_fair,
	.yield_task		= yield_task_fair,
	.yield_to_task		= yield_to_task_fair,

	.check_preempt_curr	= check_preempt_wakeup,

	.pick_next_task		= __pick_next_task_fair,
	.put_prev_task		= put_prev_task_fair,
	.set_next_task          = set_next_task_fair,
}
在这里插入图片描述
在这里插入图片描述

三、next 赋值


CFS 调度器类 fair_sched_classnext 字段赋值 ,

代码语言:javascript
复制
.next			= &idle_sched_class

idle_sched_class 是 空闲调度类 ;

参考资料 : 【Linux 内核】调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 )

整个 Linux 系统中有 多个 " 调度类 " , 按照 优先级进行排序 , 这些 " 调度类 " 放在一个 " 链表 " 中 , 优先级高的 " 调度类 " 先执行 , 优先级低的后执行 ;

sched_class 调度类结构体 中的 next 字段 , 就是指向 " 调度类 " 链表 中的 下一个 " 调度类 " ; ( 优先级低于本调度类 )

代码语言:javascript
复制
const struct sched_class *next;

源码路径 : linux-5.6.18\kernel\sched\sched.h#1709 ;

四、enqueue_task 赋值


CFS 调度器类 fair_sched_classenqueue_task 字段赋值 , 进程任务进入 " 可运行状态 " 时 , 调用该 enqueue_task_fair 函数 , 将 调度实体 也就是 进程 存入 执行队列 ( 红黑树 ) 中 ;

代码语言:javascript
复制
	.enqueue_task		= enqueue_task_fair,

参考资料 : 【Linux 内核】调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 )

sched_class 调度类结构体 中的 enqueue_task 函数指针 , 指向一个函数 , 调用该函数 , 可以将 " 进程 " 加入到 " 执行队列 " 中 , 同时 nr_running 自增

1

;

  • 进程 是一个 调度实体 ;
  • 执行队列 是一个 红黑树 ;
代码语言:javascript
复制
void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags);

源码路径 : linux-5.6.18\kernel\sched\sched.h#1715 ;

五、dequeue_task 赋值


CFS 调度器类 fair_sched_classdequeue_task 字段赋值 , 进程任务退出 " 可运行状态 " 时 , 调用该 dequeue_task_fair 函数 , 将 调度实体 也就是 进程 从 执行队列 ( 红黑树 ) 中 删除 , 执行出队操作 ;

代码语言:javascript
复制
	.dequeue_task		= dequeue_task_fair,

参考资料 : 【Linux 内核】调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 )

dequeue_task 调度类结构体 中的 dequeue_task 函数指针 , 指向一个函数 , 调用该函数 , 可以 从 " 执行队列 " 中删除 " 进程 " , 同时 nr_running 自减

1

;

  • 进程 是一个 调度实体 ;
  • 执行队列 是一个 红黑树 ;
代码语言:javascript
复制
void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);

源码路径 : linux-5.6.18\kernel\sched\sched.h#1716 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、调度器类 sched_class 简介
  • 二、CFS 调度器类源码
  • 三、next 赋值
  • 四、enqueue_task 赋值
  • 五、dequeue_task 赋值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档