1.3. 调度结构:运行队列调度类调度组调度域
Posted broler
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.3. 调度结构:运行队列调度类调度组调度域相关的知识,希望对你有一定的参考价值。
运行队列
运行队列是一个每CPU变量,定义如下:
DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues);
通过每CPU变量直接获得对应的运行队列,这也反映了运行队列的工作原理是基于CPU维度的,调度任务的组织方式是每CPU的运行队列。所有的进程都需要加入运行队列才会被调度运行。把任务放入运行队列并不代表当前就在运行,也不代表马上会得到运行,只代表任务已经处于随时可以运行的状态,CPU根据调度算法来从运行队列中选择下一个要运行的任务。
运行队列并不是一个简单的队列,而是一个运行状态结构体,实际的队列放在具体的调度类中。struct rq中包含struct cfs_rq cfs、 struct rt_rq rt、struct dl_rq dl三个结构体,其中组织了对应的处于该调度策略下的进程的结构体。例如在CFS中以红黑树的方式组织了所有任务,红黑树的key是已经运行的虚拟时间片,选择下一个运行的任务只需要从红黑树最左侧获得时间片最少的任务作为下一个要运行的任务。现在内核支持调度组,红黑树下面的一个节点如果对应一个调度组,则该节点还可以包括一个子红黑树。
调度类
sched_class叫作调度类,用来表示每一种调度算法,在Linux下有fair_sched_class(fair.c)、dl_sched_class(deadline.c)、rt_sched_class(rt.c)、idle_sched_ class(idle_task.c)和stop_sched_class(stop_task.c)五种,一般默认使用的是fair_sched_class(fair.c),也就是CFS(Completely Fair Scheduling)调度算法。系统中除特殊指定外,
以上是关于1.3. 调度结构:运行队列调度类调度组调度域的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核实时调度类 ④ ( 实时运行队列 rt_rq 源码分析 | 实时运行队列 rt_rq 结构体字段分析 | activert_nr_runningcurrnext 字段 )
Linux 内核实时调度类 ⑦ ( 实时调度类核心函数源码分析 | dequeue_task_rt 函数 | 从执行队列中移除进程 )
Linux 内核调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 )