1.4. CFS调度算法
Posted broler
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.4. CFS调度算法相关的知识,希望对你有一定的参考价值。
vruntime与优先级
调度域、调度组和调度域拓扑等级都是对CPU的组织,可以认为是资源面的组织方式,调度系统需要对内核进程(线程)进行调度,对于内核进程的组织也可以分为单个的内核进程和内核进程组的区别,无论是单个的内核进程还是内核进程组,只要是参与调度的运行实体,都需要在其task_struct中包含struct sched_entity,调度系统直接根据sched_entity来决策调度,并且与调度相关的进程的数据都存储在sched_entity中。
使用调度域的过程就是实际的调度过程,在调度过程中当前线程不再需要CPU,当需要选择下一个进程来执行时,会调用pick_next_task函数,该函数的核心就是从最高优先级的调度类遍历,找到该优先级下的pick_next_task返回的线程。
CFS以红黑树组织所有待调度的任务,虚拟时钟(sched_entity:vruntime)是红黑树排序的依据,CFS通过每个进程的虚拟运行时间(vruntime)来衡量哪个进程最值得被调度。CFS中的就绪队列是一棵以vruntime为键值的红黑树,虚拟时间越小的进程越靠近整个红黑树的最左端。因此,调度器每次选择位于红黑树最左端的那个进程,该进程的vruntime最小。vruntime是通过进程的实际运行时间和进程的权重(weight)计算出来的,权重与进程的优先级成正比,优先级越高,权重越大,表示该进程越需要被运行。从优先级到权重的转换是通过prio_to_weight数组进行的,代码如下:
static const int prio_to_weight[40] =
/* -20 */
以上是关于1.4. CFS调度算法的主要内容,如果未能解决你的问题,请参考以下文章
Linux(内核剖析):08---进程调度之Linux调度算法(调度器类公平调度(CFS))