CFS 调度器 的 调度队列 是struct cfs_rq; 通过 该 " CFS 调度器就绪队列 "cfs_rq, 可以 跟踪 " 就绪队列 " 信息 , 管理 " 就绪状态 " 调度实体 , 维护着一个 按照 虚拟时钟 排序的 " 红黑树 "数据结构; 该struct cfs_rq结构体在Linux内核源码 的linux-5.6.18\kernel\sched\sched.h头文件中定义 ...
如果前一个任务属于CFS调度类,则使用CFS调度类的具体实现 put_prev_task_fair。此时,如果任务还是 TASK_RUNNING 状态,则被重新插入到红黑树的最右侧。如果这个任务不是 TASK_RUNNING 状态,则已经从红黑树移除过了,只需要修改CFS 当前任务指针 cfs_rq->curr 即可。 select_task_rq:为给定的任务选择一个最优的CPU...
一、CFS 调度器就绪队列 cfs_rq 二、Linux 内核调度实体 sched_entity 三、" 红黑树 " 数据结构 rb_root_cached 一、CFS 调度器就绪队列 cfs_rq 调度器 的 主要职责 就是 对 " 进程 " 进行 " 调度管理 " , 调度时 进程 是放在 " 调度队列 " 中的 , ...
cfs_rq:跟踪就绪队列信息以及管理就绪态调度实体,并维护一棵按照虚拟时间排序的红黑树。tasks_timeline->rb_root是红黑树的根,tasks_timeline->rb_leftmost指向红黑树中最左边的调度实体,即虚拟时间最小的调度实体。 struct cfs_rq { ... struct rb_root_cached tasks_timeline ... }; sched_entity:可被内核调...
2.2 cfs的就绪队列 就绪队列是全局调度器许多操作的起点, 但是进程并不是由就绪队列直接管理的, 调度管理是各个调度器的职责, 因此在各个就绪队列中嵌入了特定调度类的子就绪队列(cfs的顶级调度就队列 struct cfs_rq, 实时调度类的就绪队列struct rt_rq和deadline调度类的就绪队列struct dl_rq ...
cfs_rq是内核为普通进程设计的就绪队列: /* CFS-related fields in a runqueue */ struct cfs_rq { struct load_weight load; unsigned int nr_running, h_nr_running; u64 exec_clock; u64 min_vruntime; #ifndef CONFIG_64BIT u64 min_vruntime_copy; ...
1.1CFS原理 cfs定义了一种新的模型,它给cfs_rq(cfs的run queue)中的每一个进程安排一个虚拟时钟,vruntime。如果一个进程得以执行,随着时间的增长(也就是一个个tick的到来),其vruntime将不断增大。没有得到执行的进程vruntime不变。 而调度器总是选择vruntime跑得最慢的那个进程来执行。这就是所谓的“完全...
cfs定义了一种新调度模型,它给cfs_rq(cfs的run queue)中的每一个进程都设置一个虚拟时钟-virtual runtime(vruntime)。如果一个进程得以执行,随着执行时间的不断增长,其vruntime也将不断增大,没有得到执行的进程vruntime将保持不变。而调度器将会选择最小的vruntime那个进程来执行。这就是所谓的“完全公平”。
在CFS中,tick中断首先更新调度信息。然后调整当前进程在红黑树中的位置。调整完成后如果发现当前进程不再是最左边的叶子,就标记need_resched标志,中断返回时就会调用scheduler()完成进程切换。否则当前进程继续占用CPU。从这里可以看到 CFS抛弃了传统的时间片概念。Tick中断只需更新红黑树,以前的所有调度器都在tick中断中...
CFS的实现涉及多个数据结构和算法,包括:task_struct每个任务的调度实体。cfs_rq每个CPU的运行队列。rbtree用于维护基于vruntime的任务排序。sched_entity表示任务的调度信息,包括vruntime和权重。更多细节还需结合代码深入理解。内核CFS文档(Linux/Documentation/scheduler/sched-design-CFS.rst)#五一知识来充电# ...