论文部分内容阅读
随着互联网和软件开发技术的快速发展,积累的遗留系统和自由软件数量越来越多,这些软件因为相关文档的缺失而使人们难以理解软件的结构从而造成开发和维护上的困难。为了帮助人们理解软件的结构,需要对此类软件进行结构分析,从而得到展示程序中各个方法间的调用关系的软件结构模型。当今UML图是描述软件结构的标准工具,但UML图并没有精确的语义,因此UML图不能直接用于基于模型的分析,也不能支持性能分析。而使用流程挖掘技术分析记录着软件的运行信息的事件日志,可进行基于流程挖掘的结构分析,从而可得到软件的结构模型,而且该模型由于具有精确的语义可直接用于基于模型的分析,比如软件性能分析。应用流程挖掘技术进行结构分析时,流程挖掘算法的输入为事件按照运行实例(简称实例)分组的事件日志。但是由于软件并行处理多个用户请求,多个实例的事件混杂地记录在原始日志中,并且事件缺失实例标识,这使事件无法按实例分组,所以原始日志进行实例化处理使事件能按实例分组后才能用于当前的流程挖掘算法和工具。事件能按照实例分组的关键是事件间的相互关联,然而,由于软件会使用多个线程和多个进程处理每个用户请求,导致实例化中事件关联问题依赖于线程关联问题和进程关联问题,除此之外,由于线程和通信资源的重复使用,导致存在关联不准确的问题,这些问题使原始日志实例化具有较高的挑战性。为解决上述问题,本文对原始日志实例化问题进行深入的研究和分析,基于原始日志中事件间、线程间和进程间的关联关系,提出了一个实例化算法,从而解决原始日志实例化问题。本文具体的工作内容如下所示:(1)形式化定义了原始日志,确定了原始日志包含了对实例化处理和结构分析有价值的运行信息。并基于反射植入技术,实现了一个原始日志的收集工具。(2)针对同一线程里的事件关联问题,基于方法间的调用关系以及方法运行时间区间的包含关系,定义了调用关联规则,用于关联属于同一实例的两个事件。(3)针对线程关联问题(实际为同一进程里的线程关联问题),基于线程间的父子关系以及线程的执行顺序,定义了线程关联规则,用于关联属于同一实例的两个线程。(4)针对进程关联问题(实际为不同进程里的线程关联问题),基于线程间的通信以及线程占用通信资源的时间区间,定义了进程关联规则,用于关联属于同一实例但在不同进程里的两个线程。(5)基于以上三种关联规则,实现了一个原始日志实例化算法,该算法可以使原始日志中的事件能按实例分组:首先使用调用关联规则使同一线程内属于同一个实例的事件聚集起来;然后使用线程关联规则使不同线程里属于同一个实例的事件聚集起来;最后使用进程关联规则使不同进程里属于同一个实例的事件聚集起来,从而得到事件日志。通过多线程实验和多进程实验来评估实例化算法的可行性和日志收集对软件的性能影响:在两个实验中实例化成功率分别高达80%和92%,与现有的算法相比,本文的实例化算法能够解决面向结构分析的原始日志实例化问题;在实验中通过比较原软件和插装了监测代码的软件的运行时间,证明本文基于反射植入的日志收集方法对软件的时间开销影响小。最后将实例化得到的事件日志用于流程挖掘,可进行结构分析和性能分析,这说明了本文的工作对于软件分析是有意义的。