linux调度原理(二)

本篇主要讲解linux的调度类、调度策略。linux为了满足不同类型进程的调度需要,设计了很多调度类和调度策略,保证系统的高效运行。

进程分类

根据进程优先级,可以将进程分为实现进程和普通进程。其中实时进程的优先级为0-99,普通进程的优先级为100-139,并且进程优先级数值越大,其优先级越低。

调度类

linux针对不同类别进程,设计了5种调度类:stop_sched_class、dl_sched_class、rt_sched_class、fair_sched_class和idle_sched_class,并且它们的优先级依次降低。其中dl_sched_class和rt_sched_class应用于实时进程,fair_sched_class和idle_sched_class应用于普通进程。

 stop_sched_class

  • stop_sched_class优先级最高,同一时刻只有一个任务被设定为stop_sched_class。
  • 任务一旦被设置为stop_sched_class,它将不能被抢占,不能被切换,其将一直执行下去,直至进程执行完或主动让出cpu。
  • 只有内核线程可能被设置为stop_sched_class类,用户态进程不允许使用。

linux中任务有实时任务和普通任务之分。实时任务需要在deadline之前执行完成,否则不能产生正确的逻辑结果,而非实时任务则没有这个要求。为了满足实时任务调度需求,linux设计了两类调度器:dl_sched_class(deadline schedule)和rt_sched_class(realtime schedule)。

实时任务可以抽象出3大关键因素:周期(period)、运行时间(runtime)和最后期限(deadline)。Deadline调度器根据用户指定的上述3大因素进行实时进程调度,即使负荷很高的情况下也能保证实时任务的有效调度。

实时系统:当事件发生后,必须要在确定的时间范围内作出相应。在实时系统中,产生正确的结果,不仅依赖于程序逻辑正确,而且依赖于执行程序逻辑的时序。当收到某个请求时,会执行对应的动作以响应请求。要想正确地响应该请求,不仅需要响应的逻辑正确,而且还需要在最后期限(deadline)之前执行完对应的逻辑。如果没有在最后期限之前执行对应的响应逻辑,系统将产生错误或异常。

dl_sched_class

原理:

  1. deadline调度器根据任务的deadline进行调度。当产生一个调度点时,deadline调度器选取deadline距离当前时间点最近的进程并执行它。(谁更紧急执行谁)
  2. deadline调度器只有一种调度策略:SCHED_DEADLINE。

用法:针对deadline调度器,用户使用时需要设定三个参数:周期(period)、运行时间(runtime)和最后期限(deadline)。下面以视频处理进程为例进行说明。

1. 视频处理进程的主要是每秒钟处理60帧的视频数据,即每16ms需要处理一帧数据,因此它的周期period为16ms。

2. 对于视频处理进程来说,每个周期内它需要完成1帧数据处理,运行时间runtime即为完成这1帧数据处理需要cpu执行的时间。选取最坏情况下的cpu执行时间,运行runtime设置为5ms。

3. 在一个实时任务周期内,deadline定义了需要完成任务处理并交付的最后期限。在上面的16ms一帧视频处理周期内,如果需要在周期的前10ms完成一帧视频的处理并传送给下一个模块,则deadline设置为10ms。因此运行时间runtime的5ms必须在周期的前10ms内。

通过上面的一系列设置,系统可以保证在每16ms内,将分配给视频处理进程5ms的cpu使用时间,并且这5ms的cpu使用时间在周期的前10ms deadline完成,这样保证任务按时完成交付给下一个模块处理。

由于deadline任务明确了自身对cpu的详细使用需求,因此当一个新的deadline任务被创建时,deadline调度器会根据当前负荷处理能力判断能否接纳。若当前系统比较空闲,deadline调度器判断可以满足其需求,则接纳该进程;否则系统本身已经高负荷状态,deadline经过评估认为无法满足其对cpu的使用要求,则会拒绝该进程。

rt_sched_class

原理:

  1. 实时调度器rt_sched_class有两种调度策略:FIFO(first-in-first-out)和RR(round -robin)。每个实时任务都固定分配一个优先级,无论是FIFO还是RR,rt_sched_class调度器总是选择实时优先级(进程描述符task_struct中rt_priority)更高的进程执行。在实时理论中,这种调度器被归类为固定优先级调度器(fixed-priority schedule)。
  2. 对于不同优先级的实时进程调度,FIFO和RR没有区别,即选择实时优先级高的进程调度执行。
  3. 对于相同优先级的实时进程调度,FIFO和RR产生了差别,分别采取了不同的调度策略。
  • FIFO:采用先进先出机制。针对每一个实时优先级创建了一个队列用于保存调度进程,队列按照先进先出顺序排列。当使用该调度策略的进程被执行后,该进程将一直运行,直至更高优先级抢占或者自身主动放弃,此后将选取下一个排队的进程调度执行。
  • RR:采用时间片轮转调度。每个采取该策略调度的进程都有自己的时间片。进程被执行后将一直运行直至时间片耗尽(若不阻塞)。时间片耗尽后,该进程将被放到运行队列的尾部,并从运行队列中选取下一个进程调度执行(相同优先级进程放在一个运行队列,不同优先级放在不同的进程)。

用法:针对实时调度器,用户需要设置调度策略(FIFO/RR)和进程固定的实时优先级(rt_priority)。

fair_sched_class

原理:完全公平调度器(CFS,completely fair schedule)用于linux普通进程调度。


1. 针对普通进程,CFS调度器引入了nice值概念。nice值和进程的优先级有一个一一对应关系。我们知道普通进程的优先级为100-139,而nice值的范围为-20-19,因此两者相差120,它们的换算关系如下:

注意,nice值并不是进程的优先级,但nice值可以影响进程优先级,它们的关系如下:

PRI(new) = PRI(old) + nice 

我们可以通过nice、renice命令修改进程的nice值从而改变进程的优先级。

进程优先级和进程权重的对应关系如下:

 从上面可以看出,每相邻nice值之间,它们的cpu实际可运行时间相差10%。默认的进程优先级为120,nice值为0,对应的权重为1024(NICE_0_LOAD)。

2. 从上面可知,每个进程优先级对应一个权重。CFS根据进程的权重按比例分配实际可运行时间,这样保证优先级更高进程能得到更多的运行时间。

分配给进程的实际运行时间计算公式如下:

3. CFS调度器兼顾了公平和效率,引入了虚拟运行时间概念(virtual runtime)用于标识当前进程已经运行的虚拟时间。注意,虚拟运行时间virtual runtime并不等于实际运行时间,它们两者之间需要乘以一个系数,具体如下:

 对于低优先级的进程来说,它的进程权重较小。和高优先级进程相比,当运行相同的实际时间时,低优先级进程对应的虚拟运行时间更大,也即看起来似乎消耗的更快。而CFS调度器每次总是选择虚拟运行时间更小的进程运行,这样CFS调度器有更大概率选择优先级更高的进程运行,因为相对而言,高优先级进程的虚拟运行时间更小,这体现了CFS调度器的效率。

我们可以推理一下一个进程在一个CFS调度周期内的虚拟运行时间,具体如下:

从上面可以看出,在一个调度周期内,所有进程的虚拟运行时间都是相等的,从这点看CFS调度器实现了相对公平。 

对于CFS调度器,用户有两种调度策略可选:SCHED_NORAM和SCHED_BATCH,它们分别用于调度交互式进程(I/O消耗型)和批处理进程(处理器消耗型)。对于两种类型进程特点可参考:linux调度原理(一)_sy4331的博客-CSDN博客

  • SCHED_NORMAL:应用于交互式进程,调度策略尽可能更快地响应。为了保证交互式应用和桌面系统的性能,linux更倾向于优先调度交互式进程(I/O消耗型)。
  • SCHED_BATCH:应用于批处理进程(处理器消耗型)。批处理进程的特点是I/O交互少、CPU使用密集。该调度策略不会采用抢占式调度,因此不会干扰交互式进程,也即优先保证系统的响应速度。

idle_sched_class

原理:

  1. idle调度器的优先级最低,只有在系统空闲时才进入该调度类调度。一般系统中只有一个进程使用idle调度器,就是系统初始化进程。在完成初始化后,将自身设置为idle进程,不再做更多工作,让cpu进入节能状态。
  2. idle调度器对应的只有一种调度策略:SCHED_IDLE.

系统调度类、调度策略总结:

参考:Linux进程优先级和nice值 - 走看看 

           linux内核普通进程CFS调度原理_eleven_xiy的博客-CSDN博客 

           deadline调度器之(一):原理

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值