第9章软件可靠性基础知识&9.1 软件可靠性基本概念&9.2软件可靠性建模&9.3软件可靠性管理
随着软件复杂度的增加,软件设计的正确性验证成本也越来越高。可靠和可信的计算模型首先在军事和高要求的商业系统中开始研究,可靠性和其他质量属性一样是衡量软件架构的重要指标。实践证明,保障软件可靠性最有效、最经济、最重要的手段是在软件设计阶段采取措施进行可靠性控制。
本章探讨软件可靠性的概念、模型、设计、测试以及评价等相关技术。
9.1 软件可靠性基本概念
在现代军事和商用系统中,以软件为核心的产品得到了广泛的应用。随着系统中软件成分的不断增加,使得系统对软件的依赖性越来越强,对软件可靠性的要求也越来越高。软件可靠性技术研究成为当今可靠性工程研究领域中一个重要领域。
国外从20世纪60年代后期开始加强对软件可靠性的研究工作,经过40多年的研究,推出了各种可靠性模型和预测方法,于1990年前后形成了较为系统的软件可靠性工程体系。同时,从20世纪80年代中期开始,西方各主要工业强国均确立了专门的研究计划和课题,如英国的AIVEY (软件可靠性和度量标准)计划、欧洲的ESPRIT (欧洲信息技术研究与发展战略)计划、SPMMS (软件生产和维护管理保障)课题和 Eureka (尤里卡)计划等。每年都有大量的人力、物力投入到软件可靠性研究项目中,并取得了一定的成果。
国内对于软件可靠性的研究工作起步较晚,在软件可靠性量化理论、度量标准(指标体系)、建模技术、设计方法和测试技术等方面与国外差距较大。
9.1.1软件可靠性定义
软件可靠性 (Software Reliability) 是软件产品在规定的条件下和规定的时间区间完成规定功能的能力。规定的条件是指直接与软件运行相关的使用该软件的计算机系统的状态和软件的输入条件,或统称为软件运行时的外部输入条件;规定的时间区间是指软件的实际运行时间区间;规定功能是指为提供给定的服务,软件产品所必须具备的功能。
软件与硬件有很多不同点,但从可靠性的角度来看,它们主要有如下4个不同点。
(1)复杂性。软件内部逻辑高度复杂,硬件则相对简单,这就在很大程度上决定了设计错误是导致软件失效的主要原因,而导致硬件失效的可能性则很小。
(2)物理退化。软件不存在物理退化现象,硬件失效则主要是由于物理退化所致。这就决定了软件正确性与软件可靠性密切相关,一个正确的软件任何时刻均可靠。然而,一个正确的硬件元器件或系统,则可能在某个时刻失效。
(3)唯一性。软件是唯一的,软件复制不改变软件本身,而任何两个硬件不可能绝对相同。
这就是为什么概率方法在硬件可靠性领域取得巨大成功,而在软件可靠性领域不令人满意的原因。
(4)版本更新较快。硬件的更新周期通常较慢,硬件产品一旦定型一般就不会更改,而软件产品通常受需求变更、软件缺陷修复的需要,造成软件版本更新较快,这也给软件可靠性评估带来较大的难度。
1983年,美国 IEEE计算机学会对“软件可靠性”做出了明确的定义,随后,此定义经美国标准化研究所批准为美国的国家标准。在1989年,我国国家标准GB/T-11457也采用了这个定义。这个定义就是:在规定的条件下,在规定的时间内,软件不引起系统失效的概率,该概率是系统输入和系统使用的函数,也是软件中存在的缺陷函数;系统输入将确定是否会遇到已存在的缺陷(如果缺陷存在的话)。
简言之,就是在规定的时间周期内,在所述条件下程序执行所要求的功能的能力。显而易见,美国 IEEE 计算机学会关于“软件可靠性”的定义仍然沿用了“产品可靠性”的定义,但有了更具体的定位和更深入的描述。
下面来分析一下软件可靠性的框架性定义。
(1)规定的时间。
软件可靠性只是体现在其运行阶段,所以将“运行时间”作为“规定的时间”的度量。“运行时间”包括软件系统运行后工作与挂起(开启但空闲)的累计时间。由于软件运行的环境与程序路径选取的随机性,软件的失效为随机事件,所以运行时间属于随机变量。
(2)规定的条件。
规定的条件主要指软件的运行环境。它涉及软件系统运行时所需的各种支持要素,如支持硬件平台(服务器、台式机和网络平台等)、操作系统、数据库管理系统、中间件,以及其他支持软件、输入数据格式和范围及操作规程等。不同的环境条件下软件的可靠性是不同的,具体地说,规定的环境条件主要是描述软件系统运行时计算机的配置情况及对输入数据的要求,并假定其他一切因素都是理想的。有了明确规定的环境条件,还可以有效地判断软件失效的责任在用户方还是开发方。
(3)所要求的功能。
软件可靠性还与规定的任务和功能有关。由于要完成的任务不同,软件的运行情况会有所区别,则调用的子模块就不同(包括程序选择路径不同),其可靠性也就可能不同。所以,要准确度量软件系统的可靠性,必须先明确它的任务和功能。
(4)“软件可靠性”定义具有以下特点。
①用内在的“缺陷”和外在的“失效”关系来描述可靠性,更能深刻地体现软件的本质特点。
②定义使人们对软件可靠性进行量化评估成为可能。对于软件的可靠性这样一个质量特性,很难用一个明确直观的数值去体现。而依据这个定义,人们有可能通过分析影响可靠性的因素,用函数的形式,按照不同的目的建立各种数学模型去分析软件可靠性。
③用概率的方法去描述可靠性是比较科学的。前面讲到,软件失效是随机的外部表现,完全是一个随机事件,而软件缺陷是软件固有的没有损耗的内在特点。定义用规定时间内其操作不出现软件失效的概率,也就是输入未碰到软件缺陷的概率来描述可靠性,这种方法就是用概率来描述纯粹的随机事件,是比较合理的,也是可行的。
9.1.2软件可靠性的定量描述
从软件可靠性的定义可以看到,软件的可靠性可以基于使用条件、规定时间、系统输入、系统使用和软件缺陷等变量构建的数学表达式。下面从可靠性定义中的术语“规定时间”“失效概率”开始,探讨软件可靠性的定量描述,并相应地引入一些概念。
1.规定时间
对于“规定时间”有3种概念:一种是自然时间,也就是日历时间,指人们日常计时用的年、月、周、日等自然流逝的时间段;一种是运行时间,指软件从启动开始,到运行结束的时间段;最后一种是执行时间,指软件运行过程中,中央处理器 (CPU) 执行程序指令所用的时间总和。
例如,某单位有一套供会计人员使用的财务软件,我们来关注一整天的时间,上午9:00上班开机运行,下午5:00下班退出程序。在这里,自然时间是一天,也就是24小时,运行时间是8个小时,而CPU 处理程序的执行时间可能不到2小时,这要视会计的业务繁忙状况、使用软件的频度和软件本身的设计而定。
很明显,在这三种时间中,人们使用执行时间来度量软件的可靠性最为准确,效果也最好。如果运行的软件系统处于一种相对稳定的工作状态,可以根据一定的经验值,按一定的换算比例,对这三种时间进行折算。
2.失效概率
从软件运行开始,到某一时刻 t为止,出现失效的概率可以看作是关于软件运行时间的一个随机函数,用F(t) 表示。根据我们对软件可靠性的分析,函数F(t) 有如下特征。
(1)F(0)=0, 即软件运行初始时刻失效概率为0。
(2)F(t) 在时间域(0,+ c ) 上是单调递增的。
(3)F(+c)=1, 即失效概率在运行时间不断增长时趋向于1,这也和“任何软件都存在缺陷”的思想相吻合。
为了简化分析,把F(t) 看作关于时间 t 的一个连续函数,并且可导。
3.可靠度
人们用来表示可靠性最为直接的方式就是可靠度,根据可靠性的定义,可靠度就是软件系统在规定的条件下、规定的时间内不发生失效的概率。如果用F(t) 来表示到t时刻止,软件不出现失效的概率,则可靠度的公式为
R(t)=1-F(t) (9-1)
同样,我们知道R(0)=1,R(+ )=0。
4.失效强度
失效强度 (Failure Intensity) 的物理解释就是单位时间软件系统出现失效的概率。在t时刻到t+△t时刻之间软件系统出现失效的平均概率为 (F(t+△t)-F(t))/△t, 当△t趋于很小时,就表现为 t时刻的失效强度。用f(t) 表示失效强度函数,则
5.平均失效前时间

可靠度为R(t) 的系统平均失效前时间 (Mean Time To Failure,MTTF) 定义为从t=0时到故障发生时系统的持续运行时间的期望值:
对于不可修复系统,系统的平均寿命指系统发生失效前的平均工作(或存储)时间或工作次数,也称为系统在失效前的平均时间。MTTF 的长短,通常与使用周期中的产品有关,其中不包括老化失效。
6.平均恢复前时间
平均恢复前时间 (Mean Time To Restoration,MTTR) 是随机变量恢复时间的期望值,就是从出现故障到修复成功中间的这段时间,它包括确认失效发生所必需的时间,记录所有任务的时间,还有将设备重新投入使用的时间。MTTR越短表示易恢复性越好。
7.平均故障间隔时间
MTBF(Mean Time Between Failures, 平均故障间隔时间)定义为:失效或维护中所需的平均时间,包括故障时间以及检测和维护设备的时间。
对于可靠度服从指数分布的系统,从任一时刻 t?到达故障的期望时间都是相等的,因此有:

当讨论完对软件可靠性的定量描述问题之后,需要对软件可靠度这个直接反映软件可靠性的度量指标作下列补充说明。
(1)描述的软件对象必须明确,即需指明它与其他软件的界限。
(2)软件失效必须明确定义。
(3)必须假设硬件无故障(失效)和软件有关变量的输入值正确。
(4)运行环境包括硬件环境、软件支持环境和确定的软件输入域。
(5)规定的时间必须指明时间基准,可以是自然时间(日历时间)、运行时间、执行时间
(CPU 时间)或其他时间基准。
(6)软件无失效运行的机会通常以概率度量,但也可以是模糊数学中的可能性加以度量。
(7)上述定义是在时间域上进行的,这时软件可靠度是一种动态度量。也可以是在数据域上将软件可靠度定义为一种表态度量,表示软件成功执行一个回合的概率。软件回合 (Run) 是指软件在规定环境下的一个基本执行过程,如给定一组输入数据,到软件给定相应的输出数据这一过程。软件回合是软件运行最小的、不可分的执行单位,软件的运行过程由一系列软件回合组成。
(8)有时将软件运行环境简单地理解为软件运行剖面 (Operational Profile)。欧空局 (ESA)标准PSS-01-21(1991)“ESA软件产品保证要求”中,“软件运行剖面”的定义为:“对系统使用条件的定义。系统的输入值都用其按时间的分布或按它们在可能输入范围内的出现概率的分布来定义”。简单来说,运行剖面定义了关于软件可靠性描述中的“规定条件”,也就是相当于可靠性测试中需要考虑的测试环境、测试数据等一系列问题。
9.1.3可靠性目标
前面定量分析软件的可靠性时,使用失效强度来表示软件缺陷对软件运行的影响程度。然而在实际情况中,对软件运行的影响程度不仅取决于软件失效发生的概率,还和软件失效的严重程度有很大关系。这里引出另外一个概念——失效严重程度类 (Failure Severity Class)。
失效严重程度类就是对用户具有相同程度影响的失效集合。
对失效严重程度的分级可以按照不同的标准进行,最为常见的是按对成本影响、对系统能力的影响等标准划分软件失效的严重程度类。
对成本的影响可能包括失效引起的额外运行成本、修复和恢复成本、现有或潜在的业务机会的损失等。由于失效严重程度类的影响分布很广泛,为了按照一定数量的等级去定义失效严重程度类,通常用数量级去划分等级。
表9-1给出了一个按照对成本的影响划分失效严重程度类的例子,这个例子涉及的软件系统是某电子商务运营系统。

对系统能力的影响常常表现为关键数据的损失、系统异常退出、系统崩溃、导致用户操作无效等。对于不同性质的软件系统,相同的表现可能造成的失效严重程度是不同的,例如对可用性要求较高的系统,导致长时间停机的失效常常会划分到较高的严重级别中去。
表9-2给出了一个按照对系统能力的影响划分失效严重程度类的例子,这个例子涉及的软件系统是某电信实时计费系统。

有了失效严重程度的划分,现在可以结合失效强度来定量地表示一个软件系统的可靠性目标了。
可靠性目标是指客户对软件性能满意程度的期望。通常用可靠度、故障强度和平均失效时间 (MTTF) 等指标来描述,根据不同项目的不同需要而定。建立定量的可靠性指标需要对可靠性、交付时间和成本进行平衡。为了定义系统的可靠性指标,必须确定系统的运行模式,定义故障的严重性等级,确定故障强度目标。
例如,对于表9-1的例子,可以根据经验和用户的需求确定软件系统需要达到的可靠程度,按照前面的公式,换算成失效强度和平均无失效时间,如表9-3所示。

9.1.4可靠性测试的意义
软件可靠性问题已被越来越多的软件工程专家所重视,人们已开始投入大量的人力、物力去研究软件可靠性的设计、评估和测试等课题。以下多个方面可以反映出软件可靠性问题对软件工程实践,乃至对生产活动和社会活动产生的深远影响。
(1)软件失效可能造成灾难性的后果。一个最显著的例子就是由于控制系统的 Fortran 程序中少了个逗点,致使控制系统未能发出正确的指令,最终使美国的一次宇宙飞行失败。而目前由于计算机和软件在各行各业中应用的日益广泛和深入,例如军用作战系统、民航指挥系统、银行支付系统和交通调控系统等,一旦发生严重级别的软件失效,轻则造成经济损失,重则危及人们的生命安全,危害国家安全。
(2)软件的失效在整个计算机系统失效中的比例较高。某研究机构曾经作过统计,在计算机系统的失效中,有80%和软件有关。原因是软件系统的内容结构太复杂了,一个较简单的程序,其所有的路径数就可能是一个天文数字。在软件开发的过程中,很难用全路径覆盖方式的测试去发现软件系统中隐藏的所有缺陷,也就是说,很难完全排除软件缺陷。
(3)相比硬件可靠性技术,软件可靠性技术很不成熟,这就加剧了软件可靠性问题的重要性。例如在硬件可靠性领域,故障树分析 (Fault Tree Analysis,FTA)、 失效模式与效应分析
(Failure Made And Effect Analysis,FMEA) 等技术比较成熟,容错技术也有广泛应用,但在软件可靠性领域,这些技术似乎尚未定型。
(4)与硬件元器件成本急剧下降形成鲜明对比的是,软件费用呈有增无减的势头,而软件可靠性问题是造成费用增长的主要原因之一。
(5)计算机技术获得日益广泛的应用,随着计算机应用系统中软件成分的不断增加,使得系统对于软件的依赖性越来越强,软件对生产活动和社会生活的影响越来越大,从而增加了软件可靠性问题在软件工程领域乃至整个计算机工程领域的重要性。
软件可靠性问题的重要性凸显了发展以发现软件可靠性缺陷为目的的可靠性设计与测试技术的迫切性。
9.1.5广义的可靠性测试与狭义的可靠性测试
广义的软件可靠性测试是指为了最终评价软件系统的可靠性而运用建模、统计、试验、分析和评价等一系列手段对软件系统实施的一种测试。一个完整的软件可靠性测试包括如图9-1所示的过程。

狭义的软件可靠性测试是指为了获取可靠性数据,按预先确定的测试用例,在软件的预期使用环境中,对软件实施的一种测试。狭义的软件可靠性测试也叫“软件可靠性试验”(Software Reliability Test), 它是面向缺陷的测试,以用户将要使用的方式来测试软件,每一次测试代表用户将要完成的一组操作,使测试成为最终产品使用的预演。这就使得所获得的测试数据与软件的实际运行数据比较接近,可用于软件可靠性评价。
其实,软件可靠性测试是软件测试的一种形式,和易用性测试、性能测试、标准符合性测试等前面介绍的测试类型一样,是针对软件的某个重要质量特性,使用一定的测试用例对软件进行测试的过程。
可靠性测试是对软件产品的可靠性进行调查、分析和评价的一种手段。它不仅仅是为了用测试数据确定软件产品是否达到可靠性目标,还要对检测出的失效的分布、原因及后果进行分析,并给出纠正建议。总的来说,可靠性测试的目的可归纳为以下3个方面。
(1)发现软件系统在需求、设计、编码、测试和实施等方面的各种缺陷。
(2)为软件的使用和维护提供可靠性数据。
(3)确认软件是否达到可靠性的定量要求。
9.2软件可靠性建模
9.2.1影响软件可靠性的因素
在讲到软件可靠性评估的时候,我们不得不提到软件可靠性模型。软件可靠性模型(Software Reliability Model) 是指为预计或估算软件的可靠性所建立的可靠性框图和数学模型。
建立可靠性模型是为了将复杂系统的可靠性逐级分解为简单系统的可靠性,以便于定量预计、分配、估算和评价复杂系统的可靠性。
为了构建软件的可靠性模型,首先要来分析一下影响软件可靠性的因素。影响软件可靠性的因素是纷杂而众多的,甚至包括技术以外的许多因素。首先必须考虑影响软件可靠性的主要因素:缺陷的引入、发现和清除。缺陷的引入主要取决于软件产品的特性和软件的开发过程特性。软件产品的特性指软件本身的性质,开发过程特性包括开发技术、开发工具、开发人员的水平、需求的变化频度等。缺陷的发现依靠用户对软件的操作方式、运行环境等,也就是运行剖面。缺陷的清除依赖于失效的发现和修复活动及可靠性方面的投入。
从技术的角度来看,影响软件可靠性的主要因素如下。
(1)运行剖面(环境)。软件可靠性的定义是相对运行环境而言的,一样的软件在不同的运行剖面下,其可靠性的表现是不一样的。
(2)软件规模。软件规模也就是软件的大小,一个只有数十行代码的软件和几千、几万行代码的软件是不能相提并论的。
(3)软件内部结构。结构对软件可靠性的影响主要取决于软件结构的复杂程度,一般来说,内部结构越复杂的软件,所包含的软件缺陷数就可能越多。
(4)软件的开发方法和开发环境。软件工程表明,软件的开发方法对软件的可靠性有显著影响。例如,与非结构方法相比,结构化方法可以明显减少软件的缺陷数。
(5)软件的可靠性投入。软件在生命周期中可靠性的投入包括开发者在可靠性设计、可靠性管理、可靠性测试和可靠性评价等方面投入的人力、资金、资源和时间等。经验表明,在早期重视软件可靠性并采取措施开发出来的软件,可靠性有明显的提高。
总之,有许许多多的因素影响着软件的可靠性,有些至今也无法确定它们与软件可靠性之间的定量关系,甚至定性关系也不甚清楚。
9.2.2软件可靠性的建模方法
一个软件可靠性模型通常(但不是绝对)由以下几部分组成。
(1)模型假设。模型是实际情况的简化或规范化,总要包含若干假设,例如测试的选取代表实际运行剖面,不同软件失效独立发生等。
(2)性能度量。软件可靠性模型的输出量就是性能度量,如失效强度、残留缺陷数等。在软件可靠性模型中性能度量通常以数学表达式给出。
(3)参数估计方法。某些可靠性度量的实际值无法直接获得,例如残留缺陷数,这时需通过一定的方法估计参数的值,从而间接确定可靠性度量的值。当然,对于可直接获得实际值的
可靠性度量,就无须参数估计了。
(4)数据要求。一个软件可靠性模型要求一定的输入数据,即软件可靠性数据。不同类型的软件可靠性模型可能要求不同类型的软件可靠性数据。
绝大多数的模型包含3个共同假设。这些假设至今主宰着软件可靠性建模的研究发展,人们尚未找到克服这些假设局限性的有效方法。
(1)代表性假设。此假设认为软件测试用例的选取代表软件实际的运行剖面,甚至认为测试用例是独立随机地选取。此假设实质上是指可以用测试产生的软件可靠性数据预测运行阶段的软件可靠性行为。
(2)独立性假设。此假设认为软件失效是独立发生于不同时刻,一个软件失效的发生不影响另一个软件失效的发生。例如在概率范畴,假设相邻软件失效间隔构成一组独立随机变量,或假设一定时间内软件失效次数构成一个独立增量过程。在模糊数学范畴,则相邻软件失效间隔构成一组不相关的模糊变量。
(3)相同性假设。此假设认为所有软件失效的后果(等级)相同,即建模过程只考虑软件失效的具体发生时刻,不区分软件的失效严重等级。
软件可靠性模型要描述失效过程对上一节所分析因素的一般依赖形式。由于这些因素大多数在本质上是概率性的,并且表现与时间相关联,所以通过失效数据的概率分布和随机过程随时间的变化的特性来整体区分软件可靠性模型。
人们常常通过下面估计或预测的方法来确定模型的参数。估计是通过收集到的失效数据进行统计分析,利用一定的推导过程归纳出模型的参数;预测则是使用软件产品自身的属性和开发过程来确定模型的参数,这种方法可以在开始执行程序前完成。
确定了模型的参数后,就可以来表示失效过程的很多不同的特性。例如,大多数模型都会对如下的内容进行解析表达。
(1)任何时间点所经历的平均失效数。
(2)一段时间间隔内的平均失效数。
(3)任何时间点的失效强度。
(4)失效区间的概率分布。
在对将来的故障行为进行预测时,应保证模型参数的值不发生变化。如果在进行预测时发现引入了新的错误,或修复行为使新的故障不断发生,就应停止预测,并等足够多的故障出现后,再重新进行模型参数的估计。否则,这样的变化会因为增加问题的复杂程度而使模型的实用性降低。
一般来说,软件可靠性模型是以在固定不变的运行环境中运行的不变的程序作为估测实体的。这也就是说,程序的代码和运行剖面都不发生变化,但它们往往总要发生变化的,于是在这种情况之下,就应采取分段处理的方式来进行工作。因此,模型主要集中注意力于排错。但是,也有的模型具有能处理缓慢地引进错误情况的能力。
对于一个已发行并正在运行的程序,应暂缓安装新的功能和对下一次发行的版本的修复。如果能保持一个不变的运行剖面,则程序的故障密度将显示为一个常数。
一般来说,一个好的软件可靠性模型增加了关于开发项目的交流,并对了解软件开发过
程提供了一个共同的工作基础。它也增加了管理的透明度和其他令人感兴趣的东西。即使在特殊的情况之下,通过模型做出的预测并不是很精确的话,上面的这些优点也仍然是明显而有价值的。
要建立一个有用的软件可靠性模型必须有坚实的理论研究工作、有关工具的建造和实际工作经验的积累。通常这些工作要许多人一年的工作量。相反,要应用一个好的软件可靠性模型,则要求以极少的项目资源就可以在实际工作中产生好的效益。
一个好的软件可靠性模型应该具有如下重要特性。
(1)基于可靠的假设。
(2)简单。
(3)计算一些有用的量。
(4)给出未来失效行为的好的映射。
(5)可广泛应用。
9.2.3软件的可靠性模型分类
一个有效的软件可靠性模型应尽可能地将上面所述的因素在软件可靠性建模时加以考虑,尽可能简明地反映出来。自1972年第一个软件可靠性分析模型发表的30多年来,见之于文献的软件可靠性统计分析模型将近百种。这些可靠性模型大致可分为如下10类。
● 种子法模型。
● 失效率类模型。
● 曲线拟合类模型。
● 可靠性增长模型。
● 程序结构分析模型。
● 输入域分类模型。
● 执行路径分析方法模型。
● 非齐次泊松过程模型。
● 马尔可夫过程模型。
● 贝叶斯分析模型。
下面分别对这些模型进行简单介绍。
1.种子法模型
种子法模型利用捕获一再捕获抽样技术估计程序中的错误数,在程序中预先有意“播种”一些设定的错误“种子”,然后根据测试出的原始错误数和发现的诱导错误的比例,来估计程序中残留的错误数。其优点是简便易行,缺点是诱导错误的“种子”与实际的原始错误之间的类比性估量困难。
2.失效率类模型
失效率类模型用来研究程序的失效率,主要有下列内容。
● Jelinski-Moranda的De-eutrophication模型。
● Jelinski-Moranda的几何De-eutrophication模型。
● Schick-Wolverton模型。
● 改进的Schick-Wolverton模型。
● Moranda的几何泊松模型。
● Goal和Okumoto不完全排错模型。
3.曲线拟合类模型
曲线拟合类模型用回归分析的方法研究软件复杂性、程序中的缺陷数、失效率、失效间隔时间,包括参数方法和非参数方法两种。
4.可靠性增长模型
这类模型预测软件在检错过程中的可靠性改进,用增长函数来描述软件的改进过程。这类模型如下。
● Duane模型。
● Weibull模型。
● Wagoner的Weibull改进模型。
● Yamada和Osaki的逻辑增长曲线。
● Gompertz的增长曲线。
5.程序结构分析模型
程序结构分析模型是根据程序、子程序及其相互间的调用关系,形成一个可靠性分析网络。网络中的每个结点代表一个子程序或一个模块,网络中的每一有向弧代表模块间的程序执行顺序。假定各结点的可靠性是相互独立的,通过对每个结点可靠性、结点间转换的可靠性和网络在结点间的转换概率,得出该持续程序的整体可靠性。这类模型如下。
● Littewood马尔可夫结构模型。
● Cheung的面向用户的马尔可夫模型。
6.输入域分类模型
输入域分类模型选取软件输入域中的某些样本“点”运行程序,根据这些样本点在“实际”使用环境中的使用概率的测试运行时的成功/失效率,推断软件的使用可靠性。这类模型的重点(亦是难点)是输入域的概率分布的确定及对软件运行剖面的正确描述。这类模型如下。
● Nelson模型。
● Bastani的基于输入域的随机过程模型。
7.执行路径分析方法模型
执行路径分析方法类模型的分析方法与上面的模型相似,先计算程序各逻辑路径的执行概率和程序中错误路径的执行概率,再综合出该软件的使用可靠性。 Shooman分解模型属于此类。
8.非齐次泊松过程模型
非齐次泊松过程模型 (NHPP), 是以软件测试过程中单位时间的失效次数为独立泊松随机变量,来预测在今后软件的某使用时间点的累计失效数。这类模型如下。
● Musa的指数模型。
● Goel和Okumoto的NHPP模型,
● S_型可靠性增长模型。
● 超指数增长模型。
● Pham改进的NHPP模型。
9.马尔可夫过程模型
马尔可夫过程模型如下。
● 完全改错的线性死亡模型。
● 不完全改错的线性死亡模型。
● 完全改错的非静态线性死亡模型。
10.贝叶斯模型
贝叶斯模型是利用失效率的试验前分布和当前的测试失效信息,来评估软件的可靠性。这是一类当软件可靠性工程师对软件的开发过程有充分地了解,软件的继承性比较好时具有良好效果的可靠性分析模型。这类模型如下。
● 连续时间的离散型马尔可夫链。
● Shock模型。
另外,Musa和 Okumoto依据模型的不同属性对可靠性模型进行以下分类。
● 时间域:有两种,自然或日历时间与执行 (CPU) 时间。
● 失效数类:取决于无限时间内发生的失效数是有限的还是无限的。
● 失效数分布:相对于时间系统失效数的统计分布形式,主要的两类是泊松分布型和二项分布型。
● 有限类:对有限失效数的类别适用,用时间表示的失效强度的函数形式。
● 无限类:对无限失效数的类别适用,用经验期望失效数表示的失效强度的函数形式。
9.3软件可靠性管理
为了进一步提高软件可靠性,人们又提出了软件可靠性管理的概念,把软件可靠性活动贯穿于软件开发的全过程。
软件可靠性管理是软件工程管理的一部分,它以全面提高和保证软件可靠性为目标,以软件可靠性活动为主要对象,是把现代管理理论用于软件生命周期中的可靠性保障活动的一种管理形式。
软件可靠性管理的内容包括软件工程各个阶段的可靠性活动的目标、计划、进度、任务和修正措施等。
软件工程各个阶段可能进行的主要软件可靠性活动如下所述。由于软件之间的差异较大,并且人们对可靠性的期望不同,对可靠性的投入不同,所以下面的每项活动并不是每一个软件系统的可靠性管理的必须内容,也不是软件可靠性管理的全部内容。
1.需求分析阶段
(1)确定软件的可靠性目标。
(2)分析可能影响可靠性的因素。
(3)确定可靠性的验收标准。
(4)制定可靠性管理框架。
(5)制定可靠性文档编写规范。
(6)制订可靠性活动初步计划。
(7)确定可靠性数据收集规范。
2.概要设计阶段
(1)确定可靠性度量。
(2)制定详细的可靠性验收方案。
(3)可靠性设计。
(4)收集可靠性数据。
(5)调整可靠性活动计划。
(6)明确后续阶段的可靠性活动的详细计划。
(7)编制可靠性文档。
3.详细设计阶段
(1)可靠性设计。
(2)可靠性预测(确定可靠性度量估计值)。
(3)调整可靠性活动计划。
(4)收集可靠性数据。
(5)明确后续阶段的可靠性活动的详细计划。
(6)编制可靠性文档。
4.编码阶段
(1)可靠性测试(含于单元测试)。
(2)排错。
(3)调整可靠性活动计划。
(4)收集可靠性数据。
(5)明确后续阶段的可靠性活动的详细计划。
(6)编制可靠性文档。
5.测试阶段
(1)可靠性测试(含于集成测试、系统测试)。
(2)排错。
(3)可靠性建模。
(4)可靠性评价。
(5)调整可靠性活动计划。
(6)收集可靠性数据。
(7)明确后续阶段的可靠性活动的详细计划。
(8)编制可靠性文档。
6.实施阶段
(1)可靠性测试(含于验收测试)
(2)排错。
(3)收集可靠性数据。
(4)调整可靠性模型。
(5)可靠性评价。
(6)编制可靠性文档。
可靠性管理目前还停留在定性描述的水平上,很难用量化的指标来进行可靠性管理。可靠性管理规范的制定水平和实施效果也有待提高。怎样利用有限的可靠性投入,达到预期的可靠性目标是软件项目管理者常常要面对的难题。因此,可靠性管理研究是一个长期的课题。
浙公网安备 33010602011771号