首页> 中国专利> 一种构件间动态依赖关系的自动分析方法

一种构件间动态依赖关系的自动分析方法

摘要

本发明公开了一种构件间动态依赖关系的自动分析方法,该方法在程序运行时,能自动计算程序在当前执行环境下精确的动态依赖关系。该方法,在程序运行前,通过静态分析的方法构建程序的动态依赖自动机。当程序运行时,其对应的动态依赖自动机自动运行,同时根据当前的执行情况自适应地更新程序的动态依赖关系。该方法的所有工作都是自动完成,与已有的方法相比,在开发效率和正确性上有了很大的提高。利用此项方法,开发了Java构件间动态依赖关系的自动抽取工具——DDET。DDET对Java字节码直接进行分析和操作,对于任意一个支持动态更新的Java构件系统,运行时可自动获得其精确的依赖关系。

著录项

  • 公开/公告号CN102880493A

    专利类型发明专利

  • 公开/公告日2013-01-16

    原文格式PDF

  • 申请/专利权人 南京大学;

    申请/专利号CN201210362752.3

  • 发明设计人 马晓星;曹春;吕建;苏萍;

    申请日2012-09-25

  • 分类号G06F9/445(20060101);

  • 代理机构南京苏高专利商标事务所(普通合伙);

  • 代理人夏雪

  • 地址 210046 江苏省南京市栖霞区仙林大道163号南京大学仙林校区603信箱计算机系

  • 入库时间 2024-02-19 17:04:01

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-08-04

    专利权的转移 IPC(主分类):G06F9/445 登记生效日:20200715 变更前: 变更后: 申请日:20120925

    专利申请权、专利权的转移

  • 2015-04-08

    授权

    授权

  • 2013-02-27

    实质审查的生效 IPC(主分类):G06F9/445 申请日:20120925

    实质审查的生效

  • 2013-01-16

    公开

    公开

说明书

技术领域

本发明属于计算机应用领域,具体是一种构件间动态依赖关系的自动分析方法。 

背景技术

软件环境和用户需求总是不断变化的,而这些变化在软件初始设计时,或者很难预测,或者虽然可预测但处理起来成本很大,不适合在当前版本的系统完成。因此越来越需要对已经上线的旧版本的软件系统进行动态更新,即在不停止当前正在运行的系统的前提下对系统进行更新或版本升级,以适应新的环境,满足用户新的需求[1]。动态更新不仅要保证更新前后和更新过程中系统的一致性,而且在保证一致性的同时,我们希望动态更新可以尽快完成,从而减少由于动态更新造成的系统某些服务不可用的时间。 

目前可以保障动态更新过程中系统一致性的模型主要有三种:Quiescence、Tranquillity、Version-consistency。它们中的软件系统都是由构件及构件间的依赖关系组成。Quiescence的方法只考虑由系统架构确定的构件间的静态依赖关系,这将导致要更新的构件及其相关联的构件在动态更新中长时间不可用,造成系统较大的破坏性。与静态依赖不同,动态依赖关系是运行系统中正在执行的事务的发起者构件及与其相关联的构件在运行时刻不断变化的依赖(或调用)关系。事务是指构件在一定时间内完成的一系列动作的执行。后两种模型使用事务运行时的动态依赖关系,在保证一致性的同时,可以减少动态更新的时间。动态依赖关系的准确性严重影响了动态更新进行的最佳时机和完成动态更新所需的时间。错误的动态依赖关系可能会破坏动态更新的正确性。 

对于动态依赖关系的计算,文献“Yves Vandewoude.Dynamically updating component-oriented systems.PhD thesis,Katholieke Universiteit Leuven,2007.”提出在程序运行前,由构件的开发人员针对每个程序手工编写一个事务状态机,计算其中每个状态的动态依赖信息,并且在业务逻辑中加入状态转移信息,这样程序在运行时刻可以提供关于自身的动态依赖关系。显然,这种方法给构件的开发人员增加了很多额外的负担,尤其当程序结构比较复杂,与周围构件的调用关系也 较复杂时,要手工分析出每个状态的依赖关系并编写出状态机,不仅耗费大量的时间,而且正确性也很难保证。针对这一不足,文献“夏晨,曹春,陶先平.一个用于动态更新一致性保障的状态机抽取方法.计算机科学,2010,37(11):151-155.”提出一种通过静态分析自动抽取事务状态机的方法。它通过分析程序源代码的控制结构及构件间的交互端口,自动生成事务的状态机,并自动计算出每个状态的依赖关系。这种方法虽然在开发效率上有了很大的提高,但由于其只采用静态分析的方法,得到的依赖关系在某些位置是不精确的,甚至是错误的,尤其是那些可能多次执行,或者是可由多条路径到达的位置,例如循环结构、分支汇合点。 

发明内容

发明目的:针对上述现有技术存在的问题和不足,本发明的目的是提供一种构件间动态依赖关系的自动分析方法,能自动获得程序在当前执行环境下精确的动态依赖关系,不仅提高了开发效率和正确性,而且提高了动态依赖信息的精确度。 

技术方案:为实现上述发明目的,本发明采用的技术方案为一种构件间动态依赖关系的自动分析方法,包括如下步骤: 

1)静态分析阶段,构建程序的动态依赖自动机; 

2)静态分析阶段,计算动态依赖自动机中的动态依赖关系的Future信息,所述动态依赖关系包括Future信息和Past信息,其中Future信息是指程序在当前执行环境下,将来可能使用的构件集合,Past信息则指其过去使用过的构件集合; 

3)静态分析阶段,将已经分析出的动态依赖自动机和驱动动态依赖自动机正确自动运行的触发信息插入原程序(这里的“原程序”指修改以前的程序)中; 

4)动态分析阶段,当程序运行时,其对应的动态依赖自动机在触发信息的驱动下自动运行,同时自适应地获得当前执行环境下的动态依赖关系。 

所述步骤1)中构建程序的动态依赖自动机的具体步骤为: 

1.1)构建程序的控制流图(CFG); 

1.2)在程序的CFG上,采用深度优先的搜索算法(DFS),从程序的入口节点开始,递归地分析每个节点;同时,初始化动态依赖自动机的初始状态作为当前状态,此处的状态是指程序在一个代码块中稳定不变的动态依赖关系。 

遇到可能引起程序的动态依赖关系发生变化的节点,则执行以下步骤: 

1.2.1)动态依赖自动机生成一个新状态,表示该节点执行后的动态依赖关系,并将当前状态、对应事件和新状态用转移关系连接,并将新状态作为当前状态; 

1.2.2)在原程序该节点后插入包含该事件信息的触发状态跳转的语句,从而实现动态依赖自动机中状态间的跳转和其正确自动运行。 

直到遍历CFG上所有可能路径上的每个节点。这样,程序的动态依赖自动机构建完成,步骤3中驱动动态依赖自动机自动运行的触发信息也插入完毕。 

上述步骤1.2中的可能引起程序的动态依赖关系发生变化的节点,也称事件,包括4种类型: 

①程序开始; 

②调用外部构件,使用构件提供的服务; 

③分支和循环; 

④程序结束。 

经步骤1构建的动态依赖自动机中,每个状态将来使用的构件集合,即动态依赖关系中的Future信息,可通过分析程序从当前状态到结束状态所有可能的路径,其使用的构件集合即为当前状态精确的Future信息。因此,上述步骤2中计算动态依赖自动机中的动态依赖关系的Future信息具体步骤为: 

2.1)对动态依赖自动机中的每个转移,将转移之前的状态的动态依赖关系的Future信息更新为转移之前状态的动态依赖关系、触发转移的事件使用的构件与转移之后的状态的动态依赖关系的Future信息三者的并集; 

2.2)重复2.1)的步骤,直到所有状态的动态依赖关系的Future信息不发生变化为止,此时得到了包含动态依赖关系的Future信息的动态依赖自动机。 

对于步骤2)得到的动态依赖自动机,步骤3)将其插入到原程序的注释中,不仅方便查找,减少了程序运行时查找其对应动态依赖自动机的开销,同时也不会改变原程序的结构。 

程序开始运行时,其对应的动态依赖自动机自动运行,同时根据输入的事件信息自适应地更新程序当前执行环境的动态依赖关系。上述步骤4执行的具体步骤是: 

4.1)程序运行时,其对应的动态依赖自动机从初始状态开始运行,同时初始化此时的动态依赖关系中的Past信息为空. 

4.2)每执行步骤3)插入的触发信息,则触发程序自适应地从当前状态转移到下一状态,同时更新程序当前的动态依赖关系。自适应更新执行的具体步骤为:4.2.1)新状态的动态依赖关系中的Future信息为搜索包含Future信息的动态依赖自动机,根据当前状态找到经该触发信息转移到的下一状态,该下一状态的内容即为新状态的Future信息; 

4.2.2)新状态的动态依赖关系中的Past信息更新为当前状态的Past信息与触发状态转移的事件使用的构件的并集。 

有益效果:本发明提出的构件间动态依赖关系的自动分析方法,可以在程序运行过程中自动获得当前精确的动态依赖关系。在程序运行前,通过静态分析的方法构建程序的动态依赖自动机。当程序运行时,其对应的动态依赖自动机自动运行,同时根据当前的执行环境自适应地更新程序的动态依赖关系。此项技术的所有工作都是自动完成,与已有的方法相比,在开发效率和正确性上有了很大的提高。利用上述方法,开发了Java构件间动态依赖关系的自动抽取工具——DDET。DDET对Java字节码直接进行分析和操作,对于任意一个支持动态更新的Java构件系统,运行时可自动获得其精确的动态依赖关系。 

附图说明

图1为构件间动态依赖关系的自动分析方法流程图; 

图2为DDET的流程图;图3为动态依赖自动机实例图; 

图4为包含动态依赖关系的Future信息的动态依赖自动机实例图; 

图5为动态运行时获得程序精确的动态依赖关系实例图。 

具体实施方式

下面结合附图和具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。 

本发明的发明内容部分所述的技术方案的流程图如图1所示,利用上述方法,开发了Java构件间动态依赖关系的自动抽取工具——DDET(Dynamic Dependences Extracting Tool,动态依赖抽取工具)。DDET对Java字节码直接进 行分析和修改,它的输入可以是包含字节码文件的jar,war,ear包,也可以是单个字节码文件。DDET使用的字节码操纵工具是ASM(ASM是本领域技术人员熟知的工具,主页地址:http://asm.ow2.org/)。DDET的系统框架如附图2所示。 

DDET首先判断输入的字节码文件是否包含需要分析的事务方法,对于每个需要分析的事务方法逐一进行静态分析。静态分析的具体过程为: 

首先,使用ASM工具对事务进行控制流分析,得到该事务的控制流图。通过控制流分析,可以很容易的知道每个节点的后继节点。在此基础上构建事务的动态依赖自动机,并在构建过程中将事务的事件信息插入到相应的字节码序列中。此处的事件是指,可能引起事务的动态依赖关系发生改变的字节码(包括程序开始,调用外部构件的方法,分支、循环,程序结束)。 

然后,静态计算动态依赖自动机中每个状态将来使用的构件集合future,并将计算出的每个状态的Future信息以及每个状态的转移关系,通过ASM工具写入原字节码文件该事务的Transaction注释中。 

最后,当事务执行时,事务的动态依赖自动机自动运行,同时根据当前输入的事件信息和当前的动态依赖关系,自适应地更新下一时刻的动态依赖关系。 

我们以一个简单的Java EJB程序为例进行说明。Java程序如下,左边是其源程序,右边是类中的事务方法Example(实例)对应的字节码序列。 

事务使用的构件集合通过分析程序中的EJB依赖注入很容易获得:{a,b,c}。可能引起事务的依赖关系发生改变的事件通过分析方法Example可得,事件集合如表1所示。 

表1  影响事务动态依赖关系的事件 

事务从初始状态开始,遍历事务所有可能的执行路径,每遇到一个事件,则生成一个新状态,同时事务由当前状态转移到新状态,由此构建事务的动态依赖自动机,事务方法Example的动态依赖自动机如附图3所示,其中圆圈代表状态,箭头上的文字表示事件信息,箭头与其两端对应的状态组成一个转移。动态依赖自动机中每个状态将来要使用的构件集合Future,可以通过静态分析从当前状态到事务结束状态所有可能的路径获得。具体实现时可通过对每个转移执行更新过程:转移之前状态的Future ,触发转移的事件使用的构件与转移之后的状态的Future三者的并集来更新转移之前状态的Future,直到所有状态的Future不发生变化为止。此时我们得到了包含Future信息的动态依赖自动机,见附图4。附图4中每个状态旁第一行构件集合即为计算出的该状态将来要使用的构件集合 Future。 

当事务开始运行时,动态依赖自动机从初始状态开始运行,同时初始化当前状态的Past集合为空。根据事务实际执行的路径和输入的事件信息可以确定当前状态程序精确的动态依赖关系,包括Future信息和Past信息,见附图5。附图5中实线表示事务实际执行的路径,其中每个状态的精确的动态依赖关系已计算出,第一行构件集合表示该状态的Future信息,第二行的构件集合为Past信息。附图5中虚线标出的部分表示程序可能执行,但还未在本次执行中执行的路径。 

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号