建设银行网站app,免费个人建站空间,wordpress主导航菜单,软件商店网页版软件可靠性基础知识 9.1 软件可靠性基本概念9.1.1 软件可靠性定义9.1.2 软件可靠性的定量描述9.1.3 可靠性目标9.1.4 可靠性测试的意义9.1.5 广义的可靠性测试与狭义的可靠性测试 9.2 软件可靠性建模9.2.1 影响软件可靠性的因素9.2.2 软件可靠性的建模方法9.2.3 软件的可靠性模… 软件可靠性基础知识 9.1 软件可靠性基本概念9.1.1 软件可靠性定义9.1.2 软件可靠性的定量描述9.1.3 可靠性目标9.1.4 可靠性测试的意义9.1.5 广义的可靠性测试与狭义的可靠性测试 9.2 软件可靠性建模9.2.1 影响软件可靠性的因素9.2.2 软件可靠性的建模方法9.2.3 软件的可靠性模型分类 9.3 软件可靠性管理9.4 软件可靠性设计9.4.1 容错设计技术9.4.2 检错技术9.4.3 降低复杂度设计9.4.4 系统配置技术 9.5 软件可靠性测试9.5.1 软件可靠性测试概述9.5.2 定义软件运行剖面9.5.3 可靠性测试用例设计9.5.4 可靠性测试的实施 9.6 软件可靠性评价9.6.1 软件可靠性评价概述9.6.2 怎样选择可靠性模型9.6.3 可靠性数据的收集9.6.4软件可靠性的评估和预测 9.1 软件可靠性基本概念
随着软件在现代军事和商用系统中的广泛应用软件可靠性成为越来越重要的研究领域。国外从20世纪60年代后期开始加强对软件可靠性的研究工作形成了较为系统的软件可靠性工程体系同时各主要工业强国也确立了专门的研究计划和课题。而国内对于软件可靠性的研究起步较晚与国外在软件可靠性量化理论、度量标准、建模技术、设计方法和测试技术等方面存在较大差距。因此需要加强国内对软件可靠性的研究和发展提高软件系统的可靠性和安全性。
9.1.1 软件可靠性定义
软件可靠性是指在规定的时间周期内在特定条件下软件能够完成其规定功能的能力。与硬件相比软件具有复杂性、物理退化、唯一性和版本更新快的特点。
软件可靠性的定义是在规定的时间内软件不引起系统失效的概率与系统输入和已知缺陷相关。软件可靠性的框架性定义包括规定的时间、规定的条件和所要求的功能。
这一定义使用内在的缺陷和外在的失效关系描述软件可靠性并通过概率方法进行量化评估使人们能够建立数学模型分析软件可靠性。
9.1.2 软件可靠性的定量描述
软件可靠性可以通过数学表达式来描述其中涉及到一些概念和变量。下面是对软件可靠性的定量描述和相关概念的总结 规定时间包括自然时间日历时间、运行时间从启动到结束的时间段和执行时间CPU执行指令的时间总和。以执行时间作为度量软件可靠性最准确的方式。 失效概率表示软件在某一时刻t之前出现失效的概率用F(t)表示。具有初始化失效概率为0、随时间递增且趋向于1的特征。 可靠度可靠度是表示软件在规定条件下、规定时间内不发生失效的概率用R(t)表示。可通过可靠度的公式R(t)1-F(t)来计算。 失效强度失效强度是单位时间内软件系统出现失效的概率。用f(t)表示失效强度函数。 平均失效前时间MTTF指系统从开始运行到发生故障之间的平均时间。可以通过积分计算得到。 平均恢复前时间MTTR指从发生故障到修复成功所需的平均时间。 平均故障间隔时间MTBF指失效或维护所需的平均时间包括故障时间和维护设备的时间。
需要注意的是在描述软件可靠性时需要明确软件对象、定义失效情况、假设硬件无故障、考虑运行环境等因素。同时可靠性可以以概率或可能性加以度量并且可靠性既可以在时间域上动态度量也可以在数据域上表态度量。
另外运行剖面用于定义系统使用条件即测试环境和测试数据等问题。
9.1.3 可靠性目标
在定量分析软件可靠性时除了考虑失效发生的概率外还需要关注失效对软件运行的严重程度。为了描述软件失效的严重程度引入了失效严重程度类的概念用于定义具有相同影响程度的失效集合。失效严重程度类的划分可以基于成本影响和系统能力影响等标准并常用数量级来进行等级划分。考虑到客户对软件性能的期望可靠性目标可以用可靠度、故障强度和平均失效时间等指标来描述需根据项目需求平衡可靠性、交付时间和成本。因此建立定量的可靠性指标需要确定系统的运行模式、定义故障的严重性等级和确定故障强度目标。
9.1.4 可靠性测试的意义
软件可靠性问题日益受到软件工程专家的关注研究人员开始投入大量资源研究软件可靠性的设计、评估和测试等方面。软件可靠性问题对软件工程实践、生产活动和社会活动产生深远影响以下几个方面可以说明这一点 软件失效可能造成灾难性后果软件失效可能导致严重的后果例如控制系统程序中的一个错误导致宇宙飞行失败。随着计算机和软件在各行各业的广泛应用如军事系统、民航指挥系统、银行支付系统和交通调控系统等严重的软件失效可能导致经济损失甚至危及人们的生命安全和国家安全。 软件失效在计算机系统失效中的比例较高研究表明在计算机系统失效中约有80%与软件有关。这是因为软件系统的复杂性很高即使是相对简单的程序其路径数也可能非常庞大。因此在软件开发过程中很难通过全路径覆盖测试来发现所有潜在的缺陷也难以完全消除软件缺陷。 软件可靠性技术不成熟与硬件可靠性技术相比软件可靠性技术仍然相对不成熟。例如在硬件可靠性领域故障树分析 (FTA)、失效模式与效应分析 (FMEA) 等技术已经比较成熟并且容错技术得到广泛应用。然而在软件可靠性领域这些技术似乎还没有定型。 软件费用不断增加与硬件元器件成本不断下降形成鲜明对比的是软件费用呈现增长趋势。软件可靠性问题是导致软件费用增加的主要原因之一。 对软件的依赖性增加随着计算机技术在各个领域的广泛应用系统对软件的依赖性越来越强。随着软件在生产活动和社会生活中的影响日益增大软件可靠性问题在软件工程和整个计算机工程领域的重要性也越来越突出。
因此软件可靠性问题的重要性凸显了发展以发现软件可靠性缺陷为目的的可靠性设计与测试技术的迫切性。
9.1.5 广义的可靠性测试与狭义的可靠性测试
广义的软件可靠性测试是指为了最终评价软件系统的可靠性而运用建模、统计、试验、分析和评价等一系列手段对软件系统实施的一种测试。 软件可靠性测试是为了获取可靠性数据根据预先确定的测试用例在软件的预期使用环境中对软件进行的一种测试。它是面向缺陷的测试以用户将要使用的方式来测试软件每次测试代表用户将要完成的一组操作。可靠性测试的目的包括发现软件系统的各种缺陷为软件的使用和维护提供可靠性数据以及确认软件是否达到可靠性的定量要求。
9.2 软件可靠性建模
9.2.1 影响软件可靠性的因素
软件可靠性评估是一个复杂的过程需要建立可靠性模型来预测和评估软件的可靠性。可靠性模型将复杂系统的可靠性分解为简单系统的可靠性以便于定量预计、分配、估算和评价整个系统的可靠性。
影响软件可靠性的因素众多其中主要因素包括缺陷的引入、发现和清除。缺陷的引入受软件产品特性和开发过程特性的影响而缺陷的发现和清除则依赖于用户的操作方式和运行环境。
从技术的角度来看影响软件可靠性的因素包括运行环境、软件规模、软件内部结构、开发方法和开发环境以及可靠性投入。不同的运行环境下软件的可靠性表现会有所不同。软件规模的大小也会对可靠性产生影响大型软件通常存在更多的缺陷。软件的内部结构复杂度越高可能存在更多的软件缺陷。采用不同的开发方法和开发环境也会对可靠性产生显著影响。此外开发者在可靠性设计、管理、测试和评价方面的投入也会影响软件的可靠性。
总之软件可靠性受到许多因素的影响其中有些因素之间的关系尚未确定。建立可靠性模型可以帮助我们更好地理解和评估软件的可靠性从而提高软件的质量和可靠性水平。
9.2.2 软件可靠性的建模方法
一个可靠的软件可靠性模型通常包括模型假设、性能度量、参数估计方法和数据要求。绝大多数模型都有代表性假设、独立性假设和相同性假设。模型的参数可以通过统计分析或使用软件属性和开发过程进行估计和预测。确定了模型的参数后可以表示失效过程的各种特性如平均失效数、失效强度和失效区间的概率分布。在预测将来的故障行为时应保持模型参数的稳定性。一个好的软件可靠性模型应该基于可靠的假设、简单、计算有用的量、给出好的未来失效行为映射并可广泛应用。建立一个有用的软件可靠性模型需要理论研究、工具建造和实际经验的支持。而应用一个好的模型则可以在实际工作中以较少的资源产生好的效益。
9.2.3 软件的可靠性模型分类
有效的软件可靠性模型应考虑多种因素并尽可能简明地反映出来。自1972年以来已经有近百种软件可靠性统计分析模型出现。这些模型可以大致分为以下十类
种子法模型利用一再捕获抽样技术估计程序中的错误数通过在程序中预先设定错误种子并根据测试结果估计程序中残留的错误数。失效率类模型用于研究程序的失效率包括几何De-eutrophication模型、Schick-Wolverton模型、Goal和Okumoto不完全排错模型等。曲线拟合类模型使用回归分析方法研究软件复杂性、缺陷数、失效率等包括参数方法和非参数方法。可靠性增长模型用增长函数描述软件在检错过程中的可靠性改进如Duane模型、Weibull模型等。程序结构分析模型根据程序及其调用关系形成一个可靠性分析网络通过计算每个结点的可靠性、结点间转换的可靠性和转换概率得出整体可靠性。输入域分类模型选取输入域中的样本点运行程序通过测试运行的成功/失效率推断软件的使用可靠性如Nelson模型、Bastani的基于输入域的随机过程模型。执行路径分析方法模型计算程序中各逻辑路径和错误路径的执行概率综合得出软件的使用可靠性如Shooman分解模型。非齐次泊松过程模型以单位时间的失效次数为独立泊松随机变量预测在未来某个时间点的累计失效数如Musa的指数模型、Goel和Okumoto的NHPP模型等。马尔可夫过程模型描述软件的故障转移过程包括线性死亡模型和非静态线性死亡模型。贝叶斯模型利用失效率的试验前分布和当前的测试失效信息评估软件的可靠性适用于开发过程了解充分且具有良好继承性的情况。
此外根据模型的不同属性可将可靠性模型进行更详细的分类如时间域、失效数类、失效数分布、有限类和无限类等。
9.3 软件可靠性管理
软件可靠性管理是指将软件可靠性活动贯穿于软件开发的全过程以全面提高和保证软件可靠性为目标的管理形式。它是软件工程管理的一部分涉及软件开发各个阶段的可靠性目标、计划、进度、任务和修正措施等内容。
在软件可靠性管理中各个阶段可能进行的主要活动包括
需求分析阶段
确定软件的可靠性目标。分析可能影响可靠性的因素。确定可靠性的验收标准。制定可靠性管理框架。制定可靠性文档编写规范。制订可靠性活动初步计划。确定可靠性数据收集规范。
概要设计阶段
确定可靠性度量。制定详细的可靠性验收方案。进行可靠性设计。收集可靠性数据。调整可靠性活动计划。明确后续阶段的可靠性活动的详细计划。编制可靠性文档。
详细设计阶段
进行可靠性设计。进行可靠性预测确定可靠性度量的估计值。调整可靠性活动计划。收集可靠性数据。明确后续阶段的可靠性活动的详细计划。编制可靠性文档。
编码阶段
进行可靠性测试包括单元测试。进行排错。调整可靠性活动计划。收集可靠性数据。明确后续阶段的可靠性活动的详细计划。编制可靠性文档。
测试阶段
进行可靠性测试包括集成测试和系统测试。进行排错。进行可靠性建模。进行可靠性评价。调整可靠性活动计划。收集可靠性数据。明确后续阶段的可靠性活动的详细计划。编制可靠性文档。
实施阶段
进行可靠性测试包括验收测试。进行排错。收集可靠性数据。调整可靠性模型。进行可靠性评价。编制可靠性文档。
需要指出的是软件可靠性管理的具体内容可能因软件之间的差异和对可靠性的期望不同而有所不同。目前可靠性管理还停留在定性描述的水平上很难用量化的指标进行管理。同时可靠性管理规范的制定和实施效果也需要进一步提高。因此如何在有限的可靠性投入下达到预期的可靠性目标仍然是软件项目管理者面临的挑战可靠性管理的研究仍然是一个长期的课题。
9.4 软件可靠性设计
在软件开发的测试阶段虽然利用各种测试手段收集测试数据并利用软件可靠性模型来评估或预测软件的可靠性可以在一定程度上改善软件的可靠性但这些测试活动并不能从根本上提高软件的可靠性也难以保证软件的可靠性。同时对由设计导致的软件缺陷进行修改可能会付出昂贵的代价。实践证明保障软件可靠性最有效、最经济、最重要的手段是在软件设计阶段采取措施进行可靠性控制。
可靠性设计是指在常规的软件设计中应用各种方法和技术使程序设计在兼顾用户的功能和性能需求的同时全面满足软件的可靠性要求即采用一些技术手段把可靠性“设计”到软件中去。软件可靠性设计技术就是为了提高和保障软件的可靠性而在软件设计阶段运用的一种特殊的设计技术。
软件可靠性设计技术包括容错设计、检错设计和降低复杂度设计等技术。这些技术旨在在满足提高软件质量要求的前提下以提高和保障软件可靠性为最终目标在软件的总体设计框架中使用并且不能与其他设计原则相冲突。此外软件可靠性设计应确定软件的可靠性目标并在考虑功能度、用户需求和开发费用之后确定合适的可靠性目标。
因此可靠性设计是软件工程中关键的一环它强调在软件设计阶段就考虑和解决软件的可靠性问题以减少后期修复缺陷的成本和难度。通过合理运用可靠性设计技术可以大大提高软件的可靠性确保软件系统长期稳定可靠地运行。
9.4.1 容错设计技术
针对软件失效后果特别严重的场合如飞机的飞行控制系统、空中交通管制系统及核反应堆安全控制系统等可采用容错设计方法。常用的软件容错技术主要有恢复块设计、N版本程序设计和冗余设计三种方法。 恢复块设计是选择一组操作作为容错设计单元从而把普通的程序块变成恢复块。一个恢复块包含有若干个功能相同、设计差异的程序块文本每一时刻有一个文本处于运行状态。一旦该文本出现故障则用备份文本加以替换从而构成“动态冗余”。 N版本程序设计的核心是通过设计出多个模块或不同版本对于相同初始条件和相同输入的操作结果实行多数表决防止其中某一软件模块/版本的故障提供错误的服务以实现软件容错。 冗余设计改善软件可靠性的一个重要技术是冗余设计。在软件系统中冗余技术的运用有所区别。冗余设计技术实现的原理是在一套完整的软件系统之外设计一种不同路径、不同算法或不同实现方法的模块或系统作为备份在出现故障时可以使用冗余的部分进行替换从而维持软件系统的正常运行。
9.4.2 检错技术
在软件系统中对于不需要在线容错或无法采用冗余设计技术的部分可以使用检错技术来提高可靠性。检错技术的实现成本通常较低但它不能自动解决故障需要进行人工干预。
在采用检错设计技术时需要考虑以下几个要素
检测对象包括检测点和检测内容。检测点应放置在容易出错且对系统影响较大的地方检测内容应选择具有代表性且易于判断的指标。检测延时从软件发生故障到被检测出来存在一定延时该延时的长短对故障处理至关重要。因此在设计时应充分考虑检测延时并根据需要更换检测对象或方式。实现方式常见的实现方式包括判断返回结果、计算运行时间和设置状态标志位等。选择自检的实现方式应根据具体情况进行选择。处理方式大多数检错技术采用“查出故障一停止软件系统运行一报警”的处理方式。但对于需要实时处理的故障也可以选择不停止或部分停止软件系统运行。
综上所述通过采用检错技术可以及时发现软件故障并进行报警提高软件系统的可靠性。
9.4.3 降低复杂度设计
软件复杂性是指软件内部结构的复杂程度包括模块复杂性和结构复杂性。过高的软件复杂性容易导致软件缺陷增多从而降低软件可靠性。因此在设计软件时应考虑降低复杂性简化结构、缩短代码长度和优化数据流向以提高软件可靠性。
在软件可靠性设计中除了容错设计、检错设计和降低复杂度设计技术还可以运用硬件可靠性设计中的一些方法如故障树分析 (FTA) 和失效模式与效应分析 (FMEA)。然而由于软件与硬件的差异这些方法在软件可靠性设计中的应用效果有限。
综上所述通过降低软件复杂性、采用容错设计和检错设计技术以及借鉴硬件可靠性设计中的方法可以提高软件系统的可靠性。
9.4.4 系统配置技术
服务器集群技术常用的集群类型有以下几种
高可用性集群该类型的集群旨在提供高可靠性的服务。它通常包括双活Active/Active或者热备Active/Standby模式它们可以通过共享存储或者网络文件系统实现数据同步和故障切换。负载均衡集群该类型的集群旨在平衡多台服务器的负载从而提供更好的性能和可扩展性。负载均衡器会根据一定的算法将请求分发到不同的服务器上处理以达到均衡负载的目的。应用程序集群该类型的集群旨在提供可扩展的应用程序服务。它通常使用分布式应用程序架构将应用程序分解为独立的模块并将这些模块部署到不同的服务器上。应用程序集群可以通过负载均衡器进行请求分发以实现可伸缩性和高可用性。
总之服务器集群技术通过多台服务器之间的协作与配合可以提供更高的可靠性、可扩展性、性能等优点。但是相较于双机热备技术服务器集群技术需要更高的成本和复杂度需要对网络、存储等技术有更高的要求。
9.5 软件可靠性测试
9.5.1 软件可靠性测试概述
软件测试者可以采用多种方法进行软件测试每种方法都有其局限性和适用范围。通过这些方法进行测试可以暴露一定数量和类别的缺陷并实现软件可靠性增长。但是测试结果不能直接用于软件可靠性评价需要进行分析处理后才能使用可靠性模型进行评价。
软件可靠性测试包含多个主要活动如可靠性目标的确定、运行剖面的开发、测试用例的设计、测试实施和测试结果的分析等。在进行软件可靠性测试时还需要考虑对软件开发进度和成本的影响最好在受控的自动测试环境下由专业测试机构完成。
软件可靠性测试是一种有效的软件测试和可靠性评价技术可以帮助开发高可靠性与高安全性软件系统。但是软件可靠性测试在工程上仍需获得广泛应用还需要解决许多实际问题。
9.5.2 定义软件运行剖面
定义软件的运行剖面需要建立马尔可夫链模型来表示用户的行为并通过弧连接状态表示不同激励导致的转换。开发使用模型涉及对用户和用法进行分层分配概率估计可以基于现有数据、用户交谈、原型分析和专家意见。最佳的方法是使用实际的用户数据其次是预期使用数据最差的方法是将每个状态的弧分配相同的概率。
在准备可靠性测试时需要充分分析和考虑软件的实际运行情况因为不同的运行剖面可能导致不同的可靠性表现。在测试中应该注意到最频繁出现的操作和输入可能具有较高的故障率但也要注意边界、跃迁情况和关键功能需要构造专门的运行剖面进行补充测试。
一个产品可能需要多个运行剖面特别是针对关键操作需要单独定义运行剖面。
9.5.3 可靠性测试用例设计
在软件可靠性测试中首先需要定义一个与实际运行环境相匹配的运行剖面然后使用该剖面来驱动测试以反映真实的使用情况。为了选择合适的测试用例可以使用统计方法来开发和生成测试用例并为每个运行剖面元素分配概率和关键因素值然后根据这些因素来分配测试资源。
在测试中应优先测试最重要或最频繁使用的功能以尽早发现可能对可靠性产生最大影响的故障并确保按时交付软件。设计测试用例时应考虑一般情况、极限情况以及边界值情况。测试用例应包括标识、被测对象、测试环境和条件、测试输入、操作步骤、预期输出、结果判断以及特殊需求。
除了常规的测试用例集可靠性测试还应重点考虑与可靠性密切相关的特殊情况。在测试中可以使用强化输入即更恶劣的输入条件以评估软件系统的可靠性。
9.5.4 可靠性测试的实施
在进行软件可靠性测试前需要检查软件需求与设计文档的一致性以及软件开发过程中形成的文档的准确性、完整性和与程序的一致性。受控测试是软件可靠性测试的基础需要确保测试过程中的每个测试用例都使用相同的软件版本。除了统计测试有时还需要进行非统计测试以满足客户要求、合同规定或标准约束。软件的可测试性对软件可靠性测试至关重要难点在于判断测试用例的运行成功与失败。软件可靠性数据是可靠性评价的基础应该记录测试过程中的相关信息并编写《软件可靠性测试报告》进行总结归纳。规范化可靠性测试过程有利于获得真实有效的数据从而为最终得到客观的可靠性评价结果奠定基础。
9.6 软件可靠性评价
9.6.1 软件可靠性评价概述
软件可靠性评价适用于软件开发过程和最终软件系统用于估计当前软件的可靠性水平、预测达到相应可靠性水平所需时间和工作量并评估最终软件产品的可靠性水平。在软件开发过程中可以使用软件可靠性模型来评估软件的可靠性并确定是否可以终止测试和发布软件。对于最终软件产品软件可靠性评价结合可靠性验证测试验证软件的执行与需求的一致性并确定最终软件产品的可靠性水平。 软件可靠性评价需要选择合适的可靠性模型收集软件可靠性数据并运用统计技术和其他手段对数据进行处理以进行可靠性评估和预测。
以上是软件可靠性评价的核心要点。
9.6.2 怎样选择可靠性模型
选择可靠性模型时需要考虑以下几个因素
模型假设的适用性模型的假设必须符合软件系统的实际情况并且与现有的软件系统冲突的因素应该可以忽略不计。预测的能力与质量模型应该能够准确地根据现有和历史的可靠性数据预测将来的可靠性和失效概率。选择成熟、广泛应用的模型能提高预测能力和质量。模型输出值是否满足评价需求根据可靠性测试的目的确定需要精确估计的可靠性定量指标确保所选模型能够输出满足评价需求的结果。模型使用的简便性模型需要的数据易于收集并且收集成本不能超过预算模型应该简单易懂测试人员不需要深入研究数学理论最好能够使用工具实现数据输入减少额外工作量。
尽管可供选择的可靠性模型有限但以上因素可以帮助选择适合的模型进行可靠性评价
9.6.3 可靠性数据的收集
可靠性数据对于软件可靠性评价至关重要。然而在数据收集工作中存在一些问题包括规范不统一、连续性不足、缺乏有效的数据收集手段、数据完整性和准确性不足等。为了解决这些问题需要及早确定可靠性模型并明确可靠性数据规范制订可行的数据收集计划并重视测试数据的整理和分析。同时充分利用数据库来存储和分析可靠性数据也是一种有效的方法。通过这些措施可以提高软件可靠性评价的准确性和有效性。
9.6.4软件可靠性的评估和预测
软件可靠性的评估和预测主要目的是为了评估软件系统的可靠性状况并预测将来一段时间的可靠性水平。常见的需要利用软件可靠性评价解答的问题包括判断是否达到可靠性目标、投入多少资源才能达到可靠性目标以及在软件系统投入实际运行后能否达到用户使用的可靠性水平。目前有许多支持软件可靠性估计的软件工具但对于可靠性要求很高的系统必须进行大量测试才能得出高置信度的结果。即便如此仍然可能没有任何失效发生这时可以假设测试是基于二项式分布的并对可靠性作保守估计。软件可靠性评价技术和方法主要依据选用的软件可靠性模型统计方法和技术可以作为可靠性模型的补充、完善和修正例如失效数据的图形分析法和试探性数据分析技术等。