鲍 陈, 汪千松(安徽工程大学现代教育技术中心,安徽芜湖241000)
实时系统[1-2]是计算机应用领域中的一个重要分支,它广泛应用于国防、航空、自动化控制等领域。实时系统要求在确定的时间内执行计算或处理事务并对外部事件做出响应的计算机系统,它的正确性不仅依赖于计算结果的逻辑正确性而且与结果的完成时间有关。关注点分离[3-4]是软件工程中一个重要的原则。传统实时系统软件中,始终存在一些关注点的实现代码难以模块化,和其它关注点的实现代码彼此横切,最终的程序呈现“代码分散”和“代码纠缠”,使得系统变得复杂、难以扩展和难以重用。针对上述问题,本文首先分析并识别了实时系统中的关注点,将非功能性关注从系统核心功能关注中分离出来,在此基础上,提出基于方面连接件的组装模型,该模型方法将AOP引入到连接件中,从而保证了功能关注与非功能关注绑定或组合过程的透明性,功能关注中不包含对非功能关注的代码引用,达到关注点模块化独立重用目的。点,使其模块化。一个关注点就是一个特定的目的,实现某种特定功能的模块。任何一个软件系统都可以被分为核心业务模块和系统级模块,也即核心关注点和系统级关注点。核心业务关注点是指系统的核心业务逻辑(功能逻辑);系统级关注点就是一些与每个业务子系统都关联的公共模块,这些关注点也称为横切关注点。这种横切关注点横跨了多个核心功能业务模块。AOP通过需求分析将需求分解为一系列核心模块级需求和系统级需求,在设计层采用一般关注点和横切关注点(CrosscuttingConcerns)分别为核心模块级需求和系统级需求设计解决模型(SolutionModel),然后在实现层实现这些关注点的模块化,一般关注点实现为组件(Component,可能为对象,方法,过程或API),横切关注点实现为方面(Aspect),最后通过AOP环境提供的织入器(Weaver)将这些组件和方面组合起来以实现一个完整的系统。
AOP的主要构造元素包括:①连接点(Join Pointer):程序执行中的明确定义的点,用以表明可以插入横切行为的位置。②切入点(Pointcut):用以捕获程序执行中特定连接点,并搜索该连接点上下文的程序结构。③通知(Advice):当程序到达某些连接点需要执行的操作,通知通常有3种类型:before
AOP是一种新的编程范型,其基本思想使分离横切关注通知、after通知和around通知,分别表示在连接点之前、之后和代替连接点执行的操作。④方面(Aspect):是将切入点和通知结合在一起的模块单元,类似于OOP中类的概念。⑤编织(Weaving):是把特定连接点的实现代码(Advice)插入到相应的连接点代码上。通过编织工具,通知会被“插入”到通知对应的连接点的前面、后面或连接点所在的代码中。
实时系统软件通常是对任务的调度、对时间的调度及管理上述两类控制的应用逻辑。实时系统软件是一个并发状态机(concurrentstatetransition machine,CSTM)集合。在实时系统中,传统面向对象技术无法完美地模块化,系统里有很多非功能关注,这些非功能关注散布整个系统的功能关注里,带来了“代码分散”和“代码纠缠”的问题。本文提出了一种基于方面连接件的组装模型,该模型将AOP引入到软件连接件中,达到分离关注点简化系统中的代码复杂度的目的,并实现了功能关注与非功能关注绑定或组合过程的透明性,保证了功能关注中不包含对非功能关注的代码引用,达到关注点模块化独立重用目的。
在实时系统软件开发中,经常需要用多个状态来描述系统的行为。这些状态的状态变化和状态迁移形成了状态机。我们采用状态机模型来描述实时系统。对横切关注点我们从两个角度进行分类:体系结构和域独立性的关注点。将关注点从体系结构角度划分为系统级横切关注点(GlobalConcerns)和模块级横切关注点(LocalConcerns),再将模块级横切关注点从独立性的角度做深入细分。系统级横切关注点是指跨越系统所有核心模块组件的全局关注点,如状态迁移和并发性是系统级横切关注点属于这类关注点,而模块级横切关注点是指跨越几个系统核心功能模块的局部关注点,如实时处理和故障处理则属于这类关注点。
实时系统软件是一个并发状态机(concurrentstatetransition machine,CSTM)集合,它是由实时系统建模语言ROOM[9-10](real-timeobject-orientedmodeling)中的Actor演变而来,代表了系统中已封装的并行执行的对象,并行状态迁移机CSTM组成结构模型如图1所示。CSTM组成结构模型实现了对实时系统关于并发对象的静态结构和动态行为的封装,具有以下性质:CSTM始终代表系统中的活动对象,在系统中可以同时有多个对象并行执行。CSTM封装了内部的一切细节,对所有的外部对象而言,CSTM提供了统一的对象交互接口,所有消息是通过接口接收和发送来实现的,通过统一外部接口封装特定功能,可以自主决定自身行为可复用软件模块。
图1 CSTM组成结构模型
本文对实时系统软件系统进行关注点分离,将分离后关注点模块化为组件。组件类型可分为两类:①简单组件(Primitive Component),其服务集中的服务都已经实现,这种组件在进行体系结构描述时,不需要细化描述,在组件层次定义中处于叶子结点位置;②复合组件(Composite Component),它是为描述和实现软件系统的高层次组织关系而引入,其服务集中的服务一般需要若干抽象度相对较低的组件来细化描述。复合组件用于组件层次定义,它表示了OR聚合关系。在一般的情况下,至少有一个子组件在运行时被选中,且子组件作为请求功能的代表运行。在特殊的情况下,所有子组件可以是活动的。配置组件(ConfigurationCSTM)与策略组件(PolicyCSTM)之间是聚合关系如图2所示。
图2 配置CSTM与策略CSTM
复合组件(Composite Component)在树形结构的层次定义中,它表示了OR聚合关系。至少有一个子组件在运行时被选中,且子组件作为请求功能的代表运行。在特殊的情况下,所有子组件可以是活动的。配置控制策略组件(CCPolicyCSTM)管理配置组件1(ConfigurationCSTM1)和配置组件2(ConfigurationCSTM2)的状态是激活Active还是休眠Sleep,如图3所示。
图3 配置复合组件
在实时系统中,我们定义了一组CSTM来完成系统的功能,它包括通常机能CCPolicyCSTM,实时处理并行状态迁移机 (Real-Time CSTM,RTCSTM),故障处理并行状态迁移机(Fault Handle CSTM,FHCSTM),异常处理并行状态迁移机(Error Handle CSTM,EHCSTM)。
依据CSTM组成结构模型,将分离后的模块级横切关注点模块化为一个模块级横切组件中。图4作为被模块化为一个复合组件中的实时性关注点的示例,如图4所示,在实时处理配置复合CSTM中存在4个子组件:配置控制策略、定时器、正常配置以及异常CSTM。所有子组件依次由4个方面组成:并发性(Concurrency)、状态迁移(State Trans)、业务逻辑(AppLo-gic)和面向方面连接件(IAD)。在图4中给出了子组件的动态行为。它动态显示了“超时”情况。首先,除了异常CSTM之外各组件都处于活动状态。然后,同时启动定时器和正常配置CSTM。当超时事件发生,在获得请求处理之前,配置更改为异常。图4还显示了正常的处理过程。
图4 复合组件实时性关注点
目前实时系统软件开发中,把重点都放在了系统的软件结构和功能分解上,而忽略了实时系统环境下非功能性属性的实现。基于关注点分离思想,对实时系统进行功能关注和非功能关注的分离,将分离后的关注点模块化为组件,如果就这样将功能组件和横切组件绑定或组合到一起,势必造成分离后的功能组件和横切组件又一次纠缠到系统中。为了避免这个问题的出现,本文将AOP引入到软件连接件中,然后提出了一种基于方面连接件的组装模型,实现功能组件和横切组件绑定或组合过程的透明性,使得功能组件中不包含对模块级横切组件的代码引用,达到组件模块独立重用目的。基于方面连接件的组装模型主要组成元素有:核心功能组件、模块级组件和方面连接件,如图5所示。图5描述基于方面连接件的组装模型,该模型利用面向方面的通知机制,在连接件的接口处加入切入点和通知,同时使用通知类型在连接点调用通知执行模块级横切组件提供的功能,在面向方面连接件中进行编织[11-12],从而保证了功能组件中不包含对横切组件的代码引用,达到组件模块独立重用目的。
本文通过方面间描述文件 (inter aspect description,IAD)来描述面向方面连接件,方面间文件是一种类似于AspectJ的方面编程语言ACV,采用基于ANSI C语言AOP扩展的编译器[13]进行源程序级的程序转换,变换成C语言编译器能编译的C代码,然后和其它非方面模块一起编译得到系统的可执行文件。通过基于ANSI C语言AOP扩展的编译器对以上已经模块化的组件模块进行编织,从而构建一个完整的系统。
图5 基于方面连接件的组装模型
为了说明上述基于AOP的实时系统关注点分离方法在实时系统软件开发中的应用,下面以仿真门控系统为例来说明。在仿真门控系统中,进行关注点分离如下:①核心关注点分离,本系统核心主要包括用户对系统通常机能状态为待机、开锁、开门、关门、关锁的处理状态进行实时控制;②横切关注点分离,本系统要正常的实现其功能必须考虑实时性和故障性等侧面非功能关注。下面给出了系统的用例图,如图6所示。
图6 系统用例
本文应用基于方面连接件的组装模型在连接件的接口处加入切入点和通知,使用通知类型在连接点调用通知执行模块级横切组件提供的功能,实现了组件绑定或组合过程中透明性,功能组件中不包含对横切组件的代码引用,达到组件模块独立重用目的。
在实时系统软件开发中,经常需要用多个状态来描述系统的行为。这些状态的状态变化和状态迁移形成了状态机。采用基于State模式[14-15]的状态机模型来描述实时系统。通常机能状态机,定义一个StateManager类(CLoadSTM类),它定义了用户程序需要的接口,并维护一个表示当前状态的具体状态的实例。外界只与此类的对象打交道,而不关心具体的状态及其转换。定义一个State抽象类(CLoadState类),规定了处理各外部事件的共同接口(每个事件对应一个虚函数)。CLoadState类中的方法要对应CLoadSTM类中的CLoadSTM_Trans()函数。
3.2.1 通常机能
如图6所示,通常机能是系统正常载入模块,其拥有5个子状态,每个状态形成一个子类,每个状态只关心它的下一个可能状态,从而形成了状态迁移的规则。在业务层对状态迁移时,采用AOP技术,应用基于方面连接件的组装模型在连接件的接口处加入切入点和通知,使用通知类型在连接点调用通知执行模块级横切组件提供的功能,实现组件间的绑定或组合,功能组件中不包含对横切组件的代码引用,达到了组件模块独立重用的目的。
(1)待机子状态机核心功能的实现如下所示:
CLoadState*_original_CLockerWaitState_Open_Lock_Trans(CLockerWaitState*this,US mLockerID){}
(2)面向方面连接件(IAD)方面间描述文如下件所示:
/*lockerwait.acv*/
typeid CLockerWaitState;
typeid US;
typeid CLoadState;
/*连接点(JoinPoint)定义:待机状态到开锁状态迁移方法*/
CLoadState*CLockerWait_Open_Lock_Trans(CLokerWait-State*this,US mLockerID)in LoadLockerWaitState;
/*方面(Aspect)定义 */
aspect asptLoadAction{
/*切入点(Pointcut)定义:待机状态到开锁状态迁移时,故障处理PolicyCSTM通知Open_Lock*/
pointcut pCLockerWaitState_Open_Lock_Trans(
CLockerWaitState*this, US mLockerID):CLockerWait_Open_Lock_Trans(this,mLockerID);
/*通知(Advice)定义:待机状态到开锁状态迁移时,故障处理PolicyCSTM通知Open_Lock*/
before(CLockerWaitState*this,US mLockerID):
pCLockerWaitState_Open_Trans(this,mLockerID){CLoadAction_NotifyFaultPolicy_OpenLock(mLockerID);}
}
(3)经ACV方面代码编译器编排后C代码如下所示:
/*lockerwait.c*/
#include"LoadAction.h"//需要手工添加
#include"LoadLockerWaitState.h"
/*方面文件转换的函数宏的定义*/
#define_asptLoadAction_before_1(this,mLockerID){CLoad-Action_NnotifyFaultPolicy_OpenLock(mLockerID);}
/*核心功能组件函数*/
CLoadState*_original_CLockerWaitState_Open_Lock_Trans(CLockerWaitState*this,US mLockerID);
/*编织后的核心功能组件函数中加入业务功能函数和advice函数宏*/
CLoadState*CLockerWaitState_Open_Lock_Trans(Clocker WaitState*this,US mLockerID){
CLoadState*_around_ret_val_;
_asptLoadAction_before_1(this,mLockerID);
_around_ret_val_=_original_CLockerWaitState_Open_Lock_Trans(this,mLockerID);
return_around_ret_val_;
}
3.2.2 实时处理机能
仿真门控系统是一个复杂且具有实时性要求的实时系统,其逻辑正确性不仅依赖于计算结果的正确性,还取决于系统输出结果的时间。图7实时处理复合组件,当系统处于从开锁状态到开门状态迁移时,起动定时器的Time_start()方法,当从开门状态到关门状态迁移时,起动定时器Time_cancel()方法,如果在一段规定的时间阈值内没有关门事件发生,则实时处理PolicyCSTM的子状态类CRealTimePolicyStartState执行Time_Up_Trans()方法,在该方法中通知实时异常配置组件激活,通常机能功能组件模块休眠。
图7 实时处理复合组件
通常ConfigurationCSTM从开锁状态到开门状态迁移,通知实时处理PolicyCSTM启动定时器Timer面向方面连接件方面间描述文件。通过ACV方面代码编织器编排为C代码。
3.2.3 故障处理机能
系统处于待机状态,发现锁故障,则在通常机能CSTM子状态类CLockerWaitState核心功能函数_original_CLockerWait-State_Open_Lock_Trans()中连接点织入故障性处理Composite-CSTM,故障处理PolicyCSTM以事件形式通知硬件,此时故障处理CompositeCSTM在子状态类CFaultPolicyOpenLockState执行方法Open_Door_Trans()中,通过全局变量GlockerOpenLock-Error进行判断硬件是否发生故障,如果发生了故障则在该方法中激活故障异常处理功能模块,将通常机能组件模块休眠;如果未发生硬件故障,则激活通常机能组件模块,触发开锁事件。故障处理复合组件如图8所示。
图8 故障处理复合组件
通常ConfigurationCSTM组件,从关门状态到关锁状态迁移时通知故障处理 PolicyCSTM的面向方面连接件方面间描述文件。通过ACV方面代码编织器编排为C代码。
本仿真系统的开发利用了VisualC++6.0IDE集成开发环境。我们通过此仿真界面来模拟和展示系统运行效果,其界面上的 OpenLock、OpenDoor、CloseDoor、CloseDoorLock 按钮分别代表不同的功能操作,还模拟了故障发生情况设定。在MFC对话框类ClockerDlg中添加了定时器中断消息WM_TIMEER,并在其对应的定时器事件OnTimer()中实时器的Timer_Clock(),这样就可以按照Windows系统的时钟模拟实现在实时控制系统中,对计时器链表中的每个计时器进行相应的加1或减1操作。本系统使用State模式解决了状态管理的问题,同时使用基于方面连接件的组装模型解决了模块级横切问题也取得了令人满意的效果。
本文提出了一种基于AOP的实时系统关注点分离方法,该方法包括把实时系统中的状态迁移、并发性、实时性和故障性等非功能关注从功能关注分离出来,较好地分离应用逻辑(功能性问题的解决)与横切关注点(非功能性问题的解决)之间的干扰;将AOP引入到软件连接件中,提出了基于方面连接件的组装模型,应用该模型在连接件的接口处加入切入点和通知,使用通知类型在连接点调用通知执行模块级横切组件提供的功能,实现了组件绑定或组合过程中透明性,且功能组件中不包含对横切组件的代码引用,达到了组件模块独立重用的目的;使用State模式解决了实时系统软件开发中的状态管理问题,阐述了State模式在实例系统中的具体实现。最后通过对一个实时系统实例分析与实现,说明该方法在实际项目开发中的应用价值。
[1]Douglass B.Real-time UML:Developing efficient objects for embedded system[M].New York:Pearson Education,2003.
[2]杨林,李小坚.基于UML实时系统的分析和设计[J].计算机工程与设计,2007,28(20):5035-5038.
[3]何丽莉,金淳兆,冯铁,等.关注分离问题研究综述[J].计算机科学,2005,32(2):129-132.
[4]Dijkstra E W.A discipline of programming[M].Englewood Cliffs,NJ:Prentice-Hall,1976.
[5]曹东刚,梅宏.面向Aspect的程序设计——一种新的编程范型[J].计算机科学,2003,30(9):5-10.
[6]邓阿群,厉小军,俞欢军,等.一种新型软件设计方法AOP的研究[J].系统与电子技术,2004,26(7):970-975.
[7]Ivar Jacobson,Pan-Wei Ng.Aspect-oriented software development with user cases[M].Addison Wesley Professional,2004.
[8]庄巧莉,吴国华,冉宇瑶.面向AOP构建健壮可扩展的系统[J].计算机应用与软件,2007,24(8):77-78.
[9]湛辉来.基于UML的实时系统并行对象模型[D].重庆:重庆大学,2003.
[10]温昱.软件架构设计[M].北京:电子工业出版社,2007.
[11]李慧,张京军,李福荣.基于AOP的软件体系结构适应性研究[J].微计算机信息,2008,24(3):273-274.
[12]SHENG Jin-fang,WANG Bin,CHEN Song-qiao.Aspectual component model and its assembly approaches[J].Computer Engineering,2006,32(5):39-40.
[13]GE Feng,ZHANG Yun-hua,ZHAO Guo-ping.Design and implementation of AOP weaver based on C language[J].Computer Applications and Software,2008,25(12):161-163.
[14]张玲.基于状态机模型设计协作式工作流系统[J].北京机械工业学院学报,2007,22(3):16-18.
[15]XU Xiao-liang,WANG Le-yu,ZHOU Hong.Implemetation framework of finite state machines[J].Journal of Engineering Design,2003,10(5):251-255.