
文章插图
linux内核实现的6种调度策略, 前面三种策略使用的是cfs调度器类 , 后面两种使用rt调度器类, 最后一个使用DL调度器类
5个调度器类
而依据其调度策略的不同实现了5个调度器类, 一个调度器类可以用一种种或者多种调度策略调度某一类进程, 也可以用于特殊情况或者调度特殊功能的进程.

文章插图
其所属进程的优先级顺序为
stop_sched_class -> dl_sched_class -> rt_sched_class -> fair_sched_class -> idle_sched_class3个调度实体调度器不限于调度进程, 还可以调度更大的实体, 比如实现组调度: 可用的CPUI时间首先在一半的进程组(比如, 所有进程按照所有者分组)之间分配, 接下来分配的时间再在组内进行二次分配.
这种一般性要求调度器不直接操作进程, 而是处理可调度实体, 因此需要一个通用的数据结构描述这个调度实体,即seched_entity结构, 其实际上就代表了一个调度对象 , 可以为一个进程 , 也可以为一个进程组.
linux中针对当前可调度的实时和非实时进程, 定义了类型为seched_entity的3个调度实体

文章插图
调度器类的就绪队列
另外 , 对于调度框架及调度器类 , 它们都有自己管理的运行队列 , 调度框架只识别rq(其实它也不能算是运行队列) , 而对于cfs调度器类它的运行队列则是cfs_rq(内部使用红黑树组织调度实体) , 实时rt的运行队列则为rt_rq(内部使用优先级bitmap+双向链表组织调度实体), 此外内核对新增的dl实时调度策略也提供了运行队列dl_rq
调度器整体框架
本质上, 通用调度器(核心调度器)是一个分配器,与其他两个组件交互.
- 调度器用于判断接下来运行哪个进程 , 内核支持不同的调度策略(完全公平调度, 实时调度, 在无事可做的时候调度空闲进程,即0号进程也叫swApper进程,idle进程), 调度类使得能够以模块化的方法实现这些侧露额, 即一个类的代码不需要与其他类的代码交互
- 当调度器被调用时, 他会查询调度器类, 得知接下来运行哪个进程 , 在选中将要运行的进程之后, 必须执行底层的任务切换 , 这需要与CPU的紧密交互. 每个进程刚好属于某一调度类, 各个调度类负责管理所属的进程. 通用调度器自身不涉及进程管理, 其工作都委托给调度器类.
linux实现了6种调度策略, 依据其调度策略的不同实现了5个调度器类, 一个调度器类可以用一种或者多种调度策略调度某一类进程, 也可以用于特殊情况或者调度特殊功能的进程.

文章插图
它们的关系如下图

文章插图
5种调度器类为什么只有3种调度实体
正常来说一个调度器类应该对应一类调度实体, 但是5种调度器类却只有了3种调度实体?
这是因为调度实体本质是一个可以被调度的对象, 要么是一个进程(linux中线程本质上也是进程), 要么是一个进程组, 只有dl_sched_class, rt_sched_class调度的实时进程(组)以及fair_sched_class调度的非实时进程(组)是可以被调度的实体对象, 而stop_sched_class和idle_sched_class
为什么采用EDF实时调度需要单独的调度器类, 调度策略和调度实体
linux针对实时进程实现了Roound-Robin, FIFO和Earliest-Deadline-First(EDF)算法, 但是为什么SCHED_RR和SCHED_FIFO两种调度算法都用rt_sched_class调度类和sched_rt_entity调度实体描述, 而EDF算法却需要单独用rt_sched_class调度类和sched_dl_entity调度实体描述
为什么采用EDF实时调度不用rt_sched_class调度类调度, 而是单独实现调度类和调度实体?
4.2 进程的调度
首先 , 我们需要清楚 , 什么样的进程会进入调度器进行选择 , 就是处于TASK_RUNNING状态的进程 , 而其他状态下的进程都不会进入调度器进行调度 。
系统发生调度的时机如下
推荐阅读
- 关于黄茶的采摘的介绍,黄茶的种类全介绍
- 君山银针可以冲泡几遍,如何冲泡好杯君山银针茶
- 君山银针品种大全,君山银针的特征
- js中同步和异步编程
- 温州黄汤冲泡步骤,温州平阳黄汤黄茶类中的黄小茶
- 君山银针哪个季节喝好,如何鉴别君山银针
- 黄芽茶适合女人喝吗,黄茶适合什么人喝
- 君山银针的贮藏方法,鉴别优质君山银针的方法
- 远安黄茶功效作用,黄茶知识
- 雅安黄茶简介,黄茶有哪些
