状态轮询和事件驱动软件状态机设计模式的优化方法与流程

文档序号:18160927发布日期:2019-07-13 09:19阅读:1536来源:国知局
状态轮询和事件驱动软件状态机设计模式的优化方法与流程

本发明涉及轨道交通技术领域,尤其涉及状态轮询和事件驱动软件状态机设计模式的优化方法。



背景技术:

状态轮询和事件驱动软件状态机作为最早已知的设计模式之一,在实时控制系统和信息通信技术领域被广泛应用。状态机设计的灵活性在给开发人员带来高效与便利的同时,也带来了软件最终输出与设计不符的风险。经过多年的实际应用,特别在软件规模日益庞大、对软件安全性、可靠性要求日益增加的情况下,对状态机设计方法使用不当所造成的影响日益凸显。目前,存在较常见的3类问题,包括:

1)由于状态跃迁条件之间存在先后依存关系而导致的输出错误。例如:

通过状态机实现一个布尔表达式x=α.and.β.and.γ(x,α,β,γ均为布尔逻辑变量i.e.值为true/false)。状态机可以表示如图1。

但如果前提条件之间存在时序依存关系,例如将上例修改为条件β为真必须出现在γ为真之前(β-ture-before-γ),这种情况在实际工作中屡见不鲜,例如:进路执行与授权必须同时存在,作为道岔锁闭和移动授权进路延伸的前提,同时进路必须先执行才能锁闭,此时的状态机必须作相应的调整,其中一种变化可以表示成如图2所示。问题在于很多情况下,此类前提条件之间存在时序依存关系的场景并非显而易见,这将导致状态机设计缺陷甚至严重错误。

2)由于缓存历史数据导致的状态机数量庞大的问题。状态机设计中经常出现将逻辑运算与实例化数据混淆的情况,特别在事件驱动型状态机设计时。这样的设计没有引入错误,但却极大增加了状态机的复杂度。例如:

在故障报警中如果将解析故障报文状态机的每个状态设置为特定字符,将生成数量巨大的状态机,因为每条报警都有不同的的字符组合。如图3,moore事件触发的状态机表示了一个“alarm”字符串的解析算法,是一种正确但低效的状态机设计,其缺陷在于它将所有的历史字符作为其继续跃迁的前提条件。如采用此类设计,字符串的数目将等于状态机的数量。

3)由于状态机之间接口定义过于松散导致的状态跃迁不可控的问题。通过对实际工作中产生问题的分析,发现无论在事件驱动还是基于状态的状态机设计中,完全按照实际应用需求进行状态机设计而不采用结构化和抽象化的设计技术,将导致状态机体量巨大,跃迁复杂,最终无法控制的情况。例如:

如果系统有n种互斥但可以相互跳转的工作状,一种设计方式是在状态机中将这n种工作状态直接映射,那么将产生n*[n-1]种跃迁状态,如下图4,n=4,则状态变迁达到12种。

这样的状态机设计将大大降低设计的可读性和可操作性,系统控制的复杂程度也极大的增加。更为严重的是,由于各个状态间的跳转过于灵活,类似于软件中的“goto”语句,破坏了系统的结构化,可能导致不可以测的系统输出。



技术实现要素:

本发明的目的在于提供一种状态轮询和事件驱动软件状态机设计模式的优化方法,解决背景技术中提出的问题。

实现上述目的的技术方案是:

一种状态轮询和事件驱动软件状态机设计模式的优化方法,针对状态跃迁条件

存在逻辑先后依存关系的状况:

新建状态机,将原有的、需要首先执行的跃迁条件a拆分到该独立状态机,作为状态a;将状态a所作的后续操作b作为跃迁条件放入原有状态机的条件中,替代原有条件;

针对状态跃迁条件存在时序先后依存关系的状况:

不定义事件队列和状态机引擎;在同一个状态机里,将条件拆分成中间状态;在系统初始化和配置之后,在每个应用周期,所有模块都执行一次;

针对历史数据缓存导致的状态机状态数量巨大的状况:

系统处理按照划分的处理周期进行,每个周期,每个模块的每个状态机全部重新执行一遍;执行过程中,每个周期,每个模块以预先定义的顺序实现,并传递带有静态变量的参数作为下一个状态机的输入状态指示;

针对状态机间接口定义过于松散导致的状态跃迁不可控的状况,通过引入中间/虚拟状态方式解决。

优选的,所述的通过引入中间/虚拟状态方式解决,指:通过将所有逻辑状态按照“正/反”分成一对状态,并根据“正/反”跃迁条件创建并行的状态机。

优选的,针对状态跃迁条件存在时序先后依存关系的状况:

如果状态间跃迁存在多个跃迁条件,则检查多个跃迁条件的序列并在模块的详细设计中指定。

优选的,所述的检查多个跃迁条件的序列并在模块的详细设计中指定,包括:

在模块细节设计中,与一个状态相关联的多个转换按顺序优先;

在源代码中,程序员和单元测试工具通过代码复查检查排他性,确保条件设置是独占的;

在源代码中,程序员严格遵循c编程原则,当使用保留字“switch-case(多分支选择语句,用于多条件分支的逻辑判断)”时,确保每个分支在调整结束时具有“break(跳出条件判断,用于从当前判断分支中跳出)”;并通过单元测试工具和脚本进行复核。

本发明的有益效果是:本发明通过有效的优化方法,使得优化后的状态轮询和事件驱动软件状态机设计模式,解决了由于状态跃迁条件之间存在先后依存关系而导致的输出错误、由于缓存历史数据导致的状态机数量庞大、由于状态机之间接口定义过于松散导致的状态跃迁不可控的问题。同时兼容两者设计方式,所以同时兼备具备执行速度快、执行顺序可控、可维护和易于测试验证的特点。

附图说明

图1是简单布尔逻辑状态机示意图;

图2是存在时序依存关系的布尔逻辑状态机示意图;

图3是将状态定义为字符的字符解析状态机示意图;

图4是松散跳转控制的状态机示意图;

图5是逻辑依存关系状态机解决方案示意图;

图6是周期性、重复、固定顺序的模块执行过程示意图;

图7是多状态并发状态机设计示意图。

具体实施方式

下面将结合附图对本发明作进一步说明。

本发明的状态轮询和事件驱动软件状态机设计模式的优化方法,针对状态跃迁条件存在逻辑先后依存关系的状况:

新建状态机,将原有的、需要首先执行的跃迁条件a拆分到该独立状态机,作为状态a;将状态a所作的后续操作b作为跃迁条件放入原有状态机的条件中,替代原有条件。与既有状态机设计原则有所不同:针对此状况,本发明要求对原有需求进行重新分析,将存在逻辑依存关系的条件(condition)转换成状态(place/state),将与其相关的操作(action)转换成条件(condition)。这样可以将条件依存关系彻底分解开,形成两次状态跃迁,使条件间的耦合降到最低,可以从根本上避免软件逻辑输出与设计不一致的问题,并进一步提高了可读性和扩展性。

举例说明:考虑一个登记操作,“登记”状态依赖于一个前提条件,即“是否允许被登记”。此时的设计方法是将“是否允许被登记”作为一个独立的状态机处理,并将相应的静态数据结构作为原始状态机的参数传递。这样实现更简单明了,并且为将来条件的添加提供了可扩展性。如图5所示。

针对状态跃迁条件存在时序先后依存关系的状况:

不定义事件队列和状态机引擎;在同一个状态机里,将条件拆分成中间状态;在系统初始化和配置之后,在每个应用周期,所有模块都执行一次(特殊原因,可以是两次)。与既有状态机设计有所不同,当遇到条件之间存在时序先后关系时,本发明不采用将触发条件的事件按照先后队列排序并采用引擎触发事件(实现上例如采用fifo的queue方法),而是进一步分解条件,将有先后关系的条件转换成先后跃迁的状态,并通过计划(scheduler)硬性执行。这样做,可以避免由于外部输入的异常(例如一系列输入数据的延迟、丢失、乱序等)所导致的软件输出与设计不符,并进一步减少了条件在时序上的耦合,使状态机更加扁平,便于理解、编码实现和纠错,同时大大便利了后期维护和程序的功能拓展。

如果状态间跃迁存在多个跃迁条件,则需要检查多个跃迁条件的序列并在模块的详细设计中指定,以确保多个跃迁条件不存在时序上的先后顺序。具体而言,这个原则可以通过以下方法来保护:

在模块细节设计中,与一个状态相关联的多个转换应按顺序优先,一个简单而有效的方式确保首先处理“高”优先级转换。

在源代码中,程序员和单元测试工具通过代码复查检查排他性,确保条件设置是独占的。

在源代码中,程序员严格遵循c编程原则,当使用保留字“switch-case”(多分支选择语句,用于多条件分支的逻辑判断)时,确保每个分支在调整结束时具有“break”(跳出条件判断,用于从当前判断分支中跳出);并通过单元测试工具和脚本进行复核。

从而,从软件编码实现上,该优化手段可以根据需求硬性规定执行顺序,避免由于外部输入的异常(例如一系列输入数据的延迟、丢失、乱序等)所导致的软件输出与设计不符,在不影响系统功能的情况下,将动态异常分析判断简化成了静态顺序执行,使状态机更加扁平,便于理解、编码实现和纠错,同时大大便利了后期维护和程序的功能拓展。

针对历史数据缓存导致的状态机状态数量巨大的状况:

系统处理按照划分的处理周期进行,每个周期,每个模块的每个状态机全部重新执行一遍;执行过程中,每个周期,每个模块以预先定义的顺序实现,并传递带有静态变量的参数作为下一个状态机的输入状态指示;在系统初始化和配置之后,在每个应用周期,所有模块都执行一次(特殊原因,可以是两次)。针对此状况,本发明采用计划(scheduler)硬性将每个中间状态按照既定的顺序强制执行一遍,并抽取每个先后状态所必须的条件输入作为静态变量保存,后续模块仅关注其前序模块带入的参数作为其输入,避免了后续状态各自独立判断前序状态所累积下来的所有条件,统一由计划器执行,仅保留必要的标志位,从而大大简化了每个状态的逻辑判断算法,释放了由于缓存前序状态累积条件所占用的内存,优化了cpu和计算资源。

例如图6所示,所有模块按照既定次序顺序执行,待下一个周期开始,重复该次序。图6中,module表示模块。

针对状态机间接口定义过于松散导致的状态跃迁不可控的状况,通过引入中间/虚拟状态方式解决。

此优化手段特别适用于逻辑状态,通过将所有逻辑状态按照“正/反”分成一对状态,并根据“正/反”跃迁条件创建并行的状态机,增加了状态机设计的可读性,大大减少遗漏逻辑跃迁条件的问题,特别对于新增状态的扩展性有较大优势。

以图4的状态机为例,可以做如下改造:

1)将每个状态(如a)拆分成两个互斥的状态(如a和not-a),即引入了一个not-a的状态。

2)在初始化阶段,将所有状态并发,形成子状态集合,如图7所示。图中init表示开始,init-state表示初始状态。

通过分析比较既有状态机实现技术与优化技术在适用领域、设计方法、技术重点和难点的基础上,得出本发明技术的优点和积极效果,如表1所示。

表1

以上实施例仅供说明本发明之用,而非对本发明的限制,有关技术领域的技术人员,在不脱离本发明的精神和范围的情况下,还可以作出各种变换或变型,因此所有等同的技术方案也应该属于本发明的范畴,应由各权利要求所限定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1