|
知识路径: > 测试技术的分类 > 可靠性测试 > 软件的可靠性设计与管理 >
|
被考次数:1次
被考频率:低频率
总体答错率:55%  
知识难度系数:
|
由 软考在线 用户真实做题大数据统计生成
|
相关知识点:8个
|
|
|
|
在测试阶段我们利用测试手段收集测试数据,并利用软件可靠性模型,可以评估或预测软件的可靠性,这些软件可靠性测试活动虽然能通过查错-排错活动有限地改善软件可靠性,但不能从根本上提高软件的可靠性,也难以保证软件可靠性,并且修改由于设计导致的软件缺陷,有可能付出比较昂贵的代价。实践证明,保障软件可靠性最有效、最经济、最重要的手段是在软件设计阶段采取措施进行可靠性控制。为了从根本上提高软件的可靠性,降低软件后期修改的成本和难度,人们提出了可靠性设计的概念。
|
|
|
可靠性设计其实就是在常规的软件设计中,应用各种方法和技术,使程序设计在兼顾用户的功能和性能需求的同时,全面满足软件的可靠性要求,即采用一些技术手段,把可靠性“设计”到软件中去。软件可靠性设计技术就是以提高和保障软件的可靠性为目的,在软件设计阶段运用的一种特殊的设计技术。
|
|
|
在软件工程中已有很多比较成熟的设计技术,如结构化设计、模块化设计、自顶向下设计、自底向上设计等,这些技术是为了保障软件的整体质量而采用的,在此基础上,为了进一步提高软件的可靠性,通常会采用一些特殊设计技术。虽然软件可靠性设计技术与普通的软件设计技术没有明显的界限,但软件可靠性设计仍要遵循一些自己的原则:
|
|
|
①软件可靠性设计是软件设计的一部分,必须在软件的总体设计框架中使用,并且不能与其他设计原则相冲突。
|
|
|
②软件可靠性设计在满足提高软件质量要求的前提下,以提高和保障软件可靠性为最终目标。
|
|
|
③软件可靠性设计应确定软件的可靠性目标,不能无限扩大化,并且排在功能度、用户需求、开发费用之后考虑。
|
|
|
可靠性设计概念被广为引用,但并没有多少人能提出非常实用并且广泛运用的可靠性设计技术。一般来说,被认可的且具有应用前景的软件可靠性设计技术主要有容错设计、检错设计、降低复杂度设计等技术。
|
|
|
|
对于软件失效后果特别严重的场合,如飞机的飞行控制系统、空中交通管制系统、核反应堆安全控制系统等,可采用容错设计方法。常用的软件容错技术主要有三种方法:恢复块设计、N版本程序设计和冗余设计。
|
|
|
|
程序的执行过程可以看成是由一系列操作构成的,这些操作又可由更小的操作构成。恢复块设计就是选择一组操作作为容错设计单元,从而把普通的程序块变成恢复块。被选择用来构造恢复块的程序块可以是模块、过程、子程序、程序段等。
|
|
|
一个恢复块包含有若干个功能相同、设计差异的程序块文本,每一时刻有一个文本处于运行状态。一旦该文本出现故障,则用备份文本加以替换,从而构成“动态冗余”。软件容错的恢复块方法就是使软件包含有一系列恢复块。
|
|
|
|
N版本程序的核心是通过设计出多个模块或不同版本,对于相同初始条件和相同输入的操作结果,实行多数表决,防止其中某一软件模块/版本的故障提供错误的服务,以实现软件容错。为使此种容错技术具有良好的结果,必须注意以下两个方面:
|
|
|
①使软件的需求说明具有完全性和精确性。这是保证软件设计错误不相关的前提。因为软件的需求说明是不同设计组织和人员的惟一共同出发点。
|
|
|
②设计全过程的不相关性。它要求各个不同的软件设计人员彼此不交流,程序设计使用不同的算法、不同的编程语言、不同的编译程序、不同的设计工具、不同的实现方法和不同的测试方法。为了彻底保证软件设计的不相关性,甚至提出设计人员应具有不同的受教育背景,来自不同地域、不同的国家。
|
|
|
|
改善软件可靠性的一个重要技术是冗余设计。在硬件系统中,在主运行的系统之外备用额外的元件或系统,如果出现一个元件故障或系统故障,则立即更换冗余的元件或切换到冗余的系统,则该硬件系统仍可以维持运行。在软件系统中,冗余技术的运用有所区别。如果我们采用相同两套软件系统作为互为备份,其意义不大,因为在相同的运行环境中,一套软件出故障的地方,另外一套也一定会出现故障。软件的冗余设计技术实现的原理是在一套完整的软件系统之外,设计一种不同路径、不同算法或不同实现方法的模块或系统作为备份,在出现故障时可以使用冗余的部分进行替换,从而维持软件系统的正常运行。
|
|
|
从表面上看,设计开发完成同样功能但实现方法完全不同的两套软件系统,需要的费用可能接近于单个版本软件开发费用的两倍,但采用冗余技术设计软件所增加的额外费用肯定远低于重新设计一个版本软件的费用。这是因为大多数设计花费,例如文档、测试以及人力都是有可能复用的。冗余设计还有可能导致软件运行时所花费的存储空间、内存消耗以及运行时间有所增加,这就需要在可靠性要求和额外付出代价之间作出折衷。
|
|
|
|
在软件系统中,无需在线容错的地方,或不能采用冗余设计技术的部分,如果对可靠性要求较高,故障有可能导致严重的后果,一般采用检错技术,在软件出现故障后能及时发现并报警,提醒维护人员进行处理。检错技术实现的代价一般低于容错技术和冗余技术,但它有一个明显的缺点,就是不能自动解决故障,出现故障后如果不进行人工干预,将最终导致软件系统不能正常运行。
|
|
|
采用检错设计技术要着重考虑几个要素:检测对象、检测延时、实现方式、处理方式。
|
|
|
. 检测对象:检测对象包含两个层次的含义,检测点和检测内容。在设计时应考虑把检测点放在容易出错的地方,和出错对软件系统影响较大的地方;检测内容选取那些有代表性的、易于判断的指标。
|
|
|
. 检测延时:从软件发生故障到被自检出来是有一定延时的,这段延时的长短对故障的处理是非常重要的,因此,在软件检错设计时要充分考虑到检测延时。如果延时长到影响故障的及时报警,则需要更换检测对象或检测方式。
|
|
|
. 实现方式:最直接的一种实现方式是判断返回结果,如果返回结果超出正常范围,则进行异常处理。计算运行时间也是一种常用的技术,如果某个模块或函数运行超过预期的时间,可以判断出现故障。另外,还有置状态标志位等多种方法,自检的实现方式要根据实际情况来选用。
|
|
|
. 处理方式:大多数检错采用“查出故障-停止软件系统运行-报警”的处理方式,但也有采用不停止或部分停止软件系统运行的情况,这一般由故障是否需要实时处理来决定。
|
|
|
|
前面我们讲到,软件和硬件最大的区别之一就是软件的内部结构比硬件复杂得多,我们用软件复杂度来定量描述软件的复杂程度。软件复杂性常分为模块复杂性和结构复杂性。模块复杂性主要包含模块内部数据流向和程序长度两个方面,结构复杂性用不同模块之间的关联程度来表示。软件复杂度可用涉及到模块复杂性和结构复杂性的一些统计指标来进行定量描述,在这里就不进行详细叙述了。
|
|
|
软件的复杂性与软件可靠性有着密切的关系,软件复杂性是产生软件缺陷的重要根源,有研究表明,当软件的复杂度超过一定界限时,软件缺陷数会急剧上升,软件的可靠性急剧下降。因此,在设计的时候就应考虑降低软件的复杂性,使之处于一个合理的阈值之内,这是提高软件可靠性的有效方法。
|
|
|
降低复杂度设计的思想就是在保证实现软件功能的基础上,简化软件结构,缩短程序代码长度,优化软件数据流向,降低软件复杂度,从而提高软件可靠性。
|
|
|
除了容错设计、检错设计和降低复杂度设计技术外,人们尝试着把硬件可靠性设计中比较成熟的技术,如故障树分析(FTA)、失效模式与效应分析(FMEA)等运用到软件可靠性设计领域,这些技术大多是运用一些分析、预测技术,在软件设计时就充分考虑影响软件可靠性的因素,并采取一些措施地进行优化。由于软件与硬件内部性质的巨大差异,这些技术在软件可靠性设计领域的应用效果和范围极其有限。
|
|
|