一种高效的浮点上下文切换算法
2017-07-10张东梅涛
张东 梅涛
摘 要:为了提升基于浮点运算的任务上下文切换性能,本文提出了一种高效的浮点上下文切换算法;基于某型嵌入式实时操作系,设计实现了所提出的浮点上下文切换算法,并进行任务上下文切换的性能对比实验;实验结果表明,本文提出的浮点上下文切換算法可以有效地提高混合环境下任务切换的效率,显著减小浮点任务上下文切换的时间消耗。
关键词:浮点任务;上下文切换;性能对比
中图分类号:TP311 文献标识码:A
一、背景
随着嵌入式领域信息处理技术的发展,越来越多的应用需要使用浮点运算来完成其功能,对操作系统[ 1 ]提出了新的功能和性能要求。在信息处理领域,通常情况下浮点任务和非浮点任务配合使用,完成各种计算。如果操作系统在任务切换的过程中,对每一个任务均保存和恢复浮点上下文,则会造成大量的时间和空间开销,严重影响系统性能,需要提出新的浮点任务和非浮点任务切换算法,为混合任务环境下任务的高效切换提供支持。
二、浮点上下文切换算法
上下文切换[ 2 ]的基本原理就是当发生任务切换时,保存当前任务的寄存器到内存中,将下一个即将要切换过来的任务的寄存器状态恢复到当前 CPU 寄存器中,使其继续执行,同一时刻只允许一个任务独享寄存器。在任务切换的过程中是涉及任务上下文的保存和恢复操作,而任务上下文切换操作的性能是衡量操作系统性能的一个重要指标。任务上下文切换指标可以反映出操作系统在多任务环境下的处理能力。由于浮点运算应用的大量普及,已有的操作系统上下文切换算法已不能有效满足实时高效处理的需求。
为了提高任务切换的性能,减少浮点上下文的保存和恢复次数,本文设计了一种高效浮点上下文切换算法。该浮点上下文切换的基本原理为:尽量延迟浮点上下文的保存和恢复操作,仅在切换到使用浮点运算的任务时,才进行浮点上下文的保存和恢复操作。使用浮点运算的任务称为浮点任务,否则称为普通任务。如果当前执行的任务为普通任务,那么该任务在运行过程中不会进行浮点运算,不会破坏浮点上下文,则不需要进行浮点上下文的保存和恢复操作;如果当前执行的任务为浮点任务,那么直到换到另一个浮点任务时,才进行浮点上下文的保存和恢复操作。根据该原理,系统中需要进行浮点上下文的切换操作的影响范围仅与系统中使用浮点运算的任务相关,有效地提高了系统中任务切换的性能和效率。图1给出了浮点上下文切换的示意。
由图可知,假设系统当前有4个任务,浮点任务A,普通任务B,浮点任务C和普通任务D。根据前述浮点上下文切换原理,在任务A切换任务B的过程中,并不需要保存浮点任务A的浮点上下文,仅仅将浮点任务A的浮点上下文向任务B传递;当由普通任务B切换到浮点任务C的时候,才需要保存浮点任务A的浮点上下文。在进行了两次任务切换时,仅需要一次浮点上下文的切换操作,可以有效降低由于浮点运算导致的系统性能的下降。
三、浮点上下文切换算法的实现
根据前述浮点上下文切换原理,选择某型嵌入式实时操作系统软件(RTOS)实现该上下文切换算法。为了叙述方便,定义前继任务为当前即将切换出去的任务;后继任务为即将切换进入CPU执行的任务。为了能够简洁高效地实现该浮点上下文切换算法,在所选择的RTOS的任务控制块中增加了一个任务浮点属性,标识当前任务是否为浮点任务。如果在创建任务时,设置了任务的浮点属性,则所创建的任务即为浮点任务;否则为普通任务。
为了充分发挥浮点运算的性能,浮点上下文地址通常要求按CPU字长的整数倍对齐,本文所选择的RTOS中,浮点上下文按照8字节对齐。在实现前文提出的浮点上下文切换方法的过程中,使用了任务浮点上下文的最低位,作为任务浮点上下文传递的标记。当浮点上下文传递标记被置位,则认为当前任务中的浮点上下文为传递过来的,当前任务为普通任务,并不是浮点任务;否则,表示当前任务就是浮点任务。
任务切换的过程中,根据前继任务和后继任务的不同类型,需要进行不同的操作。
本文设计的浮点上下文切换算法的具体步骤如下:
1)判断所创建的任务是否为浮点任务。
2)如果是浮点任务,则申请浮点上下文空间,并将申请的浮点上下文空间记录在任务控制块的浮点上下文成员中;否则,则设置任务控制块中的浮点上下文成员为空。
3)任务切换时,判断前继任务和后继任务的类型;可能存在的任务类型组合包括:
a.浮点任务/浮点任务;
b.浮点任务/非浮点任务;
c.非浮点任务/浮点任务;
d.非浮点任务/非浮点任务。
4)根据前继任务和后继任务的类型对浮点上下文进行切换操作:
①如果为步骤3)的a.组合,则对浮点任务的上下文进行保存和恢复;
②如果为步骤3)的b.组合,暂时不进行浮点上下文的保存,将前继任务控制块中的浮点上下文成员传递给后继任务,而将浮点上下文的保存操作推迟到切换浮点任务时才进行;
③如果为步骤3)的c.组合,任务上下文切换操作过程如下:
(a)判断前继任务控制块中的浮点上下文成员是否为空;如果为空,则进行步骤(b);否则,则进行步骤(c);
(b)在当前任务运行前,没有浮点任务运行,不需要进行浮点上下文的保存工作,仅需要恢复浮点上下文;
(c)在当前任务运行前,有浮点任务运行,如果前继任务的浮点上下文与后继任务的浮点上下文不一致,则将浮点上下文保存到前继任务控制块所传递的上下文中,并清除前继任务控制块浮点上下文传递标记,恢复后继任务的浮点上下文,否则清除前继任务的浮点上下文;
④如果为步骤3)的d.组合,任务上下文切换操作的方式为:
(a)判断前继任务控制块中的浮点上下文成员是否为空;如果为空,则进行步骤(b);否则,则进行步骤(c);
(b)在当前任务运行前,没有浮点任务运行;不需要进行浮点上下文保存/恢复操作;
(c)在当前任务运行前,有浮點任务运行,将前继任务的浮点上下文传递到后继任务,并清除前继任务控制块中的浮点上下文成员。
四、浮点上下文切换算法的性能
为了验证本文设计的浮点上下文切换算法的性能,根据前文设计的上下文切换算法,在某型RTOS中实现了上述浮点上下文切换算法,并在PowerPC7450单核处理器[ 3 ]平台上进行性能验证实验。为了比较本文设计的浮点上下文切换算法的性能,在所选择的RTOS中使用始终在任务上下文中保存和恢复浮点上下文方法切换上下文,即在每次任务切换时,均对每个前继任务保存浮点上下文并且对后继任务恢复浮点上下文,并在同一处理器平台上进行性能验证实验。
实验中通过两个任务进行切换操作,计算任务上下文切换操作的时间。实验场景[ 4 ]如下,任务A和任务B进行切换,在任务A从CPU中切换出来的点开始第一次计时,在任务B切换进入CPU的点记录第一结束时间;然后,在任务B切换出来的点开始第二次计时,在任务A切换进入CPU的点记录第二次结束时间,通过1000次任务切换操作,计算任务上下文切换操作的平均时间。
基于本文设计的浮点上下文切换方法,实验结果如下所示:
如果任务切换时按照始终进行浮点上下文切换的算法进行上下文切换操作时,实验数据如下:
根据实验结果,可置本文设计的浮点上下文切换算法,在非浮点任务和浮点任务混杂的运算环境下,可以有效地提高任务切换的性能,显著地降低任务切换的时间消耗;对于计算资源相对有限的嵌入式环境,上下文切换性能的提升,可以有效提高系统的效率;对于实时性要求较高的环境,任务上下文切换时间的降低,可以显著提高系统的实时响应能力。
五、结语
本文设计了一种高效的浮点上下文切换算法,根据性能对比实验结果,证实了本文提出算法可以有效地提高系统的任务切换性能,显著地降低任务上下文切换的时间消耗。通过与已有的任务上下文切换算法进行对比实验,证明本文设计实现的浮点上下文切换算法,在使用浮点运算和非浮点运算混合的情况下可以提高上下文切换的性能,可以显著提高系统的效率,增强系统性能。
参考文献:
[1] 陈瑜,谌卫军译.操作系统设计与实现[M].北京:电子工业出版社,2007,3.
[2] 孙利锋.嵌入式操作系统任务切换方法对比分析[J].单片机与嵌入式系统应用,2011年07期:10-12.
[3] Freescale Inc.MPC7450 microprocessor family users manual [M].USA: Freescale Inc,2010.
[4] 王蕾,朴希望,李世群,陈蕾.嵌入式实时操作系统的时间性能测试[J].内蒙古大学学报,2011年,42卷第5期:547-551.
基金项目:
工信部民用飞机专项科研项目(MJ-S-2012-05)
作者简介:
张东(1983-),男,陕西西安人,硕士,主要研究方向为嵌入式实时操作系统。