CN117032993A - 任务调度方法 - Google Patents

任务调度方法 Download PDF

Info

Publication number
CN117032993A
CN117032993A CN202311287739.0A CN202311287739A CN117032993A CN 117032993 A CN117032993 A CN 117032993A CN 202311287739 A CN202311287739 A CN 202311287739A CN 117032993 A CN117032993 A CN 117032993A
Authority
CN
China
Prior art keywords
task
scheduling
time
score
tasks
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202311287739.0A
Other languages
English (en)
Other versions
CN117032993B (zh
Inventor
李明强
淡建群
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Kirin Software Co Ltd
Original Assignee
Kirin Software Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Kirin Software Co Ltd filed Critical Kirin Software Co Ltd
Priority to CN202311287739.0A priority Critical patent/CN117032993B/zh
Publication of CN117032993A publication Critical patent/CN117032993A/zh
Application granted granted Critical
Publication of CN117032993B publication Critical patent/CN117032993B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
    • G06F9/5038Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/4881Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Telephonic Communication Services (AREA)

Abstract

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

Description

任务调度方法
技术领域
本发明涉及资源调度优化技术领域,具体涉及一种针对相同优先级的就绪队列中的任务的调度方法。
背景技术
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调度类的描述,所涉及到的队列均表示实时任务链表,链表中放的是任务的调度实体。
任务调度时,调度器会根据调度类优先级,会先查看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中很少会有就绪任务。
每个调度类中任务又采用不同的调度策略。比如针对fair_sched_class调度类中的任务采用CFS调度策略(完全公平调度策略),rt_sched_class调度类中的实时任务采用SCHED_FIFO或者SCHED_RR调度策略,以及dl_sched_class调度类中任务采用的SCHED_DEADLINE调度策略。
在rt_sched_class调度类中的任务,有两种不同的调度策略可以选择:SCHED_FIFO或者SCHED_RR。
在linux内核中,SCHED_FIFO和SCHED_RR这两种调度策略的实现基本上是一致的,都基于实时任务的优先级,遵循高优先级任务优先,并且高优先级任务可以抢占低优先级任务的远侧。在linux内核中SCHED_FIFO和SCHED_RR支持0~99共100个优先级,数值越小,优先级越高,并且每个优先级的任务都单独以链表形式维护,即以链表形式维护着100个任务就绪队列,相同优先级的SCHED_FIFO和SCHED_RR任务使用同一个就绪队列。
两种调度策略唯一的区别在于,对处于同一优先级上任务调度的处理。
对于同一优先级就绪队列中的任务,采用SCHED_FIFO调度策略的任务,采用先进先出的原则,先就绪的任务优先得到调度。新就绪的任务会默认放在就绪队列的尾部,当调度发生时,调度器会默认从就绪队列的头部选取任务进行调度,而参与调度的SCHED_FIFO任务会一直占用cpu运行,在它运行期间,可以被更高优先级的任务抢占,但是与它处于同一优先级的实时任务无法得到调度。直到它主动让出cpu后,调度器才会继续根据“先进先出”的原则,选择下一个相同优先级的任务放到cpu上运行。
而采用SCHED_RR调度策略的任务,就绪时同样会默认放到就绪队列的尾部,并同样的从队列头部选取任务进行调度。不同的是调度器会为每个SCHED_RR任务分配固定的运行时间片(Linux内核中默认SCHED_RR任务时间片为100ms),相同优先级的SCHED_RR任务会基于时间片依次轮流进行调度。即如果某一个优先级就绪队列中的任务不止一个时,采用SCHED_RR调度策略的任务得到调度放到CPU上运行后,本次最多只能运行100us,当其时间片耗尽后,调度器会将其重新放到就绪队列的队尾,从头部选择下一个任务放到CPU上执行,之前的任务只能等待下一次调度。
现有SCHED_FIFO和SCHED_RR调度策略,新任务被唤醒后都是放到其优先级所对应就绪队列的尾部,而任务调度时,都是从就绪队列的头部选取任务进行调度。目前的策略对于同一优先级的任务处理是一视同仁的,并没有对同一优先级任务进行区分,同一优先级任务只能按照任务唤醒的顺序一一从就绪队列中取出放到CPU上运行,这样并不十分合理。
SCHED_FIFO调度策略,对于就绪的同一优先级任务,都统一默认放到队列的尾部,并且要等队列前面先就绪的任务运行完后,才能够得到调度。SCHED_RR调度策略,也是统一将就绪的同一优先级的任务放到尾部,并且分配给每个任务的时间片固定为100ms。
但是,即便是相同优先级的任务,也是可以进行区分的,根据任务的工作不同,对调度时间和运行时间也不尽相同,也是可以有轻重缓急的区别的,但目前的SCHED_FIFO和SCHED_RR并不能做到这点。比如下面两种情况:
1、采用SCHED_FIFO调度策略的某一优先级任务,当其就绪放入优先级对应的就绪队列时,队列中已经存在了其他任务,这些任务都与当前任务处于同一优先级,此时不管这个任务有多重要,多么迫切的希望得到CPU调度,都必须等待排在它前面的任务全部调度运行完毕后,调度器才会将其放到CPU核上去运行。而前面的任务运行时间不能确定,另外对调度时间要求可能也不如当前任务紧急,这样导致当前紧急重要的任务需要等待,并且等待时间不确定。
2、采用SCHED_RR调度策略的某一优先级任务唤醒就绪后,也是默认放到对应优先级就绪队列的尾部,等待着排在它前面的任务一一完成运行或者耗尽其时间片后,调度器将其放到CPU上运行,同样会有等待时间不确定问题。另外如果这个任务需要CPU运行的时间较长,它不得不一次次耗尽其时间片,然后需要重新排队,如果每次都从队尾开始排队,无疑会更加影响此任务的工作性能。
因此如果有办法可以对同一优先级上的任务进行区分,可以更加合理的安排相关任务的调度,在一定程度上也可以提高系统实时性能。
发明内容
为解决已有技术存在的不足,本发明提供了一种任务调度方法,包括:
步骤S1:根据任务所处的优先级,将任务入队到对应调度类的对应优先级的就绪队列中,任务包括唤醒的任务以及由于被抢占或者耗尽时间片重新入队的任务;
步骤S2:按照调度类的优先级以及就绪队列的优先级,从相应的就绪队列的队首选取任务执行;
其中,在就绪队列中的任务的任务描述体中增加四个成员:runtime、sched_interval、score、no_sched_times,
runtime表示任务的平均运行时间,sched_interval表示任务的平均调度间隔,score表示任务评分,no_sched_times表示任务从就绪到得到CPU调度所经历的调度次数;
根据runtime、sched_interval及no_sched_times为任务评分,在将唤醒的任务入队到对应调度类的对应优先级的就绪队列中时,评分越高,任务在就绪队列中的位置越靠近队首。
其中,任务描述体中增加的四个成员与任务评分的关系如下:
任务的平均运行时间越短,评分越高;
任务的平均调度间隔越短,评分越高;
no_sched_times越高,评分越高。
其中,在步骤S1中,将任务入队到对应调度类的对应优先级的就绪队列中时,根据任务的平均运行时间及平均调度间隔更新任务评分,并根据更新后的任务评分将任务入队到就绪队列中的合适位置。
其中,在步骤S1中,将任务入队到对应调度类的对应优先级的就绪队列中时,如果当前的任务已经连续预定次数因为高评分被入队到就绪队列靠近队首的位置,则降低其任务评分;如果当前的任务已经连续预定次数因为低评分被入队到就绪队列靠近队尾的位置,则提高其任务评分。
其中,针对调度策略为SCHED_RR的任务,在任务执行过程中,检查其时间片是否耗尽,如果时间片耗尽,则将该任务重新入队,并且,在重新入队的时候,根据任务的平均运行时间及平均调度间隔更新任务评分,并在此基础上,降低更新后的任务评分,并基于降低后的任务评分将任务入队到就绪队列中的合适位置。
其中,任务创建后首次唤醒入队时,平均运行时间、平均调度间隔及no_sched_times均为0;
之后再次入队时,平均运行时间及平均调度间隔根据之前执行的结果而定,而no_sched_times重置为0;
在步骤S2中,每次从就绪队列的队首选取任务执行时,发生任务切换,根据任务切换的时间,更新切换前的任务的平均运行时间,以及切换后的任务的平均调度间隔,同时,将该就绪队列中所有未被选取的任务的no_sched_times值加1。
其中,在步骤S2中,每次从就绪队列的队首选取任务执行时,发生任务切换,将该就绪队列中所有未被选取的任务的no_sched_times值加1,同时,针对就绪队列中no_sched_times值大于预定次数的任务,增加其任务评分。
本发明改变了比较刻板的同一优先级SCHED_FIFO/SCHED_RR任务的调度策略,使SCHED_FIFO/SCHED_RR调度策略对处于同一优先级的实时任务的调度更加合理。增加的任务评分机制,可以根据自动为任务进行评分,来区分同一优先级任务调度的紧急程度,让那些运行时间短、调度间隔短的任务更早得到调度,使Linux内核调度器中rt_sched_class调度类中的实时任务调度更加合理有效。从某些方面来看,一定程度上提高了系统的实时性,对于使用PREEMPT RT patch改造后的实时linux作用更大。
附图说明
图1:已有的任务入队流程图。
图2:已有的任务调度流程图。
图3:本发明的任务入队流程图。
图4:本发明的任务调度流程图。
具体实施方式
为了对本发明的技术方案及有益效果有更进一步的了解,下面结合附图详细说明本发明的技术方案及其产生的有益效果。
已有的Linux系统中,rt调度类的任务或者采用SCHED_FIFO调度策略,或者采用SCHED_RR调度策略时,这两种调度策略在处理同一优先级的任务时,一种采用先进先出的调度方式,一种采用时间片轮转的调度方式,这两种方式都比较固化,不够灵活,不能对同一优先级的任务进行区分。
针对该缺陷,本发明提供给一种优化方案,调度器自动为任务进行评分,并且可通过任务评分,智能的安排同优先级的rt任务的调度,多个rt任务处于同一优先级时,评分越高的任务可以越早的得到调度。
rt_sched_class调度类的实现涉及任务入队和任务调度。任务入队便是将任务放到CPU的就绪队列中,使其处于可调度状态;任务调度,便是从对应的就绪队列中找到下一个将要调度的任务,将其放到CPU上去运行。
1、任务入队
图1为已有的rt_sched_class调度类的任务入队流程图,如图1所示,在linux内核调度器中,入队涉及到两种情况:任务由休眠状态被唤醒或者创建后首次被唤醒,并入队;以及,任务经过调度执行后没有执行完毕需要重新入队以等待下次调度并执行。
针对第一种情况:任务唤醒最终都会统一调到try_to_wake_up()接口来实现。
如对于执行完后需要重新入队的任务,如果任务主动放弃CPU(本次运行结束主动休眠或者由于条件不满足休眠),此时任务退出可运行状态,此时任务处于休眠状态,等待下次条件满足后,会被重新唤醒入队,属于这里的第一种情况。或者,任务被创建后唤醒并首次入队,也属于这里的第一种情况。
try_to_wake_up()整个唤醒任务的实现虽然比较复杂,但是主要工作确比较简单,具体如下:
(1)通过select_task_rq()函数为即将要唤醒的任务选择合适的CPU,找到CPU上的任务就绪队列rq,select_task_rq()函数执行时,通过activate_task()方法,执行任务唤醒,此时,会将此任务放入对应的CPU上对应的就绪队列中。此过程会根据任务所属的调度类(sched_class)不同,执行不同的入队操作。SCHED_FIFO和SCHED_RR调度策略均属于调度类rt_sched_class的调度策略,所以这里通过执行rt_sched_class的入队方法enqueue_task实现,具体步骤:通过enqueue_task_rt(),获取当前任务的调度实体rt_se,然后调用enqueue_rt_entity()方法,将任务的调度实体加入对应优先级的调度队列中。enqueue_rt_entity()首先根据任务的优先级,找到rt_sched_class调度类中,优先级对应的任务就绪队列链表,然后将调度实体插入就绪队列链表中,默认插入链表尾部。
(2)当任务入队后,执行ttwu_do_wakeup()方法,主要完成后面两个工作:
查看当前任务是否可以抢占正在运行的任务,如果是,设置标志TIF_NEED_RESCHED,那么当下次从内核空间返回用户空间或者从中断处理返回时,便会发生任务切换,例如:当前正在运行任务A,而唤醒的任务B可以抢占正在运行的任务A,则设置标志TIF_NEED_RESCHED(TIF_NEED_RESCHED标识是内核调度器中的标识,不属于某一个任务),当下次从内核空间返回用户空间或者从中断处理返回时,检查到TIF_NEED_RESCHED标识被设置后,会进行完整的任务调度过程(从就绪队列中查找任务进行任务切换),任务A被抢占,任务A重新入队,等待下次调度。
设置当前任务的状态TASK_RUNNING,表明任务处于可运行状态。
针对第二种情况:任务经过的调度执行后没有执行完毕需要重新入队以等待下次调度并执行,也即,任务是被动放弃CPU(被高优先级任务抢占或者耗尽时间片);或者,任务主动放弃CPU后休眠结束重新入队,由于任务仍然处于可运行状态,所以不需要唤醒动作,只需要采用requeue_task_rt()函数使其重新入队,在将任务重新插入就绪队列时,在requeue_task_rt()中会调用requeue _rt_entity()。同时,采用resched_curr()方法完成标志的设置 (resched_curr()不会设置任务状态)。
2、任务调度
任务调度可分为两种:
一种是主动显式的调用schedule(),如任务主动休眠或者条件不满足时主动放弃CPU;
另一种是从内核返回用户空间或者从中断返回时,检查TIF_NEED_RESCHED标志被设置后的被动任务切换和调度(如上文提到的任务A被抢占后再次被调度),或者任务时间片耗尽后再次入队等待下次调度的被动调度。
不管主动的任务调度,还是被动的任务调度,最终都需要调用__schedule()完成,其整体实现比较复杂,但其最重要的工作有两个:1)通过pick_next_task()找到下一个将要切换的任务;2)通过context_switch()进行任务的上下文切换,然后cpu开始执行新的任务。
图2为已有的rt_sched_class调度类的任务调度流程图,如图2所示,任务调度完整的实现流程如下:
(1)rt_sched_class任务中pick_next_task的实现为pick_next_task_rt(),这个函数首先通过pick_next_rt_entity()找到将要调度的任务实体rt_se,然后通过rt_task_of(rt_se)找到调度实体对应的任务描述,即为下一个将要调度的任务。
pick_next_rt_entity()寻找调度实体时,会优先从优先级高的就绪队列中查找。如果,某一个优先级就绪队列中存在不止一个任务,便默认选择队首的任务,这里并不考虑任务采用的调度策略时SCHED_FIFO还是SCHED_RR。
(2)选中下一个任务后通过context_switch(rq, prev, next, rq_flags)进行上下文切换,即当前执行的任务从prev切换到next。
这里的prev和next为context_switch()函数的两个参数,都是表示任务。任务调度发生时,首先要找到下一个要运行的任务,然后通过context_switch()进行上下文切换(这里可以理解为就是任务切换,切换完后,开始运行新的任务),prev任务切换前的前一个任务,next是前面找到的将要执行的下一个任务。
在linux内核调度器中,任务是通过结构体struct task_struct表示(prev和next都属于struct task_struct变量),里面有任务所有相关的属性,在struct task_struct结构体中,有一个成员struct sched_rt_entity rt,表示实时任务调度实体,在rt_sched_class调度类的就绪队列中维护着100个任务链表(与实时任务优先级一一对应),链表中存放的就是任务的调度实体,任务插入链表和从链表中取出操作的也是实时任务的调度实体。也就是说,在任务就绪插入队列时,先从任务的结构体描述struct task_struct中找出其调度实体,将其插入就绪队列中的任务链表。从就绪队列中查找下一个运行任务时,也是先从任务链表中获取调度实体,然后通过调度实体获取其对应的任务(struct task_struct结构体变量)。
(3)SCHDE_FIFO和SCHED_RR调度策略的区别在于,当CPU上的时钟tick到来后,在scheduler_tick()处理中,会判断如果当前运行的任务采用SCHED_RR的调度策略,那么判断其时间片是否耗尽,如果耗尽,那么通过requeue_task_rt()将此任务重新放到对应的就绪队列尾部,然后从就绪队列的头部选择下一个任务进行调度。而SCHED_FIFO任务不受此影响,可以一直运行,直到它主动放弃CPU或者被更高优先级的任务抢占。
scheduler_tick()中会调用当前任务所在调度类对应的task_tick()函数,实时任务调度类rt_sched_class中task_tick()的具体实现为task_tick_rt()。
也即,如果CPU上当前正在运行的任务为实时任务,那么在系统时钟tick到来后执行scheduler_tick()函数,而scheduler_tick()会调用task_tick_rt()函数,在task_tick_rt()函数中进行判断是否是SCHED_RR任务耗尽了时间片。
3、本发明的总体思路
本发明在以上任务唤醒和任务调度的基础之上,增加对就绪的同一优先级SCHED_FIFO/SCHED_RR任务的评分机制,并根据任务评分的高低,来决定同一优先级任务的调度顺序,评分越高的任务,可以越早得到调度。
其整体思路如下:首先需要在linux内核任务描述结构体struct task_struct中增加四个成员:runtime、sched_interval、score、no_sched_times。
runtime、sched_interval、score用来表示SCHED_FIFO或者SCHED_RR任务的平均运行时间、平均调度间隔、以及任务评分。而no_sched_times表示任务从就绪到得到CPU调度所经历的调度次数,用来防止任务评分低长时间得不到调度。
以上结构体的初始化原则、更新原则以及其与任务评分的关系如下:
(1)、任务的平均运行时间runtime和平均调度时间间隔sched_interval
在SCHED_FIFO/SCHED_RR任务创建时,将任务的平均运行时间runtime和平均调度时间间隔sched_interval置为“0”。
每次任务切换context_switch()中更新本次切换所涉及到的任务的调度开始时间和调度结束时间,重新计算本次切换所涉及到的任务的平均运行时间和平均调度时间间隔,用于下次任务入队时评估其评分使用:在context_switch中,记录当前时间,分别保存在前一个任务prev的停止时间和下一个任务next的开始时间中,下一次任务切换时,再次执行相同的动作,这样就可以,计算出任务的运行时间和两次调度的间隔时间,进而可以计算出任务的每次平均运行时间和平均调度间隔。
例如:比如有两个采用SCHED_FIFO或者SCHED_RR调度策略的任务P1、P2,当发生任务切换,从任务P1要切换到任务P2时,在context_switch中记录时间t1,t1便为P1的停止调度时间和任务P2的开始调度时间,在下次任务切换时,记录时间t2,t2便为任务P2 的停止调度时间,那么任务P2的运行时间便为t2 - t1。如果此时是从任务P2切换到任务P1,那么P1的调度间隔时间也是t2 - t1。如果不是,那么等待要切换到任务P1时,在context_switch中记录时间t3,便为任务P1的下一次开始调度时间,任务P1的调度间隔便为t3 - t1(在t3 - t1期间,无需考虑任务P1的状态,即使任务P1在此期间有一段时间处于休眠状态,其调度间隔仍然为t3 - t1,只有任务P1被销毁后,重建并重新唤醒、入队,才将其运行时间和调度时间间隔都初始化为0)。
利用这个机制,我们可以计算出每一个任务每次得到调度的运行时间和两次调度之间的时间间隔,进而可以计算出任务的每次平均运行时间和平均调度间隔。
任务每次唤醒时,根据任务的之前的任务运行时间和时间间隔对任务进行评分,如果运行时间和调度间隔均为“0” (这种情况针对任务被创建后第一次唤醒的情况),表明任务创建后第一次被唤醒,默认给其中等评分。如果运行时间和调度间隔不为“0”(这种情况涉及以下三种情况:SCHED_RR策略中运行时间大于时间片,从而需要经过多次调度;或者涉及任务在运行过程中被抢占,如上文所举的任务A被抢占,导致其未运行完毕即需要重新入队的情况;或者任务从休眠状态被唤醒后重新入队的情况),根据规则对其评分进行增减,规则为:运行时间和调度间隔越短的任务,评分越高 ,反之则越低(评分越高,越早得到调度)。运行时间越短,说明占用CPU的时间越少,对其他实时任务影响也越小,所以尽量让其先运行。调度时间间隔越短,表明调度比较频繁,对实时性要求较为严格,同样给于其高评分,让其优先得到调度。
为防止高评分任务一直插队,导致低评分任务无法得到调度,在此增加干扰机制:如果当前任务连续高评分并且连续插入队列前部次数大于5次,适当降低其评分score值,防止此任务一直优先被调度,而影响队列中低评分任务的调度。反之,如果当前任务连续低评分10次,导致其总是插入队列后部分,则提高其评分,使其能够插到就绪队列前部。根据任务评分score,将唤醒的任务插入就绪队列的合适位置,而非之前直接插入到队尾。score值越高,说明任务评分越高,其在就绪队列中位置将会越靠前,能够越早得到CPU调度。
(2)、no_sched_times
在唤醒阶段需要对唤醒任务的调度次数no_sched_times赋值为“0”。
同时,任务每次重新入队后,其no_sched_times也被重置为0(针对休眠后重新被唤醒并入队的任务亦是)。
在任务调度pick_next_task_rt()阶段,仍然从就绪队列头部选中任务作为下一个调度的任务。不同的是,在选中任务后,将队列中其他任务的no_sched_times值加“1”,如果有任务的no_sched_times大于“5”,表明此任务长时间未得到调度,增加其评分值,将其重新插入就绪队列的合适位置,避免其长时间无法得到调度。
在此需要说明的是,针对SCHED_RR策略中的任务,如果检测到其耗尽其时间片,在重新插入队列requeue_task_rt()中,适当降低其评分,然后根据评分将任务插入就绪队列的合适位置,而非之前直接插到就绪队列尾部。
其中,requeue_task_rt()在执行时会调用requeue_rt_entity()函数,将任务的调度实体插入任务链表。
任务评分score的计算公式如下:
score =score_r 70% + score_i /> 30%。
score_r平均运行时间runtime确定,任务的runtime越小score_r取值越高。score_i根据平均调度间隔确定,任务的sched_interval越小,score_i值越高。根据任务运行时间和调度间隔,对系统实时任务调度的影响的区别,评分score取值中,score_r权重大些,为70%,score_i为30%;score_r和score_i取值范围均为 0-10,所以score取值范围也为0-10。
如果当前任务连续五次评分值高于7并且连续插入队列前部次数大于5次,将其评分score值减5;如果当前任务连续10次评分低于3,导致其总是插入队列后部分,则将其评分score值加5。
当SCHED_RR任务时间片耗尽后,根据上述公式计算出任务评分score后,同时对其评分score值进行减2操作,评分最低为“0”,这样可以避免其重新入队时,又直接插入就绪队列的头部。
在任务调度pick_next_task_rt()阶段,在选中任务后,将队列中其他任务的no_sched_times值加“1”,如果有任务的no_sched_times大于“5”,则将其评分score值进行加2操作。
score_r的计算公式如下:
首先根据正常系统中任务运行时间的大概分布状况,对runtime进行区间划分,每个区间都有一个基础分。
score_r = 区间基础分 + (runtime - 区间最小值) / (区间最大值 - 区间最小值)。
任务runtime 大于 1s时,score_r将统一为“0”,不做区分,正常的系统中连续运行超过1s的任务属于极小概率事件,几乎不可能发生。
score_r区间及计算方法如下:
Score_i的计算方法与score_r类似,都是根据系统正常情况下的平均调度间隔及实时应用程序休眠时间的分布情况,对任务调度间隔sched_interval进行区间划分,每个区间都有一个基础分。
score_i = 区间基础分 + ( sched_interval - 区间最小值) / (区间最大值 -区间最小值)。
任务sched_interval大于 1000s时,score_i将统一为“0”,不做区分,正常的系统中如果一个任务休眠1000s后才被唤醒,那么将其放在同一优先级任务的最后进行调度,是一种比较合理的方式。
score_i区间及计算方法如下:
综上,任务评分的公式如下:
score_r = 区间基础分 + (runtime - 区间最小值) / (区间最大值 - 区间最小值)。
score_i = 区间基础分 + ( sched_interval - 区间最小值) / (区间最大值 -区间最小值)。
score = score_r 70% + score_i />30%
本发明改变了比较刻板的同一优先级SCHED_FIFO/SCHED_RR任务的调度策略,使SCHED_FIFO/SCHED_RR调度策略对处于同一优先级的实时任务的调度更加合理。增加的任务评分机制,可以根据自动为任务进行评分,来区分同一优先级任务调度的紧急程度,让那些运行时间短、调度间隔短的任务更早得到调度,使Linux内核调度器中rt_sched_class调度类中的实时任务调度更加合理有效。从某些方面来看,一定程度上提高了系统的实时性,对于使用PREEMPT RT patch改造后的实时linux作用更大。
虽然本发明已利用上述较佳实施例进行说明,然其并非用以限定本发明的保护范围,任何本领域技术人员在不脱离本发明的精神和范围之内,相对上述实施例进行各种变动与修改仍属本发明所保护的范围,因此本发明的保护范围以权利要求书所界定的为准。

Claims (7)

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中,将任务入队到对应调度类的对应优先级的就绪队列中时,如果当前的任务已经连续预定次数因为高评分被入队到就绪队列靠近队首的位置,则降低其任务评分;如果当前的任务已经连续预定次数因为低评分被入队到就绪队列靠近队尾的位置,则提高其任务评分。
5.如权利要求3所述的任务调度方法,其特征在于:针对调度策略为SCHED_RR的任务,在任务执行过程中,检查其时间片是否耗尽,如果时间片耗尽,则将该任务重新入队,并且,在重新入队的时候,根据任务的平均运行时间及平均调度间隔更新任务评分,并在此基础上,降低更新后的任务评分,并基于降低后的任务评分将任务入队到就绪队列中的合适位置。
6.如权利要求2所述的任务调度方法,其特征在于:
任务创建后首次唤醒入队时,平均运行时间、平均调度间隔及no_sched_times均为0;
之后再次入队时,平均运行时间及平均调度间隔根据之前执行的结果而定,而no_sched_times重置为0;
在步骤S2中,每次从就绪队列的队首选取任务执行时,发生任务切换,根据任务切换的时间,更新切换前的任务的平均运行时间,以及切换后的任务的平均调度间隔,同时,将该就绪队列中所有未被选取的任务的no_sched_times值加1。
7.如权利要求6所述的任务调度方法,其特征在于:在步骤S2中,每次从就绪队列的队首选取任务执行时,发生任务切换,将该就绪队列中所有未被选取的任务的no_sched_times值加1,同时,针对就绪队列中no_sched_times值大于预定次数的任务,增加其任务评分。
CN202311287739.0A 2023-10-08 2023-10-08 任务调度方法 Active CN117032993B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311287739.0A CN117032993B (zh) 2023-10-08 2023-10-08 任务调度方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311287739.0A CN117032993B (zh) 2023-10-08 2023-10-08 任务调度方法

Publications (2)

Publication Number Publication Date
CN117032993A true CN117032993A (zh) 2023-11-10
CN117032993B CN117032993B (zh) 2024-04-05

Family

ID=88632197

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311287739.0A Active CN117032993B (zh) 2023-10-08 2023-10-08 任务调度方法

Country Status (1)

Country Link
CN (1) CN117032993B (zh)

Citations (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050281279A1 (en) * 2004-06-09 2005-12-22 Avici Systems, Inc. Latency-based scheduling and dropping
US20090222600A1 (en) * 2008-02-29 2009-09-03 Douglas Lee Lehr Apparatus, system, and method for enqueue prioritization
CN101923487A (zh) * 2010-08-06 2010-12-22 西华师范大学 一种综合嵌入式实时周期任务调度方法
US20130117756A1 (en) * 2011-11-08 2013-05-09 Electronics And Telecommunications Research Institute Task scheduling method for real time operating system
CN109639595A (zh) * 2018-09-26 2019-04-16 北京云端智度科技有限公司 一种基于时延的cdn动态优先级调度算法
CN111274024A (zh) * 2019-03-19 2020-06-12 中标软件有限公司 基于cfs调度器的就绪队列平均负载优化方法及数据结构
CN111506397A (zh) * 2020-01-21 2020-08-07 广东工业大学 一种基于linux实时操作系统的单调速率优先级调度方法
CN112395067A (zh) * 2020-12-04 2021-02-23 深圳前海微众银行股份有限公司 任务调度方法、系统、设备及介质
CN113688053A (zh) * 2021-09-01 2021-11-23 北京计算机技术及应用研究所 云化测试工具的排队使用方法和系统
CN113778646A (zh) * 2021-08-22 2021-12-10 物产中大公用环境投资有限公司 一种基于执行时间预测的任务层级调度方法及装置
CN115129455A (zh) * 2022-07-22 2022-09-30 济南浪潮数据技术有限公司 一种共享资源访问的方法、装置、服务器及介质
CN115437784A (zh) * 2022-08-22 2022-12-06 麒麟软件有限公司 一种针对smp系统的实时任务调度优化方法
WO2022252456A1 (zh) * 2021-06-01 2022-12-08 苏州浪潮智能科技有限公司 一种任务调度方法、装置、电子设备及可读存储介质
CN115755785A (zh) * 2022-10-26 2023-03-07 西安空间无线电技术研究所 一种基于多级动态优先级的自主任务调度方法及系统
CN116089033A (zh) * 2022-12-28 2023-05-09 天翼云科技有限公司 一种基于多级异构动态队列的任务调度方法
CN116820769A (zh) * 2023-06-30 2023-09-29 杭州海康威视数字技术股份有限公司 一种任务分配方法、装置及系统

Patent Citations (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050281279A1 (en) * 2004-06-09 2005-12-22 Avici Systems, Inc. Latency-based scheduling and dropping
US20090222600A1 (en) * 2008-02-29 2009-09-03 Douglas Lee Lehr Apparatus, system, and method for enqueue prioritization
CN101923487A (zh) * 2010-08-06 2010-12-22 西华师范大学 一种综合嵌入式实时周期任务调度方法
US20130117756A1 (en) * 2011-11-08 2013-05-09 Electronics And Telecommunications Research Institute Task scheduling method for real time operating system
CN109639595A (zh) * 2018-09-26 2019-04-16 北京云端智度科技有限公司 一种基于时延的cdn动态优先级调度算法
CN111274024A (zh) * 2019-03-19 2020-06-12 中标软件有限公司 基于cfs调度器的就绪队列平均负载优化方法及数据结构
CN111506397A (zh) * 2020-01-21 2020-08-07 广东工业大学 一种基于linux实时操作系统的单调速率优先级调度方法
CN112395067A (zh) * 2020-12-04 2021-02-23 深圳前海微众银行股份有限公司 任务调度方法、系统、设备及介质
WO2022252456A1 (zh) * 2021-06-01 2022-12-08 苏州浪潮智能科技有限公司 一种任务调度方法、装置、电子设备及可读存储介质
CN113778646A (zh) * 2021-08-22 2021-12-10 物产中大公用环境投资有限公司 一种基于执行时间预测的任务层级调度方法及装置
CN113688053A (zh) * 2021-09-01 2021-11-23 北京计算机技术及应用研究所 云化测试工具的排队使用方法和系统
CN115129455A (zh) * 2022-07-22 2022-09-30 济南浪潮数据技术有限公司 一种共享资源访问的方法、装置、服务器及介质
CN115437784A (zh) * 2022-08-22 2022-12-06 麒麟软件有限公司 一种针对smp系统的实时任务调度优化方法
CN115755785A (zh) * 2022-10-26 2023-03-07 西安空间无线电技术研究所 一种基于多级动态优先级的自主任务调度方法及系统
CN116089033A (zh) * 2022-12-28 2023-05-09 天翼云科技有限公司 一种基于多级异构动态队列的任务调度方法
CN116820769A (zh) * 2023-06-30 2023-09-29 杭州海康威视数字技术股份有限公司 一种任务分配方法、装置及系统

Also Published As

Publication number Publication date
CN117032993B (zh) 2024-04-05

Similar Documents

Publication Publication Date Title
JP3987384B2 (ja) 実行キュー管理
JP4694595B2 (ja) スリープキュー管理
CN107273141B (zh) 嵌入式实时操作系统
US10271326B2 (en) Scheduling function calls
CN111767134A (zh) 一种多任务动态资源调度方法
CN111897637B (zh) 作业调度方法、装置、主机及存储介质
CN101339521A (zh) 一种任务优先级动态调度算法
CN107203428B (zh) 一种基于Xen的VCPU多核实时调度算法
CN109117280B (zh) 电子装置及其限制进程间通信的方法、存储介质
KR100617228B1 (ko) 실시간 운영체계 커널의 이벤트 전달 체계 구현방법
JP2011501309A (ja) リアルタイム・オペレーティング・システムにおけるプリエンプションの管理方法
CN108563494A (zh) 一种自适应动态调整的线程调度系统及方法
CN111597044A (zh) 任务调度方法、装置、存储介质及电子设备
CN117032993B (zh) 任务调度方法
CN112579271A (zh) 用于非实时操作系统的实时任务调度方法、模块、终端和存储介质
CN113986484B (zh) 社交软件的任务处理全局调度方法
JPH09319597A (ja) 周期的プロセスのスケジューリング方法
JP2000148513A (ja) タスク制御方法およびタスク制御装置
CN111930488B (zh) 一种操作系统任务调度的优先级继承方法及系统
CN114911591A (zh) 任务调度方法及系统
CN111813531A (zh) 一种操作系统时钟调度方法及系统
CN117931412B (zh) 一种双内核实时操作系统及任务调度方法
CN116932227B (zh) 一种基于单线程的任务调度方法及装置
JP2667575B2 (ja) タスクスケジューリング方式
Abielmona Scheduling algorithmic research

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant