首先需要思考的问题是:什么是
调度器(scheduler)?
调度器的作用是什么?
调度器是一个
操作系统的核心部分。可以比作是CPU时间的
管理员。
调度器主要负责选择某些就绪的
进程来执行。不同的
调度器根据不同的方法挑选出最适合运行的
进程。目前Linux支持的
调度器就有RT scheduler、Deadline scheduler、
CFS scheduler及Idle scheduler等。我想用一系列文章呈现Linux
调度器的设计原理。
注:文章代码分析基于Linux-4.18.0。
什么是
调度类
CFS(Completely Fair Schduler), 首次出现于Linux2.6.23。
CFS区别于其他调度算法的最突出一点是CFS保证每个任务分配到公平的运行时间。
经典抢占式调度通常包括多个调度队列,每个进程优先级一个:高优先级队列中的每个进程在低优先级队列中的任何进程之前被调度。例如,VAX/VMS 使用 32 个优先级队列进行调度。CFS 省去了固定的时间片和明确的优先级。处理器上给定任务的时间量是随着调度上下文在系统生命周期中的变化而动态计算的。
CFS的一些概念
目标延迟(targ
CFS(Complete Fair Schedule)调度算法的思想是为每一个task维护一个虚拟的运行时间vruntime
调度程序优先选择vruntime值最小的任务执行,之所以引入vruntime的概念,是为了支持优先级调度。vruntime其实是基于task的实际运行时间及优先级权重计算出来的值,其计算公式如下:vruntime += delta_exec * NICE_0_LOAD / weightvruntime:虚拟运行时间
delta_exec: 实际的执行时间
NICE_0_LOAD:进程
一、CFS 调度器概念 ( 完全公平调度器 )、
二、CFS 调度器虚拟时钟概念 ( Virtual Runtime )、
三、进程优先级 ( 调度优先级 | 静态优先级 | 正常优先级 | 实时优先级 )、
四、调度类 ( 停机调度类 | 限期调度类 | 实时调度类 | 公平调度类 | 空闲调度类 )
进程的状态转换
系统中的
进程在
调度程序schedule()的协调下按既定规则运转,保证每个
进程尽可能公平地获得CPU运行时间。在单处理
器系统中,同一时刻只能有一个
进程占用CPU,由于CPU的运行速度很快,加上有
调度程序的协调,肉眼看到所有
进程在同时运行的假象。在多处理
器系统中,同一时刻可以有多个
进程在运行,具体由处理
器个数决定。
CFS是内核使用的一种调度器或调度类,它主要负责处理三种调度策略:SCHED_NORMAL、SCHED_BATCH和SCHED_IDLE。调度器的核心在挑选下一个运行的进程时有可能会遍历所有的调度类别。实际上系统大多数进程通常都是CFS调度类负责处理的,因此为了优化下一个进程的挑选调度器核心会先判断当前进程是否采用了CFS调度策略,若是,则直接调用CFS代码来挑选下一个进程,若不是或CFS代码未能挑选到一个合适的进程,则会调用各个调度类的挑选函数来寻找一个合适的进程。若CFS代码寻找到了合适的下一个运行的进
linux的完全公平调度算法类中,CFS是其中一种,目前默认的。
CFS公式就不贴了,自己搜。CFS引入了虚拟时间的概念。
CFS所谓的“完全公平”指的是虚拟时间的完全公平,而不是指的实际的CPU占用时间公平。
所以它的“完全公平”是建立在虚拟时间的完全公平上的。用了套算法把实际霸占cpu的时间转换成了虚拟时间,而这个转换nice
值很决定这个权重,nice值越大转换的虚拟时间越大,那么很短的cpu霸占时间就能达到很大的虚拟时间,也就是nice值控制虚拟时间的增长率。
这就造成了,用nice值来调整各tas