法律状态公告日
法律状态信息
法律状态
2013-09-18
未缴年费专利权终止 IPC(主分类):G06F9/46 授权公告日:20110420 终止日期:20120728 申请日:20080728
专利权的终止
2011-04-20
授权
授权
2009-02-25
实质审查的生效
实质审查的生效
2009-01-07
公开
公开
技术领域
本发明涉及实时系统中的任务调度技术领域,具体涉及一种任务优先级动态调度算法。
背景技术
对实时调度算法的研究,是实时领域的一个重要的研究课题。优先级驱动方式是实时系统调度的最常用的方式,实现的方法是给每一个任务一个优先级,在每一个调度时机选择优先级最高的任务得到运行。基于优先级的调度方式又可以分为两大类:静态与动态优先级调度。静态优先级调度中,优先级的初值是由任务的特定信息确定的,且在运行过程中是不变的;在动态优先级调度算法中,任务的调度优先级随着任务中任务运行而变化,任务优先级不仅仅与任务自身有关系,而且与系统中其它的任务有关。
常用的静态优先级调度算法有RM(Rate-Monotonic)算法和DM(Deadline-Monotonic)算法;动态优先级调度算法有经典的EDF(EarliestDeadline First)。静态优先级调度算法任务的调度时刻确定,实现起来简单,但是CPU利用率不高,相对于静态优先级调度算法,动态优先级调度算法体现更大的灵活性,系统在运行中是根据临时的任务的紧迫程度来确定优先级,因此其显得更合理,但是系统的调度也更复杂,也表现出了更多的不确定性,特别是在系统超负荷的情况下,EDF算法的截止期错失率急剧增加,调度成功率下降很快,因此基于EDF调度策略改进,减小截止期限错失率(DMR),减小任务平均延迟,增加调度成功率,对于软实时的应用有重要意义。
在实时调度系统中,实时任务分为周期和非周期两种,常见的实时任务都是周期性的。假定周期任务组为τ={T1,T2,…Tn},n为任务的个数,其中Ti=(ei,di,pi,ri)是任意一个周期任务,ei,di,pi是正实数,分别表示该周期任务的周期内的,执行时间,完成时限,周期大小。ri是非负实数,表示该任务的初始释放时刻(任务投入运行时刻)。用ri,k表示周期任务Ti在第K周期的释放时刻,则第K周期的相应的完成时限为di,k=ri,k+di。在上述任务组情况下进行调度。
最早的EDF调度算法是采用非抢占式的,如果一个实时任务在分配的执行时间之前完成本周期内的工作,则在这个空闲时间内其它实时任务也不能运行,CPU将处于相对空闲状态(可能执行非实时任务,可能idle)。
如果一个实时任务超出了自己的执行时间(overrun),工作没有结束,则将保持当前的高优先级继续执行下去,这样就会顺延本来已经安排后后面的任务,形成“多米诺”效应,造成多个任务超出截止时间。
发明内容
本发明的目的在于提供一种任务优先级动态调度算法,该算法可以克服在系统超负荷的情况动态优先级算法的截止期错失率急剧增加的问题,减小任务平均延迟,增加调度成功率,并能提高任务的公平性,对于执行时间E较大的任务来说不会出现过高截止期限错失率。
为了达到上述目的,本发明采用的技术方案为:
一种任务优先级动态调度算法,包括如下步骤:
(1)作业调度时刻到来时的作业调度:在任务调度时刻到来时,调度算法根据相应流程对任务进行调度;
(2)作业完成本周期工作转入睡眠的调度:一个任务的作业完成本周期的工作后转入睡眠状态并引发相应调度;
(3)动态优先级调度器执行调度算法:在最早截止期优先算法中加入期望执行时间e的因素。截止期相同时,期望执行时间比较大的任务,优先级更高。
上述调度算法中对于任意一个没有完成本周期工作的任务,其优先级计算方法为
式(1)
对于任意一个完成本周期工作的任务,其优先级计算方法为
式(2)
其中t为当前时间,p为该任务周期,d为该任务周期内截止期限,e为周期内执行时间,f是一个可调的系数,0<f<1.vdeadline最小的任务优先级最高。
上述调度算法中对于一个没有完成本周期工作的任务,不管它的运行时间是否超过预算,不管它是否超过期限,其任务状态一直为active。优先级都按照式(1)来计算。且在该任务每个周期的开始都会更新优先级,并按照这个优先级进行调度。
上述调度算法中对于一个完成本周期工作的任务,其任务状态设置为inactive,其任务的优先级按照式(2)重新计算。其下一次释放时间计算方法为
(式3)
对于一个没有完成本周期工作,且延迟至下一周期的任务,此时下一个周期将会丢失,其resume_time将会按照式(3)更新。
上述调度算法中调度是完全可抢占的,在每次调度的时刻,在所有的active任务选取一个优先级最高的任务“next”作为将要切换的任务,在包括所有的active,inactive任务中,选取一个优先级最高的任务“preemptor”,作为抢占任务。如果next==preemptor,则下一次调度时刻设置为next的resume_time;如果next!=preemptor,则将next的resume_time和preemptor的resume_time中的最小值作为下一次调度时刻。
上述调度算法步骤(1)的具体步骤为:
步骤a、在定时器到期,作业调度被触发之后,获取当前时间,并将时间保存到now变量中;获取当前任务的状态;
步骤b、循环遍历任务队列,依次找出任务队列中的任务的状态state为inactive的任务;对遍历得到的inactive的任务的resume_time和当前时间变量now进行比较;判断resume_time是否大于当前时间变量,如果是则继续遍历任务队列直到遍历完毕;如果否则设置该任务T的状态为active,并依照式(1)计算该任务的优先级并进行更新,依照式(3)计算该任务的resume_time并进行更新,完成后继续遍历任务队列直到遍历完毕;
步骤c、完成遍历后调用动态优先级调度过程进行调度。
上述调度算法步骤(2)的具体步骤为:
步骤a、设置当前任务的状态为inactive;
步骤b、调用动态优先级调度过程进行调度。
上述调度算法步骤(3)的具体步骤为:
步骤a、按照式(3)更新当前任务的resume_time,获取当前任务的状态,判断该任务状态是否为inactive状态,如果是则按照式(2)更新该任务的优先级,如果否则按照式(1)更新该任务的优先级;
步骤b、在所有任务中,找出优先级最高的任务作为抢占任务,并保存到preemptor变量中;
步骤e、在状态为active的任务中,找出优先级最高的任务作为将要切换的新任务,并保存到next变量中;
步骤d、对next变量和preemptor变量进行比较,判断next变量和preemptor变量是否相等,如果是则设置变量preempt_time为任务next的resume_time,如果否则设置变量preempt_time为任务next的resume_time和任务preemptor的resume_time中较小的一个;
步骤e、将变量preempt_time设置为下一次作业的调度时刻;进行作业切换,完成调度。
与现有技术相比,本发明产生的有益效果为:
本发明可以克服在系统超负荷的情况动态优先级算法的截止期错失率急剧增加的问题,减小任务平均延迟,增加调度成功率,并能提高任务的公平性,对于执行时间E较大的任务来说不会出现过高截止期限错失率。
附图说明
图1是本发明调度中作业调度时刻到来时的作业调度流程图;
图2是本发明作业完成本周期工作转入睡眠流程图;
图3是本发明动态优先级调度器流程图。
具体实施方式
下面结合附图对本发明的具体实施方式进行详细说明。
在具体实施方式中,利用到的任务的数据结构的伪码为:
Struct task{
Unsigned long p;
Unsigned long e;
Unsigned long d;
Unsigned long deadline;
Unsigned long resume_time;
Long state;
/* other attributes*/
};
该任务task的属性中存在有如上的一些结构体内部变量。在上述中,task的状态变量state有两种属性:一是active,一个是inactive。
一种任务优先级动态调度算法,包括如下步骤:
(1)作业调度时刻到来时的作业调度:在任务调度时刻到来时,调度算法根据相应流程对任务进行调度;
(2)作业完成本周期工作转入睡眠的调度:一个任务的作业完成本周期的工作后转入睡眠状态并引发相应调度;
(3)动态优先级调度器执行调度算法:在最早截止期优先算法中加入期望执行时间e的因素。截止期相同时,期望执行时间比较大的任务,优先级更高。
上述调度算法中对于任意一个没有完成本周期工作的任务,其优先级计算方法为
式(1)
对于任意一个完成本周期工作的任务,其优先级计算方法为
式(2)
其中t为当前时间,p为该任务周期,d为该任务周期内截止期限,e为周期内执行时间,f是一个可调的系数,0<f<1.vdeadline最小的任务优先级最高。
上述调度算法中对于一个没有完成本周期工作的任务,不管它的运行时间是否超过预算,不管它是否超过期限,其任务状态一直为active。优先级都按照式(1)来计算。且在该任务每个周期的开始都会更新优先级,并按照这个优先级进行调度。
上述调度算法中对于一个完成本周期工作的任务,其任务状态设置为inactive,其任务的优先级按照式(2)重新计算。其下一次释放时间计算方法为
(式3)
对于一个没有完成本周期工作,且延迟至下一周期的任务,此时下一个周期将会丢失,其resume_time将会按照式(3)更新。
上述调度算法中调度是完全可抢占的,在每次调度的时刻,在所有的active任务选取一个优先级最高的任务“next”作为将要切换的任务,在包括所有的active,inactive任务中,选取一个优先级最高的任务“preemptor”,作为抢占任务。如果next==preemptor,则下一次调度时刻设置为next的resume_time;如果next!=preemptor,则将next的resume_time和preemptor的resume_time中的最小值作为下一次调度时刻。
参见图1,图1是本发明的任务调度算法调度中作业调度时刻到来时的作业调度流程图。作业调度时刻到来时的作业调度的步骤如下:
在步骤10,在定时器到期,作业调度被触发之后,获取当前时间,并将时间保存到now变量中。该步骤的目的为后续步骤的比较来做准备。
在步骤20,获取当前任务的状态。当前任务的属性如前的task结构体变量所示。该步骤的目的是需要为下一步根据当前任务来进行调度判断来做准备。
在步骤30,遍历任务队列,依次找出任务队列中的任务的状态state为inactive的任务,并将得到的任务赋给变量T。
在步骤40,判断是否遍历完毕。如果还没遍历完毕,则跳到步骤50;如果已经遍历完毕,则跳到步骤100。
在步骤50,对遍历得到的任务T的resume_time和当前时间变量now进行比较。
在步骤60,判断resume_time是否大于当前时间变量。如果判断是对的,则跳到步骤30,继续遍历任务队列;如果判断是错的,则跳到步骤70。
在步骤70,设置该任务T的状态为active。
在步骤80,依照式(1)计算该任务T的优先级并进行更新。
在步骤90,依照式(3)计算该任务T的resume_time并进行更新。完成后调转到步骤30,进行下一次遍历操作。
在步骤100,调用调度器过程。该过程的具体流程图如图3所示,上述过程都是为了调用调度器做准备。
参照图2,图2是本发明的任务调度算法中作业完成本周期工作转入睡眠流程图。作业完成本周期工作转入睡眠的步骤如下:
在步骤110,设置当前任务的状态为inactive。由于当前任务的作业本周期已经完成,因此该任务可以设置成inactive,不参与下次调度。
在步骤120,调用调度器过程。该过程的具体流程图如图3所示,上述过程是调用调度器的前期准备工作。
参照图3,图3是本发明的任务调度算法中EDF调度器流程图。EDF调度器的步骤如下:
在步骤130,按照式(3)更新当前任务的resume_time。
在步骤140,获取当前任务的状态。获取到当前任务的状态为下一步的比较判断来做准备。
在步骤150,判断步骤140获取的当前任务状态是否为inactive状态。如果判断结果为是,则跳转到步骤160;如果判断结果为否,则跳转到步骤170。
在步骤160,按照式(2)更新当前任务的优先级。完成更新后跳转到步骤180。
在步骤170,按照式(1)更新当前任务的优先级。完成更新后跳转到步骤180。
在步骤180,在所有任务中,找出优先级最高的任务作为抢占任务,并保存到preemptor变量中。
在步骤190,在状态为active的任务中,找出优先级最高的任务作为将要切换的新任务,并保存到next变量中。
在步骤200,对next变量和preemptor变量进行比较。
在步骤210,判断next变量和preemptor变量是否相等。如果判断结果为是,则跳转到步骤220;如果判断结果为否,则跳转到步骤230。
在步骤220,设置变量preempt_time为任务next的resume_time。变量preempt_time将在步骤240中用到,是作为作业调度时刻用的。在完成此步骤后跳转到步骤240。
在步骤230,设置变量preempt_time为任务next的resume_time和任务preemptor的resume_time中较小的一个。变量preempt_time将在步骤240中用到,是作为作业调度时刻用的。在完成此步骤后跳转到步骤240。
在步骤240,将变量preempt_time设置为下一次作业的调度时刻。
在步骤250,进行作业切换,完成调度。
以上说明仅仅是本发明的一种实施方式,不能对本发明进行限定,本领域
普通技术人员所做的任何不超出本发明主题的改变,只要在本发明所请求的范围内,都在本发明的保护范围内。
机译: 动态多因素排序以进行任务优先级排序
机译: 内存数据库的动态任务优先级
机译: 内存数据库的动态任务优先级