7.7 软件可靠性 7.7.1 基本概念 1. 软件可靠性的定义 定义1 软件可靠性(software reliability)是指软件在规定的运行环境中和规定的时间内无失效运行的概率[ANSI91]。所以它是时间t的函数,我们用来表示。 定义2 软件故障率(failure rate)是指在单位时间内软件发生故障的概率。它和软件可靠性的关系如下:  或者是:  定义3 软件平均无故障时间(MTTF)。指软件从开始运行到出现一个故障的期望时间,根据可靠性的定义有:  和软件中错误相关的定义 定义4 软件错误(Software Error)。指在软件生存期内的不希望或不可接受的人为错误。软件错误是一种人为的行为,相对于软件本身是一种外部行为。 定义 5 软件缺陷(Software Defect)。指存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差。其结果是软件在某一特定条件时出现运行故障。当软件指程序时,软件缺陷即程序污点(Bug)。 定义 6 软件故障(Software Fault)。指软件运行过程中出现的一种不希望或不可接受的内部状态。软件故障是一种动态行为。 定义 7 软件失败(Software Failure)。指软件运行时产生的一种不希望或不可接受的外部行为结果。 2. 软件的可用性定义 程序在给定的时间点,按照SRS的规定,成功地运行的概率。 可靠性与可用性的区别: 可靠性指在0到t这段时间间隔内系统没有失效;可用性仅仅意味着在时刻t,系统是正常运行的。 在时刻t系统是可用的,意味着两种可能:1)在0到t这段时间间隔内系统一直没有失败;2)在0到t这段时间间隔内,系统失效了若干次,但都被修复好了。 如果一端时间内,软件系统故障停机时间分别为td1 , td2 ,((,正常运行时间分别为tu1 , tu2 ,((。则系统的稳态可用性Ass为:  如果引入系统平均无故障时间MTTF和平均维修时间MTTR的概念,则  其中平均维修时间MTTR是修复一个故障所需时间,它取决于维护人员的技术水平、对系统的熟悉程度、系统的可维护性。 平均无故障时间MTTF是系统按照SRS成功地运行地平均间隔时间,它主要取决于系统中潜伏的故障数目。 7.7.2 估算MTTF的方法 符号 ET——测试之前程序中故障总数 IT——程序长度(机器指令总数) ( ——测试(包括调试)时间 Ed(()——在0到 ( 期间发现的错误数 Ec(()——在0到 ( 期间改正的错误数 基本假设 (1)ET/IT 近似为常数。通常介于千分之5到千分之20 (2)失效率(软件故障率)正比于软件中剩余的(潜在的)故障数,而MTTF反比于软件中剩余的(潜在的)故障数。且假设错误一旦发现就得以纠正,并没有引入新的错误。因此 Ec(() = Ed(() 剩余的故障数 单位程度程序中剩余故障数 估算 MTTF 经验表明,MTTF与单位程度程序中剩余故障数成反比。 K为经验常数,其典型值为200 估计故障总数的方法 植入故障法 植错法是最早的一种排错性测试方法,它起源于通过软件测试来估计软件中所包含的错误的个数。其基本思想与经典的“估计一个鱼池中某种鱼的数目”的统计方法相类似。为了估计一个鱼池中的某种鱼的数目,可以先从鱼池中随机地捕一批适当数量的鱼,设其数量为K,并给它们做上记号,再放回鱼池中。等这批放回的鱼在鱼池中与其它鱼充分均匀混合后,再捕一批鱼,在这批鱼中找出做过记号的鱼。假设在第二批鱼中,做过记号的鱼的数目是N,而未做过记号的这种鱼的数目是M,那么,由最大似然法进行统计推理,该鱼池中共有这种鱼约(M+N)K/N条。 分别测试法 是对植错法的改进。因为人为植入的错误和程序原有的可能性质不同,测试时所发现的概率不同,发现的难易程度也可能不同。 如果能对程序中原有的错误加上标记,然后再通过进一步的测试,就可以对潜在故障进行估计。解决的办法是,由两个测试组分别测试同一个程序的两个副本,并把其中一个加上标记,然后再测试、估算。 影响软件可靠性的原因分析 影响软件可靠性的原因是多方面的,从一般意义上而言,任何和软件开发相关的活动都有可能影响软件可靠性。它包括技术层面的、经济层面的乃至社会和文化科学层面的因素的影响。在这里我们主要讨论在软件生存期内影响软件可靠性的因素,也称软件可靠性因素。从软件开发的角度而言,影响软件可靠性的主要因素包括: 软件规模。从直观上而言,软件的规模越大,影响其可靠性的问题也就越多。简单软件的可靠性问题很容易通过较为全面的测试而解决,所以软件可靠性主要是针对于中型以上的软件而言。对于这点在Halstead的“软件科学”的思想中可以得到体现[Healstead77]。 运行剖面。软件对于不同的运行剖面有着不同的可靠性,所以在软件可靠性模型和软件可靠性测试中应尽量使得操作剖面和运行剖面一致。对于一个软件而言,其软件故障是因为某个输入激活了软件内部的缺陷所致。对输入空间故障空间的划分可以参考Nelson的输入域模型[Nelson73] [Nelson78]。 软件内部结构。总的来说,软件内部的结构越复杂,所包含的变化也就越多,它可能的内部缺陷数也就越多,软件的可靠性也就越低。对于这方面的内容可以从Halstead的软件科学度量和McCabe的循环Cyclonatic复杂系数中得到有关论述[McCabe76]。 软件可靠性设计技术。软件可靠性设计技术是指为了保证和提高软件可靠性的一些技术。目前的软件可靠性设计技术主要沿用了硬件中的一些可靠性设计技术,例如故障树技术(FTA)和失败模式和效应分析(FMEA)等[Michael 96]。 软件可靠性测试与投入。不同的软件测试方法对软件可靠性的影响是不同的,以前我们主要采取调试的方法来进行软件的测试,但研究表明,采用运行测试的方法比调试的测试方法更能够提高软件可靠性。同时软件可靠性的资源投入也是很重要的。对于同样的测试方法,资源投入越大,其测试越完备,软件达到的可靠性程度也越高。 软件可靠性管理。随着软件开发的工程化,软件开发本身也越来越变成了一种企业行为,所以良好的管理对于合理分配资源、遵守开发规范有着重要的的作用,从而提高软件可靠性水平。 软件开发人员的能力和经验。我们当然希望软件开发人员的能力很强,经验丰富,但对这方面的需求除了要加强对开发人员的培训和学习之外,也必须在软件开发过程中合理地进行人力资源的分配,在现有的情况下,最大限度地利用人力资源的结构,达到最佳效果。 软件开发方法。采用不同的软件开发方法对系统可靠性的影响是显而易见的。就目前的软件工程现状而言,采用结构化的、面向对象等软件设计方法可以明显地减少软件缺陷数。 软件开发环境。选择适当的程序开发语言和软件测试工具等软件开发环境,可以大幅度地提高软件可靠性。 2.4 软件可靠性模型 2.4.1 软件可靠性模型分类 由于软件可靠性研究目前尚处于探索阶段,对于模型的分类目前还没有一个公认的体系[Cai97]。根据它们的数学表现形式,在这里将软件可靠性模型分为随机过程模型和非随机过程模型两大类。 随机过程模型在形式上是一个随机过程,它描述的故障行为随时间而变化,我们可以使用概率论和数理统计的知识来对它们进行描述。这类模型可进一步细分为马尔可夫过程模型、非齐次泊松模型(NHPP)和执行时间模型。 对于马尔可夫模型,具有代表性的有Jelinski-Moranda模型及其推广形式。对于NHPP模型,具有代表性的有Goel-Okumoto模型及其推广形式。对于执行时间模型,具有代表性的有Musa的执行时间模型及其推广形式。 非随机过程模型是指贝叶斯方法运用于软件可靠性研究的贝叶斯模型或者其它方法的模型[Csenki90]。具有代表性的有Littlewood-Verral模型及其推广形式,Mills的超几何模型及其推广形式,Nelson的输入域模型及其推广形式。 另外我们也可以根据对于软件可靠性模型的分析形式把它们分类为故障间隔模型、缺陷计数模型和错误插入模型等。 对于故障间隔模型而言,它们假设故障间隔时间服从于某一个分布,分布的参数依赖于各个时间间隔中程序中的残留错误数[Chen95]。在实际的应用中,先对程序的故障间隔时间进行实测,再根据这组实测的数据来估计模型参数。待参数确定后,就可以用于估计软件的可靠性以及MTTF等软件可靠性指标;另一方面,故障间隔时间也可以看作一个随机过程,可以通过适当的时间序列来描述这样的故障间隔时间。在这类模型中具有代表性的有Jelinski-Moranda模型、Schick-Wolverton模型、Littlewood-Verral模型等。 缺陷计数模型的目标是在特定的时间间隔内软件的错误数或故障数,根据在给定的测试时间发现的错误数来建立这种模型。这类模型中具有代表性的有Shooman模型、Musa的执行时间模型、Goel-Okumoto的NHPP模型、Musa-Okumoto的对数泊松执行时间模型等。 错误插入模型的思路是在程序中人为地植入一组错误,然后在测试中观察并统计程序总共发现的错误数和植入的错误数,从而得出对程序中总错误数的估计。这类模型中具有代表性的有Mills的超几何分布模型等。