文章目录
- 一、调度器类 sched_class 简介
- 二、CFS 调度器类源码
- 三、next 赋值
- 四、enqueue_task 赋值
- 五、dequeue_task 赋值
一、调度器类 sched_class 简介
在之前的博客
- 【Linux 内核】调度器 ② ( sched_class 调度类结构体源码 | 源码路径 linux-5.6.18kernelschedsched.h )
- 【Linux 内核】调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 )
- 【Linux 内核】调度器 ④ ( sched_class 调度类结构体分析 | yield_task 函数 | heck_preempt_curr 函数 | task_struct 函数 )
- 【Linux 内核】调度器 ⑤ ( put_prev_task、set_next_task 函数 | select_task_rq 函数 | migrate_task_rq 函数 )
- 【Linux 内核】调度器 ⑦ ( 调度器类型 | 停机调度类 stop_sched_class | 限期调度类 dl_sched_class | 实时调度类 | 公平调度类 | 空闲调度类 )
中 , 介绍了 调度类 sched_class 结构体的源码 , 重要的 字段 以及 函数指针 ;
CFS 调度器类 fair_sched_class
是 sched_class
结构体类型的 ;
二、CFS 调度器类源码
CFS 调度器类 fair_sched_class
的 源码 在 Linux 内核源码 linux-5.6.18kernelschedfair.c
中 ,
/*
* 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_class
的 next
字段赋值 ,
.next = &idle_sched_class
idle_sched_class
是 空闲调度类 ;
参考资料 : 【Linux 内核】调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 )
整个 Linux 系统中有 多个 " 调度类 " , 按照 优先级进行排序 , 这些 " 调度类 " 放在一个 " 链表 " 中 , 优先级高的 " 调度类 " 先执行 , 优先级低的后执行 ;
sched_class
调度类结构体 中的 next
字段 , 就是指向 " 调度类 " 链表 中的 下一个 " 调度类 " ; ( 优先级低于本调度类 )
const struct sched_class *next;
源码路径 : linux-5.6.18kernelschedsched.h#1709 ;
四、enqueue_task 赋值
CFS 调度器类 fair_sched_class
的 enqueue_task
字段赋值 , 进程任务进入 " 可运行状态 " 时 , 调用该 enqueue_task_fair
函数 , 将 调度实体 也就是 进程 存入 执行队列 ( 红黑树 ) 中 ;
.enqueue_task = enqueue_task_fair,
参考资料 : 【Linux 内核】调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 )
sched_class
调度类结构体 中的 enqueue_task
函数指针 , 指向一个函数 , 调用该函数 , 可以将 " 进程 " 加入到 " 执行队列 " 中 , 同时 nr_running
自增
;
- 进程 是一个 调度实体 ;
- 执行队列 是一个 红黑树 ;
void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags);
源码路径 : linux-5.6.18kernelschedsched.h#1715 ;
五、dequeue_task 赋值
CFS 调度器类 fair_sched_class
的 dequeue_task
字段赋值 , 进程任务退出 " 可运行状态 " 时 , 调用该 dequeue_task_fair
函数 , 将 调度实体 也就是 进程 从 执行队列 ( 红黑树 ) 中 删除 , 执行出队操作 ;
.dequeue_task = dequeue_task_fair,
参考资料 : 【Linux 内核】调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 )
dequeue_task
调度类结构体 中的 dequeue_task
函数指针 , 指向一个函数 , 调用该函数 , 可以 从 " 执行队列 " 中删除 " 进程 " , 同时 nr_running
自减
;
- 进程 是一个 调度实体 ;
- 执行队列 是一个 红黑树 ;
void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);
源码路径 : linux-5.6.18kernelschedsched.h#1716 ;