系统架构设计师教程(九)软件可靠性基础知识

2023-12-22 06:58:25

9.1 软件可靠性基本概念

随着软件在现代军事和商用系统中的广泛应用,软件可靠性成为越来越重要的研究领域。国外从20世纪60年代后期开始加强对软件可靠性的研究工作,形成了较为系统的软件可靠性工程体系,同时各主要工业强国也确立了专门的研究计划和课题。而国内对于软件可靠性的研究起步较晚,与国外在软件可靠性量化理论、度量标准、建模技术、设计方法和测试技术等方面存在较大差距。因此,需要加强国内对软件可靠性的研究和发展,提高软件系统的可靠性和安全性。

9.1.1 软件可靠性定义

软件可靠性是指在规定的时间周期内,在特定条件下,软件能够完成其规定功能的能力。与硬件相比,软件具有复杂性物理退化唯一性版本更新快的特点。

软件可靠性的定义是在规定的时间内,软件不引起系统失效的概率,与系统输入和已知缺陷相关。软件可靠性的框架性定义包括规定的时间、规定的条件和所要求的功能。

这一定义使用内在的缺陷和外在的失效关系描述软件可靠性,并通过概率方法进行量化评估,使人们能够建立数学模型分析软件可靠性。

9.1.2 软件可靠性的定量描述

软件可靠性可以通过数学表达式来描述,其中涉及到一些概念和变量。下面是对软件可靠性的定量描述和相关概念的总结:

  1. 规定时间:包括自然时间(日历时间)、运行时间(从启动到结束的时间段)和执行时间(CPU执行指令的时间总和)。以执行时间作为度量软件可靠性最准确的方式。

  2. 失效概率:表示软件在某一时刻t之前出现失效的概率,用F(t)表示。具有初始化失效概率为0、随时间递增且趋向于1的特征。

  3. 可靠度:可靠度是表示软件在规定条件下、规定时间内不发生失效的概率,用R(t)表示。可通过可靠度的公式R(t)=1-F(t)来计算。

  4. 失效强度:失效强度是单位时间内软件系统出现失效的概率。用f(t)表示失效强度函数。

  5. 平均失效前时间(MTTF):指系统从开始运行到发生故障之间的平均时间。可以通过积分计算得到。

  6. 平均恢复前时间(MTTR):指从发生故障到修复成功所需的平均时间。

  7. 平均故障间隔时间(MTBF):指失效或维护所需的平均时间,包括故障时间和维护设备的时间。

需要注意的是,在描述软件可靠性时需要明确软件对象、定义失效情况、假设硬件无故障、考虑运行环境等因素。同时,可靠性可以以概率或可能性加以度量,并且可靠性既可以在时间域上动态度量,也可以在数据域上表态度量。

另外,运行剖面用于定义系统使用条件,即测试环境和测试数据等问题。

9.1.3 可靠性目标

在定量分析软件可靠性时,除了考虑失效发生的概率外,还需要关注失效对软件运行的严重程度。为了描述软件失效的严重程度,引入了失效严重程度类的概念,用于定义具有相同影响程度的失效集合。失效严重程度类的划分可以基于成本影响和系统能力影响等标准,并常用数量级来进行等级划分。考虑到客户对软件性能的期望,可靠性目标可以用可靠度、故障强度和平均失效时间等指标来描述,需根据项目需求平衡可靠性、交付时间和成本。因此,建立定量的可靠性指标需要确定系统的运行模式、定义故障的严重性等级和确定故障强度目标。

9.1.4 可靠性测试的意义

软件可靠性问题日益受到软件工程专家的关注,研究人员开始投入大量资源研究软件可靠性的设计、评估和测试等方面。软件可靠性问题对软件工程实践、生产活动和社会活动产生深远影响,以下几个方面可以说明这一点:

  1. 软件失效可能造成灾难性后果:软件失效可能导致严重的后果,例如控制系统程序中的一个错误导致宇宙飞行失败。随着计算机和软件在各行各业的广泛应用,如军事系统、民航指挥系统、银行支付系统和交通调控系统等,严重的软件失效可能导致经济损失甚至危及人们的生命安全和国家安全。

  2. 软件失效在计算机系统失效中的比例较高:研究表明,在计算机系统失效中,约有80%与软件有关。这是因为软件系统的复杂性很高,即使是相对简单的程序,其路径数也可能非常庞大。因此,在软件开发过程中很难通过全路径覆盖测试来发现所有潜在的缺陷,也难以完全消除软件缺陷。

  3. 软件可靠性技术不成熟:与硬件可靠性技术相比,软件可靠性技术仍然相对不成熟。例如,在硬件可靠性领域,故障树分析 (FTA)、失效模式与效应分析 (FMEA) 等技术已经比较成熟,并且容错技术得到广泛应用。然而,在软件可靠性领域,这些技术似乎还没有定型。

  4. 软件费用不断增加:与硬件元器件成本不断下降形成鲜明对比的是,软件费用呈现增长趋势。软件可靠性问题是导致软件费用增加的主要原因之一。

  5. 对软件的依赖性增加:随着计算机技术在各个领域的广泛应用,系统对软件的依赖性越来越强。随着软件在生产活动和社会生活中的影响日益增大,软件可靠性问题在软件工程和整个计算机工程领域的重要性也越来越突出。

因此,软件可靠性问题的重要性凸显了发展以发现软件可靠性缺陷为目的的可靠性设计与测试技术的迫切性。

9.1.5 广义的可靠性测试与狭义的可靠性测试

广义的软件可靠性测试是指为了最终评价软件系统的可靠性而运用建模、统计、试验、分析和评价等一系列手段对软件系统实施的一种测试。
在这里插入图片描述
软件可靠性测试是为了获取可靠性数据,根据预先确定的测试用例,在软件的预期使用环境中对软件进行的一种测试。它是面向缺陷的测试,以用户将要使用的方式来测试软件,每次测试代表用户将要完成的一组操作。可靠性测试的目的包括发现软件系统的各种缺陷,为软件的使用和维护提供可靠性数据,以及确认软件是否达到可靠性的定量要求。

9.2 软件可靠性建模

9.2.1 影响软件可靠性的因素

软件可靠性评估是一个复杂的过程,需要建立可靠性模型来预测和评估软件的可靠性。可靠性模型将复杂系统的可靠性分解为简单系统的可靠性,以便于定量预计、分配、估算和评价整个系统的可靠性。

影响软件可靠性的因素众多,其中主要因素包括缺陷的引入、发现和清除。缺陷的引入受软件产品特性和开发过程特性的影响,而缺陷的发现和清除则依赖于用户的操作方式和运行环境。

从技术的角度来看,影响软件可靠性的因素包括运行环境、软件规模、软件内部结构、开发方法和开发环境以及可靠性投入。不同的运行环境下,软件的可靠性表现会有所不同。软件规模的大小也会对可靠性产生影响,大型软件通常存在更多的缺陷。软件的内部结构复杂度越高,可能存在更多的软件缺陷。采用不同的开发方法和开发环境也会对可靠性产生显著影响。此外,开发者在可靠性设计、管理、测试和评价方面的投入也会影响软件的可靠性。

总之,软件可靠性受到许多因素的影响,其中有些因素之间的关系尚未确定。建立可靠性模型可以帮助我们更好地理解和评估软件的可靠性,从而提高软件的质量和可靠性水平。

9.2.2 软件可靠性的建模方法

一个可靠的软件可靠性模型通常包括模型假设、性能度量、参数估计方法和数据要求。绝大多数模型都有代表性假设、独立性假设和相同性假设。模型的参数可以通过统计分析或使用软件属性和开发过程进行估计和预测。确定了模型的参数后,可以表示失效过程的各种特性,如平均失效数、失效强度和失效区间的概率分布。在预测将来的故障行为时,应保持模型参数的稳定性。一个好的软件可靠性模型应该基于可靠的假设、简单、计算有用的量、给出好的未来失效行为映射,并可广泛应用。建立一个有用的软件可靠性模型需要理论研究、工具建造和实际经验的支持。而应用一个好的模型则可以在实际工作中以较少的资源产生好的效益。

9.2.3 软件的可靠性模型分类

有效的软件可靠性模型应考虑多种因素,并尽可能简明地反映出来。自1972年以来,已经有近百种软件可靠性统计分析模型出现。这些模型可以大致分为以下十类:

  1. 种子法模型:利用一再捕获抽样技术估计程序中的错误数,通过在程序中预先设定错误种子并根据测试结果估计程序中残留的错误数。
  2. 失效率类模型:用于研究程序的失效率,包括几何De-eutrophication模型、Schick-Wolverton模型、Goal和Okumoto不完全排错模型等。
  3. 曲线拟合类模型:使用回归分析方法研究软件复杂性、缺陷数、失效率等,包括参数方法和非参数方法。
  4. 可靠性增长模型:用增长函数描述软件在检错过程中的可靠性改进,如Duane模型、Weibull模型等。
  5. 程序结构分析模型:根据程序及其调用关系形成一个可靠性分析网络,通过计算每个结点的可靠性、结点间转换的可靠性和转换概率得出整体可靠性。
  6. 输入域分类模型:选取输入域中的样本点运行程序,通过测试运行的成功/失效率推断软件的使用可靠性,如Nelson模型、Bastani的基于输入域的随机过程模型。
  7. 执行路径分析方法模型:计算程序中各逻辑路径和错误路径的执行概率,综合得出软件的使用可靠性,如Shooman分解模型。
  8. 非齐次泊松过程模型:以单位时间的失效次数为独立泊松随机变量,预测在未来某个时间点的累计失效数,如Musa的指数模型、Goel和Okumoto的NHPP模型等。
  9. 马尔可夫过程模型:描述软件的故障转移过程,包括线性死亡模型和非静态线性死亡模型。
  10. 贝叶斯模型:利用失效率的试验前分布和当前的测试失效信息评估软件的可靠性,适用于开发过程了解充分且具有良好继承性的情况。

此外,根据模型的不同属性,可将可靠性模型进行更详细的分类,如时间域、失效数类、失效数分布、有限类和无限类等。

9.3 软件可靠性管理

软件可靠性管理是指将软件可靠性活动贯穿于软件开发的全过程,以全面提高和保证软件可靠性为目标的管理形式。它是软件工程管理的一部分,涉及软件开发各个阶段的可靠性目标、计划、进度、任务和修正措施等内容。

在软件可靠性管理中,各个阶段可能进行的主要活动包括:

  1. 需求分析阶段:
  • 确定软件的可靠性目标。
  • 分析可能影响可靠性的因素。
  • 确定可靠性的验收标准。
  • 制定可靠性管理框架。
  • 制定可靠性文档编写规范。
  • 制订可靠性活动初步计划。
  • 确定可靠性数据收集规范。
  1. 概要设计阶段:
  • 确定可靠性度量。
  • 制定详细的可靠性验收方案。
  • 进行可靠性设计。
  • 收集可靠性数据。
  • 调整可靠性活动计划。
  • 明确后续阶段的可靠性活动的详细计划。
  • 编制可靠性文档。
  1. 详细设计阶段:
  • 进行可靠性设计。
  • 进行可靠性预测,确定可靠性度量的估计值。
  • 调整可靠性活动计划。
  • 收集可靠性数据。
  • 明确后续阶段的可靠性活动的详细计划。
  • 编制可靠性文档。
  1. 编码阶段:
  • 进行可靠性测试(包括单元测试)。
  • 进行排错。
  • 调整可靠性活动计划。
  • 收集可靠性数据。
  • 明确后续阶段的可靠性活动的详细计划。
  • 编制可靠性文档。
  1. 测试阶段:
  • 进行可靠性测试(包括集成测试和系统测试)。
  • 进行排错。
  • 进行可靠性建模。
  • 进行可靠性评价。
  • 调整可靠性活动计划。
  • 收集可靠性数据。
  • 明确后续阶段的可靠性活动的详细计划。
  • 编制可靠性文档。
  1. 实施阶段:
  • 进行可靠性测试(包括验收测试)。
  • 进行排错。
  • 收集可靠性数据。
  • 调整可靠性模型。
  • 进行可靠性评价。
  • 编制可靠性文档。

需要指出的是,软件可靠性管理的具体内容可能因软件之间的差异和对可靠性的期望不同而有所不同。目前,可靠性管理还停留在定性描述的水平上,很难用量化的指标进行管理。同时,可靠性管理规范的制定和实施效果也需要进一步提高。因此,如何在有限的可靠性投入下达到预期的可靠性目标仍然是软件项目管理者面临的挑战,可靠性管理的研究仍然是一个长期的课题。

9.4 软件可靠性设计

在软件开发的测试阶段,虽然利用各种测试手段收集测试数据并利用软件可靠性模型来评估或预测软件的可靠性,可以在一定程度上改善软件的可靠性,但这些测试活动并不能从根本上提高软件的可靠性,也难以保证软件的可靠性。同时,对由设计导致的软件缺陷进行修改可能会付出昂贵的代价。实践证明,保障软件可靠性最有效、最经济、最重要的手段是在软件设计阶段采取措施进行可靠性控制。

可靠性设计是指在常规的软件设计中,应用各种方法和技术,使程序设计在兼顾用户的功能和性能需求的同时,全面满足软件的可靠性要求,即采用一些技术手段,把可靠性“设计”到软件中去。软件可靠性设计技术就是为了提高和保障软件的可靠性而在软件设计阶段运用的一种特殊的设计技术。

软件可靠性设计技术包括容错设计、检错设计和降低复杂度设计等技术。这些技术旨在在满足提高软件质量要求的前提下,以提高和保障软件可靠性为最终目标,在软件的总体设计框架中使用,并且不能与其他设计原则相冲突。此外,软件可靠性设计应确定软件的可靠性目标,并在考虑功能度、用户需求和开发费用之后确定合适的可靠性目标。

因此,可靠性设计是软件工程中关键的一环,它强调在软件设计阶段就考虑和解决软件的可靠性问题,以减少后期修复缺陷的成本和难度。通过合理运用可靠性设计技术,可以大大提高软件的可靠性,确保软件系统长期稳定可靠地运行。

9.4.1 容错设计技术

针对软件失效后果特别严重的场合,如飞机的飞行控制系统、空中交通管制系统及核反应堆安全控制系统等,可采用容错设计方法。常用的软件容错技术主要有恢复块设计、N版本程序设计和冗余设计三种方法。

  1. 恢复块设计是选择一组操作作为容错设计单元,从而把普通的程序块变成恢复块。一个恢复块包含有若干个功能相同、设计差异的程序块文本,每一时刻有一个文本处于运行状态。一旦该文本出现故障,则用备份文本加以替换,从而构成“动态冗余”。

  2. N版本程序设计的核心是通过设计出多个模块或不同版本,对于相同初始条件和相同输入的操作结果,实行多数表决,防止其中某一软件模块/版本的故障提供错误的服务,以实现软件容错。

  3. 冗余设计改善软件可靠性的一个重要技术是冗余设计。在软件系统中,冗余技术的运用有所区别。冗余设计技术实现的原理是在一套完整的软件系统之外,设计一种不同路径、不同算法或不同实现方法的模块或系统作为备份,在出现故障时可以使用冗余的部分进行替换,从而维持软件系统的正常运行。

9.4.2 检错技术

在软件系统中,对于不需要在线容错或无法采用冗余设计技术的部分,可以使用检错技术来提高可靠性。检错技术的实现成本通常较低,但它不能自动解决故障,需要进行人工干预。

在采用检错设计技术时,需要考虑以下几个要素:

  1. 检测对象:包括检测点和检测内容。检测点应放置在容易出错且对系统影响较大的地方,检测内容应选择具有代表性且易于判断的指标。
  2. 检测延时:从软件发生故障到被检测出来存在一定延时,该延时的长短对故障处理至关重要。因此,在设计时应充分考虑检测延时,并根据需要更换检测对象或方式。
  3. 实现方式:常见的实现方式包括判断返回结果、计算运行时间和设置状态标志位等。选择自检的实现方式应根据具体情况进行选择。
  4. 处理方式:大多数检错技术采用“查出故障一停止软件系统运行一报警”的处理方式。但对于需要实时处理的故障,也可以选择不停止或部分停止软件系统运行。

综上所述,通过采用检错技术可以及时发现软件故障并进行报警,提高软件系统的可靠性。

9.4.3 降低复杂度设计

软件复杂性是指软件内部结构的复杂程度,包括模块复杂性和结构复杂性。过高的软件复杂性容易导致软件缺陷增多,从而降低软件可靠性。因此,在设计软件时应考虑降低复杂性,简化结构、缩短代码长度和优化数据流向,以提高软件可靠性。

在软件可靠性设计中,除了容错设计、检错设计和降低复杂度设计技术,还可以运用硬件可靠性设计中的一些方法,如故障树分析 (FTA) 和失效模式与效应分析 (FMEA)。然而,由于软件与硬件的差异,这些方法在软件可靠性设计中的应用效果有限。

综上所述,通过降低软件复杂性、采用容错设计和检错设计技术,以及借鉴硬件可靠性设计中的方法,可以提高软件系统的可靠性。

9.4.4 系统配置技术

服务器集群技术常用的集群类型有以下几种:

  1. 高可用性集群:该类型的集群旨在提供高可靠性的服务。它通常包括双活(Active/Active)或者热备(Active/Standby)模式,它们可以通过共享存储或者网络文件系统实现数据同步和故障切换。
  2. 负载均衡集群:该类型的集群旨在平衡多台服务器的负载,从而提供更好的性能和可扩展性。负载均衡器会根据一定的算法将请求分发到不同的服务器上处理,以达到均衡负载的目的。
  3. 应用程序集群:该类型的集群旨在提供可扩展的应用程序服务。它通常使用分布式应用程序架构,将应用程序分解为独立的模块,并将这些模块部署到不同的服务器上。应用程序集群可以通过负载均衡器进行请求分发,以实现可伸缩性和高可用性。

总之,服务器集群技术通过多台服务器之间的协作与配合,可以提供更高的可靠性、可扩展性、性能等优点。但是,相较于双机热备技术,服务器集群技术需要更高的成本和复杂度,需要对网络、存储等技术有更高的要求。

9.5 软件可靠性测试

9.5.1 软件可靠性测试概述

软件测试者可以采用多种方法进行软件测试,每种方法都有其局限性和适用范围。通过这些方法进行测试可以暴露一定数量和类别的缺陷,并实现软件可靠性增长。但是,测试结果不能直接用于软件可靠性评价,需要进行分析处理后才能使用可靠性模型进行评价。

软件可靠性测试包含多个主要活动,如可靠性目标的确定、运行剖面的开发、测试用例的设计、测试实施和测试结果的分析等。在进行软件可靠性测试时还需要考虑对软件开发进度和成本的影响,最好在受控的自动测试环境下由专业测试机构完成。

软件可靠性测试是一种有效的软件测试和可靠性评价技术,可以帮助开发高可靠性与高安全性软件系统。但是,软件可靠性测试在工程上仍需获得广泛应用,还需要解决许多实际问题。

9.5.2 定义软件运行剖面

定义软件的运行剖面需要建立马尔可夫链模型来表示用户的行为,并通过弧连接状态表示不同激励导致的转换。开发使用模型涉及对用户和用法进行分层,分配概率估计可以基于现有数据、用户交谈、原型分析和专家意见。最佳的方法是使用实际的用户数据,其次是预期使用数据,最差的方法是将每个状态的弧分配相同的概率。

在准备可靠性测试时,需要充分分析和考虑软件的实际运行情况,因为不同的运行剖面可能导致不同的可靠性表现。在测试中,应该注意到最频繁出现的操作和输入可能具有较高的故障率,但也要注意边界、跃迁情况和关键功能,需要构造专门的运行剖面进行补充测试。

一个产品可能需要多个运行剖面,特别是针对关键操作需要单独定义运行剖面。

9.5.3 可靠性测试用例设计

在软件可靠性测试中,首先需要定义一个与实际运行环境相匹配的运行剖面,然后使用该剖面来驱动测试,以反映真实的使用情况。为了选择合适的测试用例,可以使用统计方法来开发和生成测试用例,并为每个运行剖面元素分配概率和关键因素值,然后根据这些因素来分配测试资源。

在测试中,应优先测试最重要或最频繁使用的功能,以尽早发现可能对可靠性产生最大影响的故障,并确保按时交付软件。设计测试用例时,应考虑一般情况、极限情况以及边界值情况。测试用例应包括标识、被测对象、测试环境和条件、测试输入、操作步骤、预期输出、结果判断以及特殊需求。

除了常规的测试用例集,可靠性测试还应重点考虑与可靠性密切相关的特殊情况。在测试中,可以使用"强化输入",即更恶劣的输入条件,以评估软件系统的可靠性。

9.5.4 可靠性测试的实施

  1. 在进行软件可靠性测试前,需要检查软件需求与设计文档的一致性,以及软件开发过程中形成的文档的准确性、完整性和与程序的一致性。
  2. 受控测试是软件可靠性测试的基础,需要确保测试过程中的每个测试用例都使用相同的软件版本。
  3. 除了统计测试,有时还需要进行非统计测试以满足客户要求、合同规定或标准约束。
  4. 软件的可测试性对软件可靠性测试至关重要,难点在于判断测试用例的运行成功与失败。
  5. 软件可靠性数据是可靠性评价的基础,应该记录测试过程中的相关信息,并编写《软件可靠性测试报告》进行总结归纳。
  6. 规范化可靠性测试过程有利于获得真实有效的数据,从而为最终得到客观的可靠性评价结果奠定基础。

9.6 软件可靠性评价

9.6.1 软件可靠性评价概述

  1. 软件可靠性评价适用于软件开发过程和最终软件系统,用于估计当前软件的可靠性水平、预测达到相应可靠性水平所需时间和工作量,并评估最终软件产品的可靠性水平。
  2. 在软件开发过程中,可以使用软件可靠性模型来评估软件的可靠性,并确定是否可以终止测试和发布软件。
  3. 对于最终软件产品,软件可靠性评价结合可靠性验证测试,验证软件的执行与需求的一致性,并确定最终软件产品的可靠性水平。
    软件可靠性评价需要选择合适的可靠性模型,收集软件可靠性数据,并运用统计技术和其他手段对数据进行处理,以进行可靠性评估和预测。

以上是软件可靠性评价的核心要点。

9.6.2 怎样选择可靠性模型

选择可靠性模型时需要考虑以下几个因素:

  1. 模型假设的适用性:模型的假设必须符合软件系统的实际情况,并且与现有的软件系统冲突的因素应该可以忽略不计。
  2. 预测的能力与质量:模型应该能够准确地根据现有和历史的可靠性数据预测将来的可靠性和失效概率。选择成熟、广泛应用的模型能提高预测能力和质量。
  3. 模型输出值是否满足评价需求:根据可靠性测试的目的确定需要精确估计的可靠性定量指标,确保所选模型能够输出满足评价需求的结果。
  4. 模型使用的简便性:模型需要的数据易于收集,并且收集成本不能超过预算;模型应该简单易懂,测试人员不需要深入研究数学理论;最好能够使用工具实现数据输入,减少额外工作量。

尽管可供选择的可靠性模型有限,但以上因素可以帮助选择适合的模型进行可靠性评价

9.6.3 可靠性数据的收集

可靠性数据对于软件可靠性评价至关重要。然而,在数据收集工作中存在一些问题,包括规范不统一、连续性不足、缺乏有效的数据收集手段、数据完整性和准确性不足等。为了解决这些问题,需要及早确定可靠性模型并明确可靠性数据规范,制订可行的数据收集计划,并重视测试数据的整理和分析。同时,充分利用数据库来存储和分析可靠性数据也是一种有效的方法。通过这些措施可以提高软件可靠性评价的准确性和有效性。

9.6.4软件可靠性的评估和预测

软件可靠性的评估和预测主要目的是为了评估软件系统的可靠性状况,并预测将来一段时间的可靠性水平。常见的需要利用软件可靠性评价解答的问题包括判断是否达到可靠性目标、投入多少资源才能达到可靠性目标,以及在软件系统投入实际运行后能否达到用户使用的可靠性水平。目前有许多支持软件可靠性估计的软件工具,但对于可靠性要求很高的系统,必须进行大量测试才能得出高置信度的结果。即便如此,仍然可能没有任何失效发生,这时可以假设测试是基于二项式分布的,并对可靠性作保守估计。软件可靠性评价技术和方法主要依据选用的软件可靠性模型,统计方法和技术可以作为可靠性模型的补充、完善和修正,例如失效数据的图形分析法和试探性数据分析技术等。

文章来源:https://blog.csdn.net/u010095372/article/details/135142091
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。