- 1 -
UML支持的软件可靠性研究1
冯凯 1,李文锋 2
1武汉理工大学计算机科学与技术学院,武汉(430063)
2 武汉理工大学物流工程学院,武汉(430063)
摘 要: 针对目前软件可靠性设计过程中,引入新的设计模型会导致软件设计复杂性增加
的问题,通过对 UML的研究,本文提出了使用 UML对软件进行用例设计、类设计和时序
设计时增加容错模型来提高软件可靠性设计的方法,并通过对 机器人图形化编程软
件平台的可靠性设计,证明了方法的简洁性和可行性。
关键字: UML;软件建模;可靠性
中图分类号:TP311
1.引言
随着计算机应用越来越广泛,软件规模越来越大,复杂度也越来越高,软件出现不可靠
状态的概率也随软件规模的增长呈指数增长。为了解决软件可靠性先天不足的问题,已有很
多的专家,学者进行了这方面的研究。但是目前很多提高软件可靠性的设计方法中,一般是
在软件的设计中引进其他新的工具来对软件进行设计,如随机 Petri 网[1],Markov 链[2]等。
或者直接在软件设计时引入用例自动生成模型[3],然后使用这些测试用例对软件的可靠性进
行测试和评估。在实际的设计中将已存在的设计模型中再加入新的设计模型,需要对之前的
设计做很大的修改,这需要耗费很大资源。统一建模语言(Unified Modeling language, 简称
UML)是目前设计软件时使用最多的设计,建模语言。如果直接将软件的可靠性约束,直接
融入到软件的设计过程当中,会减少不必要的设计过程中资源的消耗。基于这种背景,本文
通过使用 UML对软件设计支持的研究,探讨了在软件设计过程中增加容错模型来提高软件
可靠性的方法,并通过对 这款机器人图形化编程软件的设计实践,对软件可靠性设
计进行了说明。
2.软件可靠性
软件可靠性是指软件在特定的环境和给定的时间内无失效运行的概率。目前提高软件可
靠性有两种途径:消除错误和容忍错误[4]。软件测试和验证主要是通过消除软件中的错误来
提高软件的可靠性,软件容错则是通过提高软件的容忍度来提高软件的可靠度。而软件规模
越大消除软件的全部错误的概率则越小。所以在现在的软件中大多以软件容错来提高软件的
可靠性。
软件容错主要有三种方法:一种称为恢复块(Recovery Block),该方法使用了冗余技术,
当检测到某个子系统发生错误时,系统恢复到调用该子系统前的状态并选择另一个功能相同
的子系统继续执行。另一种是 N版本程序设计(N-version Programming),这种技术并行执行
1本课题获得国家自然科学基金 ()资助
- 2 -
同一模块的多个版本,最后通过比较各个版本的输出来确定模块的输出。第三种方法是 N
自检查程序设计(N self-checking programming)。它在 N版本程序设计方法的基础上添加了
接受测试模块,只有通过接收测试的结果才能被接受。在软件设计时,根据系统对可靠性的
实际要求而采用不同的容错方式。
3.UML支持的软件可靠性设计
基于 UML的软件开发,在设计阶段一般有用例设计、类设计和时序设计 3个设计过程。
用例给出了软件系统级功能描述。一个用例的场景集合描述了完成用例功能过程中的软件总
体行为,每个场景描述了完成用例功能过程中软件对象之间以及软件对象与环境之间一次特
定的交互过程。类的设计是系统功能的具体实现,类设计的完整性和可靠性直接影响系统中
各组成部分的可靠性。时序设计是系统和用户交互的流程设计,它详细地描述每一个场景系
统内部的工作流程。
在用例设计时考虑软件的可靠性要求,这是软件可靠性设计的第一步。用例设计是系统
所有动作的集合,用例设计的完整性和可靠性决定了系统的整体功能的好坏。因此在设计用
例时除了需要考虑所有可能的动作外,还要在相关的用例设计的过程中加入可靠性约束,这
些可靠性约束是之后的类设计和时序设计的依据,也是设计测试用例的依据和可靠性评估的
重要依据。
软件可靠性设计的第二步是可靠性时序设计,它的目的是保证软件的可靠地运行,是软
件可靠性设计的核心。如果软件在执行的过程中存在时序混乱,则会导致软件运行时错误,
极大地降低了软件的可靠度。因此需要设计人员详细地设计各个环节的时序关系。通过对文
献的阅读以及实际的操作中总结出,导致时序出现混乱主要由三种情形:①当访问某个客体
对象的时候,客体对象的数据并非最新的数据,即读到“脏”数据;②时序异常中断导致数据
流的中断,即访问的客体中的数据本身存在错误;③由于访问主体本身的数据存在错误,当
访问某一客体时将错误传递到被访问的客体对象里,导致错误的感染扩散。
图 1 避免读“脏”数据的时序设计规则
- 3 -
针对以上提到的三种情况,在时序设计时,增加特定的处理来避免时序混乱情况的发生。
第一种情况的处理,如图 1所示。当主体需要访问某一客体时,不是直接读取客体的数据,
而是首先询问客体当前的数据是否为最新的数据。如果客体当前的数据是最新的,那么主体
可以直接访问客体,如果当前客体数据不是最新数据,客体首先询问对客体数据进行修改的
另一主体对数据的更新是否已经完成,如果已经完成则将数据更新,并使修改客体的主体释
放对客体的修改权限,如果还没有完成对数据的更新,客体将使读取客体信息的主体处于等
待的状态,而不再让其他的主体拥有对该客体修改的权限,直到数据更新完成,客体唤醒主
体,并容许主体访问客体的数据。
第二种情况和第三种情况类似,都是因为错误已经存在,系统需要解决的是如何容忍和
纠正已经存在的错误,以保证时序的正常。这两种情况的差别在于前者的错误在客体中存在,
而后者在主体中存在。如果错误发生在客体里,在主体询问客体数据状态时,客体已经不能
正常应答主体。如果错误发生在主体里,主体则有可能将自身的错误扩散到客体,从而使客
体的数据也出现错误的状态。根据软件失效后果的严重程度,可以选择两种处理方式:①采
用恢复块,将错误的状态恢复到之前的正常状态,这种做法的代价很高,一般只适用于对可
靠性要求非常高的软件;②采用默认值恢复,即将失效的数据用一定的默认数据进行恢复,
确保时序的顺利执行。这样的处理方式会导致之前的部分操作失效,用户需要重新操作才能
恢复之前的状态。
类设计是软件各组成部分的具体实现过程,也是软件可靠性设计的第三步。类的设计功
能是否能满足系统可靠性的要求,是系统能否按照正常时序执行的关键。但是由于在类设计
和实现的过程中,不免要带入一定的错误,所以在类的设计过程中需要加入容错机制。如果
在某个类里面产生的错误没有被处理,那么在程序运行过程中错误可能会感染其他的程序模
块,导致程序失效。所以一般在类设计时采取 N 自检查程序设计的方法。这种程序设计方
法,直接在模块内部对程序中的异常情况进行处理,这样既能使方便的处理程序中的异常情
况,也能很好的避免程序中错误感染的发生。
4.实例
本文以 机器人图形化编程软件的设计过程为例进行阐明。这款软件主要由初始
化、项目管理、流程绘制和通信连接 4个大的部分组成。图 2是简化了的 的用例图。
为避免各模块中出现的一些缺陷和错误传递到其他的模块,在各用例中出现的异常的情况都
应在各自的内部处理。
用例的执行顺序如图 3所示。USER首先执行 Init用例,然后执行 Project Manager
用例,即新建或打开项目;在项目新建或打开成功时, 进入编辑流程的状态,即执
行 Edit Flow用例。如果不成功则恢复至初始状态,执行 Init用例;执行 Edit Flow用例时,
USER在编辑区内进行相关操作,系统根据操作的结果生成相应的流程图。完成对流程的编
辑后,执行 Project Manager 用例,保存项目的相关信息。如果用户希望将编辑的流程信息
下载到机器人里面运行,则执行 Communicate用例,然后执行 Init用例完成整个的操作过程,
- 4 -
否则直接执行 Init用例完成操作。
图 2 的用例图 图 3 的执行顺序关系
在 Init用例和 Project Manager用例中都需要访问外设,文章以 Project Manager用例为
例说明可靠性时序设计,如图 4 所示。在 Project Manager用例中,最容易出现的异常情况
为在访问时可能出现的输入输出异常。因此系统内加入 IO Manager类,用来实现对外部数
据的处理和应答 Project Manager类对外设数据访问的询问。Project Manager需要访问数据时
首先询问 IO Manager,当外设数据存在错误时,IO Manager根据外设数据的重要程度,选
择使用默认值恢复和向 Project Manager报告异常情况。Project Manager再根据得到应答的情
况选择容忍错误或向用户提交错误报告后终止当前用例的执行。
图 4 Project Manager用例的可靠性时序设计 图 5 Edit Flow用例的可靠性时序设计
- 5 -
系统在正确的读取外设数据后,执行 Edit Flow用例,在 Edit Flow用例中主要描述的是
系统和用户的交互过程,在这里最容易出现的不可靠事件是用户的输入信息存在错误和用户
同时在不同的用例中对同一客体数据进行访问和修改,导致修改失效或读“脏”数据的问题。
图 5为 Edit Flow用例的可靠性时序设计。用户选择需要访问的节点 BDS_Node,节点首先
询问 BDS_Edit_Form 是否存在用例对节点进行编辑,如果存在而且用例的优先级不低于当
前用例,则等待直到用例对节点的编辑完成。否则直接访问节点数据。如果当前用例的优先
级高,当前用例将从正在运行的用例手中夺取该节点的编辑权限,并使正在运行的用例处于
等待状态。在用户提交会数据的修改时,系统通过 IO Manager检查用户的输入信息,当数
据检查无误后将输入数据提交之系统。
经过对 软件的详细分析,设计与编码,实现了一个稳定可靠,且满足需求的机
器人图形化编程软件开发平台。如图 6所示,软件的界面。
图 6 软件的界面
5.结束语
通过对 软件的设计与实践,提出了应用 UML对软件进行用例设计、类设计和
时序设计时增加容错模型来提高软件可靠性设计的方法,为解决目前软件可靠性设计过程
中,引入新的设计模型导致软件设计复杂性增加的问题,提供一种思路。
- 6 -
参考文献
[1] 李光运,陈咏章 用随机 Petri 网对构件化软件可靠性进行早期评估,计算机工程与应用
[J].(29):84-87
[2] 颜炯,王戟,陈火旺 基于 UML的软件Markov链使用模型构造研究,软件学报[J].(08):1386-1394
[3] 王昕,覃征,韩峰岩 基于 UML 软件可靠性用例生成的混合模型,西安交通大学学报
[J].(4):421-425
[4] 唐赞岳 构建软件可靠性测试技术研究,硕士学位论文,国防科技大学.2006:12-13
The software reliability design supports by UML
Feng Kai1,Li Wenfeng2
1 Department of Computer science and technology, Wuhan University of Technology, (430063)
2 School of Logistics Engineering, Wuhan University of Technology, (430063)
Abstract
At present, in order to improve the reliability of the software, many design methods quote new design
model. But it increases the complexity of the software design. Through studying on UML, it is put
forward that in software design process quote the tolerant fault model in use case design, class design
and sequence design to improve the reliability of the software used by UML. And an instance of design
procedure of which is a robot graphic programming software platform is introduced to prove
the method is briefly and feasibility.
Keywords: UML;software model;software reliability
作者介绍:
冯凯,男,1983年生,硕士研究生,主要研究方向:无线传感器网络和机器人技术;
李文锋,男,1966 年生,教授,博士生导师,主要研究领域:分布式传感与控制,机器人
技术,物流系统仿真与优化。