任务调度方法技术

技术编号:39418022 阅读:10 留言:0更新日期:2023-11-19 16:08
任务调度方法,通过在就绪队列中的任务的任务描述体中增加平均运行时间、平均调度间隔、任务评分及任务从就绪到得到CPU调度所经历的调度次数四个成员,基于平均运行时间、平均调度间隔及调度次数给任务评分赋值,并基于任务评分决定任务入队在队列中的位置。本发明专利技术增加的任务评分机制,可以根据自动为任务进行评分,来区分同一优先级任务调度的紧急程度,让那些运行时间短、调度间隔短的任务更早得到调度,使Linux内核调度器中的实时任务调度更加合理有效。从某些方面来看,一定程度上提高了系统的实时性,对于使用PREEMPT RT patch改造后的实时linux作用更大。造后的实时linux作用更大。造后的实时linux作用更大。

【技术实现步骤摘要】
任务调度方法


[0001]本专利技术涉及资源调度优化
,具体涉及一种针对相同优先级的就绪队列中的任务的调度方法。

技术介绍

[0002]Linux内核调度器中,目前支持五种调度类任务,调度顺序从高到低依次为:stop_sched_class、dl_sched_class、rt_sched_class、fair_sched_class、idle_sched_class。每个调度类都有就绪队列,严格来说,每个调度类都只有一个就绪队列,只是rt_sched_class调度类中的就绪队列中,维护着100个任务链表(对应实时任务的优先级0~99,根据任务的优先级会放到对应的任务链表中),本申请后文针对rt_sched_class调度类的描述,所涉及到的队列均表示实时任务链表,链表中放的是任务的调度实体。
[0003]任务调度时,调度器会根据调度类优先级,会先查看stop_sched_class调度类中是否有就绪的任务,如果有,停止查找,取出任务后进行任务切换,运行找到的任务。下次任务调度时,又会根据调度类优先级,先查看stop_sched_class调度类中是否有就绪的任务。如果stop_sched_class调度类中没有任务就绪,接着查看dl_sched_class类中是否有就绪的任务,以此类推,如果没有,后面依次查找rt_sched_class、fair_sched_class、idle_sched_class调度类,只要找到便停止并返回对应的任务。其实系统中stop_sched_class、dl_sched_class中很少会有就绪任务。
[0004]每个调度类中任务又采用不同的调度策略。比如针对fair_sched_class调度类中的任务采用CFS调度策略(完全公平调度策略),rt_sched_class调度类中的实时任务采用SCHED_FIFO或者SCHED_RR调度策略,以及dl_sched_class调度类中任务采用的SCHED_DEADLINE调度策略。
[0005]在rt_sched_class调度类中的任务,有两种不同的调度策略可以选择:SCHED_FIFO或者SCHED_RR。
[0006]在linux内核中,SCHED_FIFO和SCHED_RR这两种调度策略的实现基本上是一致的,都基于实时任务的优先级,遵循高优先级任务优先,并且高优先级任务可以抢占低优先级任务的远侧。在linux内核中SCHED_FIFO和SCHED_RR支持0~99共100个优先级,数值越小,优先级越高,并且每个优先级的任务都单独以链表形式维护,即以链表形式维护着100个任务就绪队列,相同优先级的SCHED_FIFO和SCHED_RR任务使用同一个就绪队列。
[0007]两种调度策略唯一的区别在于,对处于同一优先级上任务调度的处理。
[0008]对于同一优先级就绪队列中的任务,采用SCHED_FIFO调度策略的任务,采用先进先出的原则,先就绪的任务优先得到调度。新就绪的任务会默认放在就绪队列的尾部,当调度发生时,调度器会默认从就绪队列的头部选取任务进行调度,而参与调度的SCHED_FIFO任务会一直占用cpu运行,在它运行期间,可以被更高优先级的任务抢占,但是与它处于同一优先级的实时任务无法得到调度。直到它主动让出cpu后,调度器才会继续根据“先进先出”的原则,选择下一个相同优先级的任务放到cpu上运行。
[0009]而采用SCHED_RR调度策略的任务,就绪时同样会默认放到就绪队列的尾部,并同样的从队列头部选取任务进行调度。不同的是调度器会为每个SCHED_RR任务分配固定的运行时间片(Linux内核中默认SCHED_RR任务时间片为100ms),相同优先级的SCHED_RR任务会基于时间片依次轮流进行调度。即如果某一个优先级就绪队列中的任务不止一个时,采用SCHED_RR调度策略的任务得到调度放到CPU上运行后,本次最多只能运行100us,当其时间片耗尽后,调度器会将其重新放到就绪队列的队尾,从头部选择下一个任务放到CPU上执行,之前的任务只能等待下一次调度。
[0010]现有SCHED_FIFO和SCHED_RR调度策略,新任务被唤醒后都是放到其优先级所对应就绪队列的尾部,而任务调度时,都是从就绪队列的头部选取任务进行调度。目前的策略对于同一优先级的任务处理是一视同仁的,并没有对同一优先级任务进行区分,同一优先级任务只能按照任务唤醒的顺序一一从就绪队列中取出放到CPU上运行,这样并不十分合理。
[0011]SCHED_FIFO调度策略,对于就绪的同一优先级任务,都统一默认放到队列的尾部,并且要等队列前面先就绪的任务运行完后,才能够得到调度。SCHED_RR调度策略,也是统一将就绪的同一优先级的任务放到尾部,并且分配给每个任务的时间片固定为100ms。
[0012]但是,即便是相同优先级的任务,也是可以进行区分的,根据任务的工作不同,对调度时间和运行时间也不尽相同,也是可以有轻重缓急的区别的,但目前的SCHED_FIFO和SCHED_RR并不能做到这点。比如下面两种情况:1、采用SCHED_FIFO调度策略的某一优先级任务,当其就绪放入优先级对应的就绪队列时,队列中已经存在了其他任务,这些任务都与当前任务处于同一优先级,此时不管这个任务有多重要,多么迫切的希望得到CPU调度,都必须等待排在它前面的任务全部调度运行完毕后,调度器才会将其放到CPU核上去运行。而前面的任务运行时间不能确定,另外对调度时间要求可能也不如当前任务紧急,这样导致当前紧急重要的任务需要等待,并且等待时间不确定。
[0013]2、采用SCHED_RR调度策略的某一优先级任务唤醒就绪后,也是默认放到对应优先级就绪队列的尾部,等待着排在它前面的任务一一完成运行或者耗尽其时间片后,调度器将其放到CPU上运行,同样会有等待时间不确定问题。另外如果这个任务需要CPU运行的时间较长,它不得不一次次耗尽其时间片,然后需要重新排队,如果每次都从队尾开始排队,无疑会更加影响此任务的工作性能。
[0014]因此如果有办法可以对同一优先级上的任务进行区分,可以更加合理的安排相关任务的调度,在一定程度上也可以提高系统实时性能。

技术实现思路

[0015]为解决已有技术存在的不足,本专利技术提供了一种任务调度方法,包括:步骤S1:根据任务所处的优先级,将任务入队到对应调度类的对应优先级的就绪队列中,任务包括唤醒的任务以及由于被抢占或者耗尽时间片重新入队的任务;步骤S2:按照调度类的优先级以及就绪队列的优先级,从相应的就绪队列的队首选取任务执行;其中,在就绪队列中的任务的任务描述体中增加四个成员:runtime、sched_interval、score、no_sched_times,
runtime表示任务的平均运行时间,sched_interval表示任务的平均调度间隔,score表示任务评分,no_sched_times表示任务从就绪到得到CPU调度所经历的调度次数;根据runtime、sched本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种任务调度方法,其特征在于包括:步骤S1:根据任务所处的优先级,将任务入队到对应调度类的对应优先级的就绪队列中,任务包括唤醒的任务以及由于被抢占或者耗尽时间片重新入队的任务;步骤S2:按照调度类的优先级以及就绪队列的优先级,从相应的就绪队列的队首选取任务执行;其中,在就绪队列中的任务的任务描述体中增加四个成员:runtime、sched_interval、score、no_sched_times,runtime表示任务的平均运行时间,sched_interval表示任务的平均调度间隔,score表示任务评分,no_sched_times表示任务从就绪到得到CPU调度所经历的调度次数;根据runtime、sched_interval及no_sched_times为任务评分,在将唤醒的任务入队到对应调度类的对应优先级的就绪队列中时,评分越高,任务在就绪队列中的位置越靠近队首。2.如权利要求1所述的任务调度方法,其特征在于:任务描述体中增加的四个成员与任务评分的关系如下:任务的平均运行时间越短,评分越高;任务的平均调度间隔越短,评分越高;no_sched_times越高,评分越高。3.如权利要求2所述的任务调度方法,其特征在于:在步骤S1中,将任务入队到对应调度类的对应优先级的就绪队列中时,根据任务的平均运行时间及平均调度间隔更新任务评分,并根据更新后的任务评分将任务入队到就绪队列中的合适位置。4.如权利要求3所述的任务调度方法,其特征在于:在步骤S1中,将任务入队到对应...

【专利技术属性】
技术研发人员:李明强淡建群
申请(专利权)人:麒麟软件有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1