论文研究 基于VxWorks的软件自恢复技术的设计与实现 .pdf
基于VxWorks的软件自恢复技术的设计与实现,董子雄,刘晓鸿,随着嵌入式系统复杂性的不断提高,软件缺陷引发的软件老化现象成为一个不可忽视的问题。软件老化最终会带来软件失效,为了保证嵌山国武技记文在对实际运行中的软件状态进行判定和预测。其基本思想是在软件运行的过程中,对系统的各项性能参数进行监测,动态地对软件衰老速度、吋间、软件恢复代价等进行评佔计算,并算岀进行自恢复的时间。基于度量的自恢复策咯更符合软件的实际运行情况,但是事实上,由于这种策咯需要频繁对系统进行检测,增加了系统的负担。为了降低监控成本,可以使用种带有一定时间间隔的检测。微重启技术系统的可靠性很大程度上取决」操作系统对异常状态的修复能力。软件衰老和软件错误大多可以通过系统级的重启得到妥善处理,但是系统级重启的代价十分高昂,对于大多数嵌入式系统来说并不是个合适的解决方案,因此提出了微重启的概念。微重启采取递归恢复的思想,将系统划分成若干个相互独立的子集,这些子集可以是系统中相互独立的模块,当操作系统内的某个模块出现错误或者无法运行时,操作系统自身无需重启,只需对出错模垗采取重启操作,使出错模垬重新运行来修复错误。相对于系统级的宏重启而言,微重启所花费的代价非常小,重启单个模块的速度也比系统级的重启要快很多,并且单个模块的微重启不会影响系统中其他不相关模块的正常运行。借鉴微重启的思想,我们可以按照一定规则建立一颗重启树,当系统衰老到一定程度,从重启树的最下面一层进行重启,如果重启之后不能使系统恢复到相对健康的状态,就进行更大范围的重启,直到使系统恢复到健康态。检查点技术为了延长系统的正常运行时间,保证系统的高可靠性,一方面需要在系统出现衰老状态后且未失效前,对系统进行修复,使系统恢复到健康态,此来延长系统的正常工作时间;另一方面需要在系统出现故障后,采取相应措施实施快速恢复,尽量减少由于系统故障所造成的停机成木。检査点技术是一种典型的软件容错技术。通过在任务运行过程中,每隔一段时闩将当前任务的运行状态保存至非易失存储器上,这样当仼务岀现故障后,可以藉由检査点文件将该任务卷回恢复到最近次保存检查点时的状态,从而不必从最开始重新执行整个任务,避免了任务运行状态的丢失和计算损失。基于检查点的微重启机制设计软件恢复的适用场景一般都是要求高可靠性或高可用性的系统上,比如网络服务器、路由器、大型计算软件、通讯软件系统等。粗略地可以将系统中所包含的任务划分为两大类长时间运行的服务任务以及长时间运行的计算任务。对于长时间运行的服务任务来说,其在理想情况下是可以持续不断永久运行下去的,但是事实不是这样的,由于软件老化和的存在,使任务最终会出现老化或者失效状态。而一般来说,服务任务的运行过程是长时间处理同样类型的操作,对其进行软件恢复时仅需要考虑减小服务停机的时间和代价,因此简单的微重启操作便可以满足要求。而对于计算任务,由于很多计算仟务需要经过相当长的时间才能得出最后的结果。若该类任务存在软件老化或其他问题,必然会引起运行速度低下、資源耗尽乃至失效等结果。使用微重启技术虽然可以清除其老化状态,但是对自身没有保存中间结果和载入进度功能的任务来说,单纯使用微重启会导致计算结果丢失,这时应该将微重启技术和检查点技术相结合,利用检查点技术每隔一段时闩保存仼务的运行状态和数据,并且在进行微重启的时候对任务进行卷回恢复。山国武技记文在基于上述的分析,可以得出基于检查点的微重启机制的基本思烙为:对于计算型任务,应采用检查点机制,定期保存其运行状态和中间结果;对于那些服务型任务,由于其不需要进行卷回恢复,若对其也保存检査点,会大大提髙老化系统自恢复的难度和无故障开销,所以在自恢复时只需要对该类任务进行简单的重启即可。设计思路本方案对传统的微重启抗衰策略进行改进。在微重启策略的基础上,针对计算型任务加入检查点机制,使系统可以进行有效的自恢复,不会丢失关键任务的数据。木方案的总体流程如图廾始恨据嵌入式目标板开发BSP定制 VxWorks系统,启动微重启和检查点模块启动用户任务当前任务是否使用内存池管理任需要检查点机是务的TCB分配、任制?务栈、动态分配内存否使用系统内核对象使用系统库函数创使用封装后的函数池管理任务屮需要建任务并运行替换系统厍函数用到的信号量、消息队列等内核对象是否还有用户在微重启后,需要任务?根据保存的检查点文件进行卷回恢复结束图基于检查点的微重启机制设计流程具体步骤是:开发针对嵌入式日标板的最小系统。定制系统,为需要检查点杌制的任务在地址高位山国武技记文在区域预留·定大小的空间,在该区域建立内存池,用于管理检忄点任务的、任务栈、动态分配数据的内存,以解决卷回恢复吋任务数据地址变化的问题,还需要建立系统内核对象内存池,以供检查点任务使用。编写微重启与检査点模块,并在系统初始化后,用户仼务启动前加载该模块,同时,需要对检查点任务所用到的系统函数库中的函数进行同名封装,用来对检查点任务特殊处理,执行和其他任务不同的逻辑。实现内存池及内核对象池由于操作系统采取线性单一·实地址空间()模式,所有任务都运行在同地址空间,任务进行卷回恢复时任务的数据地址很有可能发生变化,导致无法进行卷回恢复,为了解决这个问题,需要使用主动内存管理,即采用内存池技术,预先分配好若干块内存供任务使用。的内存布局如图所示LOCAL MEM SIZEUSER MEMORY用户保留区USER RESERVED MEM.TWorks叮用内分配给 vx Works可用内存存聊DB内存池MEM POOL STARTVxWorksvxWorks区域RAM LOW ADRS低端内存区LOCAL MEM LOCAL ADRS图的内存布局通过配置的中的可以定义用户保留区的大小。利用得到用户保留区的起始地址,使用建立内存池。需要提前预估任务需要的内存块大小及数量,静态分配好·定薮量的内存块供仼务使用任务的任务栈、动态内存使用的内存全都通过该内存池进行申请和释放。对于检査点任务所需要的内核对象,如信号量和消息队列等,由于这些对象由操作系统进行管理,在卷回恢复时难于处理。可以预先根据需要静态分配出若干内核对象,在任务申请内核对象时,若该仟务需要检查点机制,则直接在对象池中分配。系统函数的封装方法为了实现检査点任务和当通任务执行不同逻辑,需要提供一套函数库用来支持检査点机制,这需要更改目标任务的代码,为开发增加了难度,而且有些目标任务也许使用的是第三方的非开源软件,无法直接修改其源代码和任务行为。这时我们需要考虑直接修改任山国武技记文在务调用的系统库函数,而不是开源软件,获取其源码需要支付昂贵的版权费,并且直接修改其源码可能会影响系统性能,引发新的位置错误。本文考虑使用·种同名函数替换的方法来对系统函数进行封装。以替换內存分配函数为例,首先利用函数malloc”,& addr of malloc,type)获得系统库函数的地址并存入中,然后定义对于普通任务,通过直接调用系统库函数;对于需要检查点机制的任务,则需要在内存池中分配内存。这样设计的好处是为用户提供了与系统库函数无异的统一接口,降低了开发难度,提高了可用性,且无须对系统内核代码进行改动。需要注意的是,必须在用户任务启动前完成该模块的加载,否则会出现错误透明检查点设计对于需要采用检查点机制的任务,需要解决的问题就是自恢复后其任务状态与恢复前的状态信息的不一致性。为了重启任务后能对其进行卷回恢复,必须对仟务运行时的状态信息进行保存。因此,本文设计了一ˆ检查点模块,用于对任务状态进行保存,并可根据保存的检查点文件对任务进行卷回恢复。本文在实现了一个透明检査点模块,由该模块对其他任务进行任务数据和状态信息的保存。上文心介绍了封裝系统函数的方法,该方法相当」直接替换了任务中使用的函数,修改了任务的原有逻辑,为实现检耷点机制提供了必要条件和技术手段。根据其所起的作用和系统层次,可将其看为检査点中间件。添加了该中间件的系统结构图见图用户任务检查点中问件XWorks库WIND微内核板级支持包BSP底层硬件图添加检查点中间件后的系统结构图在系统进行自恢复时,对于普通任务,根据一定规则进行简单重启即可,对于计算型仟务,在重启之后,读取其对应的检查点文件,根据文件内容恢复任务的仼务栈、动态数据、内核对象及寄存器等。基于检查点的微重启机制测试结果分析本文提出的方案是基于目前常用的微重启机制,利用不定期地对系统中的任务进行微重启,来清理系统内累积的内冇碎片,消除累积误差,释放操作系统的资源。另外,结合了检查点机制,对于计算型任务可以在其进行微重启后进行卷回恢复,避免了任务状态和计算结果的丟失。整个程序在运行过程中,本论文在一下几个核心问题中与其他软件抗衰机制相比有一定的创新为传统的微重启抗哀加入了检查点札制,对用户指定的计算型任务定期保存其任务状态和数据。若只进行单纯的微重启,则会丢失这些任务的计算结果,若对所有用山国武技记文在户任竻都采取检查点札制,则会导致系统无故障销过大,且大大恢复系统自恢复的难度。因此,本文对传统的抗衰机制和检查点机制进行了优化,对仼务功能进行划分,区分对待,达到了较好的效果。由于需要区分普通任务和需要采取检査点机制的任务的执行逻辑,本文提供了一种动态替换系统函数的方法,在无需改动内核代码与原有仼务代码的情况下,可以由用户定制检查点仟务需要函数的函数逻辑,并替代原有函数。在对仟务的检查点文件进行相关数据的文件写入时,需要考虑的写入速度是相对比较慢的,并且频繁的擦写会大大降低法的寿命。优化措施为每次在保存检查点时,不保存整个内存池地址空间和系统内核对象池的内容,而是只保存仼务用到的内存块和内核对象的内容,并记录内存块和内存对象的,在任务恢复开始时,首先锁定对应的内存块和内存对象不被分配至其他任务,恢复其数据后再进行解锁。这样做的优点是优化了检查点文件的大小,减小了系统的无故障开销,但是需要对任务的检査点设置进行协调,保持检査点集合的全局一致状态。在完成程序的设计后,本文在系统版本上已基本开发实现,并且在开发板上进行了试验验证。在实验过程中,设计了个任务,部分任务存在内存漏的程序模拟软件衰老,并且通过串口连接开发板进行故障沣入模拟瞬时故障。该仟务模型中即存在引发软件老化的仟务,也会出现突发故障,接近真实环境。实验结果表明,实现了该机制的操作系统具有进行系统老化自恢复与关键任务卷回恢复的能力,对于提高系统的可靠性和可用性有一定的参考意义。结论本文通过对保证嵌入式软件可靠性以及软件抗衰的理论和实践进行研究,分析了现有的抗衰方法的优缺点。提出并实现了一种基于检查点的微重启机制。该方案与目前常用的微重启抗衰策略相比,在不修改操作系统内核的情况下实现了检査点杋制。外,本文提出的方案将仟务区分对待,分为服务型仟务与计算型仟务,对计算型仟务采取检查点机制,避免了单纯的微重启所造成的计算结果丢失;对服务型任务采取微重启机制而不采用检查点保存任务状态,降低了系统的无故障开销。实验结果表明,本文提出的方案侵入性低,可移植性高,可有效针对系统存在的软件老化问题进行自恢复,并且不会遗失计算型任务的中间运算结果。目前,本文研究的基于检点的微重启机制已经完美运行于系统上。对于提髙系统的可靠性有一定的借鉴意义。进一步的工作是对内存池的预先静态分配策略进行改进,提高系统的可用性,并且对系统进行自恢复的时机进行优化,完善系统的恢复能力。参考文献孙志安,裴晓黎,宋昕,戴忠健软件可靠性工程北京航空航天大学出版社,郭成昊,刘风玉白恢复容错系统的模型和分析计算科学陈恒嵌入式软件状态监測与自恢复技术硏究哈尔滨:哈尔滨工程大学,谭成鑫,王雷,关玉新支持自恢复的微重启技术研究小型微型计算机系统,周志久,刘波,岄严苏屮任务恢复机制的设计与实现工业空制计算机,
下载地址
用户评论