求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
 
软件可靠性工程
 

2010-06-23 来源:网络

 

软件可靠性工程随着计算机应用的普及,软件可靠性研究与工程实践倍受软件工程界和可靠性工程界的关注。可以说,80年代是软件工程研究的年代,90年代是软件可靠性工程的年代。但是,作为一门新兴的学科,软件可靠性工程领域还存在很多问题。本期专题从总体上系统地阐述了软件可靠性工程的产生、发展及要解决的问题,文章由中国船舶工业总公司第七一六研究所的孙志安博士撰写,包括以下5篇文章:

1.软件可靠性工程综述 本文概括介绍了软件可靠性研究与工程实践的历史、现状及展望,并提出了一些需要关注的问题。

2.实时软件的可靠性设计 实时软件的可靠性设计是软件可靠性工程设计中最具代表性的内容,本文介绍的设计方法对实时系统及其它系统均有意义。

3.软件可靠性模型的评价准则 本文针对目前种类繁多、数量庞大的软件可靠性模型,提出了一种评价准则。这不仅有利于研究和应用,而且对澄清目前的混乱状态也是一种有益的尝试和探讨。

4.软件复杂性的度量与控制 本文提出了几种较为有效的软件复杂性度量与控制方法,为软件的可靠性设计奠定了基础。

5.需求分析与软件可靠性保证 本文所介绍的需求分析中的软件可靠性保证,是软件可靠性设计中最容易被人忽视、但又最容易导致不可靠的一个重要因素。目前,大多数设备和系统的功能都是由软件规定的,因此,信息社会越来越依赖于软件。但是,软件可靠性日益严重地制约着软件产品更广泛地应用,甚至带来了一些灾难性的后果。事实证明,复杂软件对大小工程系统都是一个薄弱环节。即使是通过完备测试的软件,也常常受到错误的困扰。同时,一个日益增长的需求是,软件应具有检定合格的高可靠性。为解决软件危机而产生和发展起来的软件工程,成功地解决了软件开发中存在的许多问题。它不仅对软件开发、设计和生产有直接影响,而且对提高软件可靠性有显著成效。实践表明,使用软件工程方法,可达到一般的可靠性要求;但当软件可靠性要求更高时,则必须在实施软件工程的同时,采取一些专门的可靠性工程技术和方法,以保证所要求的可靠性。70年代初,以软件工程的大力发展和成功应用为契机,利用传统可靠性工程技术、方法和工具,软件可靠性工程得以产生和发展。它是为保证经济、及时地实现软件可靠性目标而采取的系统化技术、方法和管理措施,旨在开发以保证和提高软件可靠性为目标的技术,并通过工程化方法加以应用。它是一个工程领域,是软件工程的一个重要分支。其研究范畴覆盖了软件可靠性预计、分配、分析、设计、评价、测试、检定,以及可维护性设计、安全性设计和可靠性工程管理等方面。

一、软件可靠性模型

软件可靠性模型是软件可靠性工程中倍受关注、研究最早、成果最多、目前仍最活跃的一个领域。从Hudson的工作开始,到1971年发表J-M模型至今,已公开发表了100余种模型。它不仅是解决软件可靠性预计、分配、分析与评价等基本问题的最强有力的工具,更是软件可靠性设计的指南。它旨在根据软件可靠性数据、以统计方法给出软件的可靠性估计值或预测值,是从本质上理解软件可靠性行为的关键,是软件可靠性工程实践的基本活动。

1.模型分类

模型分类是软件可靠性工程研究与实践的前提。软件可靠性模型数量多、表达形式不同,且新模型不断发表;适用于某些软件故障数据集合的模型,不适用于其它故障数据集合;同一模型适用于同一软件项目开发的某个阶段,不适用于其它阶段;而且,有些模型是针对特定的软件或过程而开发的。这些无疑为模型的应用设置了障碍。为了系统、深刻地理解软件可靠性模型,有必要对现有模型进行科学、合理的分类。目前,关于如何进行模型分类与选择,尚无明确的指导原则,一般按数学结构、模型假设、参数估计、失效机理、参数形式、数据类型、建模对象、模型适用性和时域等进行分类。但是这些分类方法均缺乏足够的科学性、系统性和适用性。笔者认为,基于实用的目的,结合建模方法、适用范围、模型假设和模型特性等,在多维构架的基础上进行综合分类,将是模型分类研究的方向。

2.可靠性度量

IEEE于1989年发表的39种度量都直接或间接与软件可靠性度量相关,主要的度量有失效率、失效强度、残留缺陷、可靠度、平均无失效时间及可用度等。现在,一般的做法是,把它们按技术度量和管理度量落实到软件生命周期的每个阶段。其目的都是面向用户和开发人员,并以他们共同熟悉的形式对软件可靠性目标和任务加以度量。软件故障与差错的分析及定义是软件可靠性度量的基础。软件故障是软件中能引起一个及一个以上失效的缺陷,或是引起一个功能单元不能执行的意外条件,它是在软件设计过程中形成的。软件故障在数据结构或程序输出中的表现即为软件差错。常见的软件差错包括非法转移、误转移、死循环、空间溢出、数据执行和无理数据等。在软件可靠性分析和设计中,常常利用故障模型来对不同的故障表现进行抽象。故障模型可以建立在系统的各个级别上。建立的级别越低,进行故障处理的代价就越低,但模型所覆盖的故障也越少。常用的故障模型有基于逻辑级、基于数据结构级和基于系统级的故障模型。

3.模型建立

软件可靠性模型的建立是通过对所选模型关联参数的统计来确定失效情况、可靠性目标和实现这一目标的时间,并利用可靠性模型来制定测试策略,同时确定软件交付的预期可靠性。

此外,它对经费估算、资源计划、进度安排和软件维护等也很重要。软件可靠性建模可归结为模型的比较与选择、参数选择及模型应用。模型参数取决于软件性能、过程特性、修改活动和程序变化等。由于软件本身的特性,以及缺乏可靠性数据,因此建立完全满足这些因素的可靠性模型非常困难,且难以验证。

软件可靠性模型的导出,是在定义软件失效概率密度或分布函数、或确定危险函数的基础上,把它描述为一个随机过程,或使它与Bayes估计、Markov过程或时间序列模型等相关联。

值得注意的是,软件可靠性模型对高可靠性的验证和测试策略的制定还有很大困难。虽然可以通过软件容错来克服这种困难,但其有效应用尚待深入研究。

4.模型统一

目前,种类和数量繁多的软件可靠性模型导致了理论研究和实际应用的困难。因此,很有必要对这种明显的混乱状态进行澄清,而统一模型是最有希望的解决办法。它试图为软件可靠性模型所涉及的范围、结构等建立一个统一的框架,从中反映出现有模型在理论和实际应用间的差别,并能在对象和特性分析的基础上,为用户提供合适的模型。各类模型之间关系密切,模型合并将有助于突出其关系。在软件可靠性模型中,软件的故障行为常常被描述为随机过程,也可用马尔可夫过程来描述。为了能导出模型的解析表达式,先验分布主要采用均匀分布、γ分布和β分布。从J-M模型、Shooman模型和Musa模型的表达式、假设条件、使用方法等来看,都具有λ=k*y的形式。在这种意义下,它们是等价的。二项式模型与泊松模型可相互转化。从Bayse观点来看, Hangverg&Sigpurwalla 指出,从二项式模型可推导出指数类的泊松形式模型,Bayse模型类中的L-V模型即是二项式模型中的Pareto类模型。

从现有模型来预计软件可靠性,往往存在偏差。当给定或已知数据的基本分布时,极大似然估计是模型参数估计最基本的方法,它显然有利于对预计的改进。最小二乘法能很好地代替极大似然估计,它通过故障强度拟合来估计模型参数。对中小样本的情况,它具有较小的偏差和较快的收敛性。Bayes分析方法提供了一种把先验知识综合到估计过程中的方法,为把不同数据源综合起来提供了有效的手段,但其分析和计算极为复杂。

二、软件可靠性设计

软件可靠性工程的根本目的是设计可靠的软件。软件可靠性设计通过采用相应的技术和工具来减少错误的发生,从而尽量避免错误(即避错)。避错设计是软件可靠性设计的基本方法,但只能达到一定的限度。要想进一步提高可靠性,只有采用容错技术。当然,按软件工程原理进行软件开发是保证软件可靠性的基本方法。

1.软件可靠性分配

软件可靠性分配是将需求分析中形成的可靠性指标分配到各个软件部件,是软件可靠性工程设计的基础,是在充分考虑软件及其开发过程的特征并继承和发展可靠性工程已有成果的基础上发展起来的。目前,主要有快速分配法,以及基于重要度、运行时间和复杂度分配等方法,而后者是普遍使用的方法。

脱离实际、孤立地对软件可靠性进行分配毫无意义,因为不同的软件在功能、性能、规模和结构等方面均存在很大差异。就每个具体的软件而言,是否需要进行可靠性分配、如何分配,必须对实施该软件的过程、环境和条件等加以分析,并应遵循确保重点、难度均等、留有余地、逐步完善的分配原则。

2.重用设计

60年代的软件危机导致了软件重用设计的产生和发展。软件重用即所谓"软件总线技术",是在软件设计过程中对现有成果进行充分再利用的活动,是提高软件生产率、降低开发成本和提高软件可靠性的最有效途径之一。特别在面向对象程序设计方法获得广泛应用后,软件重用日益受到人们的重视,并逐渐成为可靠软件设计的重要方法。软件的重用途径包括合成技术和生成技术。合成技术是利用组装方式来重用软件构件对已有构件仅做少量修改或不做修改,然后"插装"在一起,构造出新的目标系统。生成技术是由程序生成器获得软件重用,是对模式的重用,由生成器导出模式的专有或定制版本,以实现模
式重用。合成技术也许更有前途,其关键是组件的接口标准。现在,主要的组件接口标准有OLE/COM、CORBA和OpenDoc。有了这些标准,软件开发人员即可独立地开发或利用组件。从软件重用的层次来看,软件重用包括重用数据、重用设计、重用代码和重用规范说明等。但是,软件重用正面临着通用性与专用性、构件的分类与查找、理解、修改、规模、资金,以及其它潜在的问题。因此,目前的主要工作是寻找能大幅度提高软件可靠性和开发效率、且便于实际操作的方法。

软件重用已在子程序库、报告生成器、编译器等方面取得了可喜的进展,但最系统化、工程化的软件重用活动是基于重用库的软件重用。90年代,软件重用实践有三个趋势:一是软件重用的实践惯例化、用户化;二是将重用技术集成到软件开发过程中,逐步实施软件过程的自动化与形式化;三是将领域分析标准化,开发支持领域分析的方法和工具。重用的实现程度依赖于开发规范的完善,快速原型法的成功在一定程度上有赖于重用思想的实现,以及基于重用思想的系统拆装工具的支持。面向对象的程序设计是重用设计的一种具体方法。它在重用的大框架下,将可重用而又互不相交的客体聚集为不同属性的类,抽取类的最大共性集合构造基类,再分层构造有共性的子类。

目前,软件重用的构件涉及到领域分析、抽象、重用库的组织、可重用构件的分类、检索、定位和理解、接口、组织、环境、重用理论支持等问题,它们的克服与解决将是软件重用的重点和热点。

3.形式化设计

软件复杂性通常掩盖了软件设计中的固有错误,因此,要获得较高的软件故障独立性往往很困难。越来越多的软件专家认为,由于软件太复杂,不能在现实世界中得到有效的测试,最佳的解决办法是采用形式化的程序设计、编程系统及验证方法。使用以数学为基础的描述是解决软件设计的精确性和正确性的最好办法。为了使软件设计的每个阶段都能得到有效的测试和验证,最高一级的技术要求(即软件需求分析)必须采用形式化的分析、说明和表达。形式化方法用严密的数学方程和形式化语言来描述软件的需求。

操作语义、数学语义和公理语义是目前主要的三种形式化方法。操作语义为了描述语句在语言中的影响而使用一种按语言执行的假想机器,它已逐渐被数学语义所取代。数学语义是使一种已知语言的每一短语都与一个适当的数学目标联系起来,从而使语义学形式化。短语即所联系的目标,而目标即为短语的标志。这种方法正逐渐被公理语义所取代。操作语义和数学语义为待定义的语言提供模型,而公理语义以一组公理和推断规则隐式地定义一种程序语言,从而验证程序特性,特别是给定程序的正确性,实现了一种给定的输入/输出关系。

形式化规范对高层次数学抽象上定义的数据目标和在抽象句法上定义的函数等提供依据,只有低层次的"无语句"才用于设计抽象变量和"具体句法"的抽象语句。因此,随着程序设计的逐步细化与深入,我们感到,不能把形式化规范所用的方法与抽象的正确性证明分开。目前,许多形式化规范语言正在得到应用,也有了许多试图用于编程语言的语义学方面的尝试,但还没有一种解决办法得到软件工程界的普遍认可。

三、软件测试

软件测试是程序的一种执行过程,目的是尽可能发现并改正被测试软件中的错误。它是软件生命周期中一项非常重要且非常复杂的工作,对软件可靠性保证具有极其重要的意义。在目前形式化方法和程序正确性证明技术还无望成为实用性方法的情况下,软件测试在将来相当一段时间内仍然是软件可靠性保证的有效方法。

1.测试过程

软件测试包括模块测试、集成测试、系统测试和交验测试。模块测试通过对模块的局部数据结构、主要逻辑路径、接口和边界等进行测试来验证模块的功能、性能和可靠性等指标,以证实其工作满足设计要求。集成测试是对接口正确性、数据传递的正确性和集成质量、时间匹配等进行测试。系统测试是软件与工程系统、其它软件和某些应用系统的对接联调测试,主要用以验证设备之间或系统之间的信息传递、时间分配、功能要求等是否满足要求。交验测试是在软件交验时,按照用户需求对软件进行的全面的最终测试。通常,它测试软件的功能、性能、操作和可靠性等,同时,也测试软件系统的可移植性、兼容性、错误恢复处理和协调的可维护性等。

2.测试方法

软件测试的方法主要有:着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试的"黑箱"法;全面了解程序内部逻辑结构、对所有逻辑路径进行测试的"白箱"法。

一般通过设计驱动程序产生测试数据,并把它们传递给被测试模块,同时输出测试结果。用伪模块代替被测试模块调用的模块,采用原来的模块接口,执行少量数据处理,结果返回给被测试模块。驱动程序和伪模块的设计必须简单有效,否则会增加测试的复杂性。集成测试有自顶向下和自底向上两种测试方法。自顶向下的测试是按照控制结构,从主控模块开始,向下把模块逐个连接起来。把附属于主控模块的小模块连接起来的方式有深度优先法和宽度优先法。自顶向下的测试可较早地检查主要的控制和判决点,尤其是采用深度优先法,可较早地执行和证明软件的完整功能。但为了测试高层模块,有时需要低层模块参加工作,而此时低层模块是伪模块,因此没有足够的信息可以向上传递。有效的解决办法是,把一些测试项目推迟到真模块取代伪模块后再进行。

自底向上的测试是从基本模块开始连接和测试。因为是从低层次开始,逐级向上进行测试,因此不再需要下一层次的伪模块,但需要驱动程序参与测试。这种方法测试范围从小到大,比较直观,但不能过早地发现软件的总体设计错误。因此,对于软件的整体测试,最佳的办法是将上述两种方法有机地结合起来,最高几层参与自顶向下测试,其它模块参与自底向上测试。

3.测试工具

测试自动化是人们追求的目标和发展的方向。目前,尽管开发出了不少软件测试工具,但这些工具还主要用于对程序进行静态分析、为测试用例和测试数据提供信息,以及测试结果处理等。为了提高测试的准确性和测试效率,急需集成的全过程自动测试工具。

所幸,生产基于Windows界面的C/S应用软件自动测试工具的SQA公司与生产组件的Ratinal公司合并,为组件的建立、组合、测试和管理提供了综合解决方案。另外,PureAtria公司为在Windows NT和Unix平台上用C、C++和FORTRAN等开发的应用软件的测试做出了突出贡献。这两家公司的互补为用户提供了新一代全过程测试工具,为集成的全过程自动测试工具的成功开发奠定了基础。在各方努力下,软件测试获得了巨大的发展,在软件可靠性工程中发挥了巨大作用。目前,主要是缺乏有效的指导原则,使软件测试具有一定的盲目性。

四、程序正确性证明

程序正确性证明技术是软件可靠性保证的另一重要方法,主要有语法正确性证明、语义正确性证明、数学证明和基于公理的正确性证明等方法。语法正确性和语义正确性证明主要用于软件编码阶段及其后续阶段、基于语用基础之上的正确性证明。语义正确性证明始于本世纪60年代,至今仍处于研究和试验阶段。自高级语言编译程序问世以来,对形式化定义的语言,语法正确性证明技术已日趋成熟,并得到广泛应用。

没有数学验证的软件可靠性工程无异于空话,数学验证的严谨性将为提高软件可靠性发挥积极的作用。

引入集合与函数的验证方法,为逐步扩大推理建立了基础。用集合、栈和队列进行软件设计,为大规模软件的验证奠定了基础。但程序语言的某些具体特点给程序正确性证明造成了严重的困难。

程序正确性证明工具不断推陈出新,自动化证明工具正在成为这一领域的研究热点。不过,在自动化证明尚不可能的情况下,人工证明和统计测试的有机结合为程序正确性证明带来了曙光,为可靠程序的设计开拓了新的视野。

五、软件的可维护性设计

软件维护是软件交付后改正缺陷、克服故障、增强功能、改善性能或其它属性,以及为使其适应新环境而对其进行修改或扩充的过程,是软件生命周期的最后一个阶段,是软件可靠性工程的主要内容之一。

软件维护包括纠错性维护、适应性维护、完善性维护和预防性维护。在软件维护过程中,有三种维护过程模型:①快速固定模型:首先将原系统代码更新成新系统代码,然后生成需求规格说明等文件,并进行测试;②交互提高模型:对老系统代码进行测试、分析后,产生新系统的需求规格说明,然后按正向工程产生新的系统文档及代码;③全重用模型:对老系统的设计文档、代码、测试文档等全面进行逆向工程设计,从而得到新的软件系统。

软件维护技术可分为面向维护的技术和维护支持技术。面向维护的技术是在软件开发阶段用来减少错误、提高软件可维护性的技术,涉及软件开发的每个阶段。维护支持技术是在维护阶段用来提高维护效率和质量的技术,包括信息收集、错误分析、维护评价、代码与文档修改、维护确认、维护测试、远距离维护等内容。

软件的可理解性、可测试性和可修改性等是决定软件可维护性的基本因素。软件的可维护性除了与良好的设计、完善的文档、严格的测试相关外,还与软件生命周期中的所有活动密切相关。在软件生命周期的每个阶段,都必须充分考虑软件的可维护性问题,并进行可维护性设计。

由于软件的复杂性等因素所造成的困难,维护工作极大地依赖于维护工具和方法的支持。由于维护人员往往只着眼于需要理解和修改的部分,因此便引出了程序观察问题。解决这一问题最一般的方法是高层图表示,也有些研究着眼于改造源代码的可视性。此外,支持软件维护的超文本技术、基于抽象的高层抽象技术,以及基于数据库查询的辅助维护工具等都代表了软件维护工具的发展方向。软件维护实际上是软件重用的实践,对软件重用方法和技术的深入研究,有利于改善软件维护的现状。

六、软件失效与安全性分析

软件安全性是软件运行时不发生事故或不导致事故发生的能力。对关键软件进行全过程的安全性设计与分析、验证与评价、控制与管理非常重用。软件安全性设计应与软件可靠性设计综合权衡,协调进行。当然,软件安全性设计要以软件可靠性工程为基础,在软件安全性工作中应遵守软件工程原理。软件安全性分析方法主要有故障树分析法(FTA)、失效模式与效应分析法(FMEA)等。近年来,定时Petri网分析及Petri网与故障树分析相结合的综合方法得到了大力推崇和成功应用。

软件故障树分析是从硬件故障树分析演变而来的。它从假设可能导致不安全或失效的系统行为的软件控制问题(顶事件)开始,对软件进行分析,识别所有可能导致顶事件的潜在行为和条件。这些行为和条件被表示出来之后,通过软件分析来识别其可能的原因,确定它们是否与软件本身相矛盾。如果产生矛盾或事件的可能起因会被系统阻止,则顶事件的一个起因就可以消除。如果该顶事件的所有起因都被消除了,则系统被证明能防止该事件。如果初始软件或系统状态要引起可能导致顶事件的事件发生,则需要改变该软件设计,以防止顶事件的发生。故障树分析的关键在于逻辑证明,而不在于概率估算。

定时Petri网是简单Petri网的增强。利用定时Petri网的研究成果和表示方法,能很好地对系统的失效和安全性进行分析。为了使用定时Petri网来评价软件的失效安全性,软件设计被表示为一个定时Petri网。网的一个状态子集被指定为可能失效或不安全的状态,且网被扩大以指示出那些不安全状态的条件,然后对网进行分析,以确定是否可以从初始系统状态通过一系列的转移点达到任何失效和不安全的状态。这样,如果条件保持,系统将进入失效或不安全状态。

对于许多应用,既可以用故障树,也可以用定时Petri网来评价软件的失效或安全性行为。但Petri网明确地构造出软件的结构和系统执行期间的事件模型,且这些事件预计产生条件的语义被抽象地表示出来;而在故障树中,条件和事件的语义是明确描述出来的,但引起那些事件的结构被抽象地处理了。这两种分析方法的综合,将向分析人员提供一个系统的两种互补的视图。

软件可靠性工程研究的目标是应用理论知识、科学方法和工程规范来指导可靠软件的开发,以期用较少的时间和投入获得高可靠的软件产品。它是软件质量管理的一个新的里程碑,使软件可靠性的分析、评价、设计、验证及管理水平迈向了系统化、规范化、全员化。但是,要生产足够可靠的软件,并测量其可靠性,仍相当困难。作为软件产品的一个重要质量特性,软件可靠性因为其自身的固有特性,不论其理论,还是其方法和管理都有别于传统的可靠性工程。软件可靠性工程是一门涉及多学科、多领域的新兴学科。尽管它还受到技术、方法、工具等支持的限制,但随着用户对软件可靠性需求的日益高涨,它正以前所未有的速度在发展,并吸引着一大批有志于软件可靠性工程的志士仁人为之努力。



专家视角看IT与架构
软件架构设计
面向服务体系架构和业务组件
人人网移动开发架构
架构腐化之谜
谈平台即服务PaaS


面向应用的架构设计实践
单元测试+重构+设计模式
软件架构师—高级实践
软件架构设计方法、案例与实践
嵌入式软件架构设计—高级实践
SOA体系结构实践


锐安科技 软件架构设计方法
成都 嵌入式软件架构设计
上海汽车 嵌入式软件架构设计
北京 软件架构设计
上海 软件架构设计案例与实践
北京 架构设计方法案例与实践
深圳 架构设计方法案例与实践
嵌入式软件架构设计—高级实践
更多...