目录
前言:
1 9 . 4 软件容错技术
19.4.1 N 版本程序设计
1 . 与 通 常 软 件 开 发 过 程 的 区 别
2 . 其 他 需 要 注 意 的 问 题
19.4.2 恢复块方法
19.4.3 防卫式程序设计(预防性设计)=》广泛使用
1 . 错误检测
2 . 破坏估计
3 . 错误恢复
前言:
可靠的系统与系统的可靠性 (产品的质量)
- 依从性:守规矩、遵规律的能力 =》遵守研发规律、遵守软件工程规律、遵守设计流程、遵守编码规范、项目管理。一群有素养的人,按软件开发的规律做事,做出来的产品可靠性性质量不会太差。
- 成熟性:长期不犯错的能力 =》 软件成熟度模型、充分性测试。
- 容错性:偶尔犯小错不误事的能力。 =》 容错设计、DEFMA
- 易恢复性:偶尔犯大错误事后的补救能力。=》恢复性设计。
可靠性不是天然的,是设计、测试、管控出来的,是需要有成本投入的。
大公司,会有一帮人,专门在研发如何提供产品的质量,如果把不同产品线的能力抽象出组织的公共能力,并以流程的方式推广的整个公司。
1 9 . 4 软件容错技术
软件容错的基本思想是从硬件容错中引申而来,利用软件设计的冗余和多样化來达到屏蔽错误的影响,提高系统可靠性。
软件容错的主要方法是提供足够的冗余信息和算法程序,使系统在实际运行时能够及时发现程序设计错误,采取补救措施,以提高系统可靠性,保证整个系统的正常运行。
软件容错技术主要有:
- N 版本程序设计、
- 恢复块方法
- 防卫式程序设计等。
除上述3种方法外,提高软件容错能力也可以从
- 计算机平台环境、
- 软件工程和
- 构造异常处理模块
等不同方面达到。此外,
- 利用高级程序设计语言本身的容错能力,采取相应的策略,也是可行的办法。例如, C++语言中的 try _ except 处理法和 try fmally 中止法等。
19.4.1 N 版本程序设计
N 版本程序设计是一种静态的故障屏蔽技术,采用前向恢复的策略,如 图 19-5所示。
N 版本程序的设计思想是用N个具有相同功能的程序同时执行一项计算,结果通过多数表决来选择。其中#个版本的程序必须由不同的人(小组)独立设计,使用不同的方法、不同的设计语言、不同的开发环境和工具来实现,目的是减少#个版本的程序在表决点上相关错误的概率。
备注:
类似公司的决策部门的投票,避免因为一人的错误导致整个系统的风险。
一个人的决策总会有偏差、误差和错误。
1 . 与 通 常 软 件 开 发 过 程 的 区 别
与通常软件开发过程不同的是, N 版本程序设计增加了三个新的阶段,分别是相异成分规范评审、相异性确认和背对背测试。
(1) 相异成分评审。
每个版本的工作组均接收到一份相同的 S R S需求规格说明书 。
为了保证相异性,这些工作组之间不允许进行任何形式的交流,有关 S R S 的问题只能在工作组和项目管理人员之间进行交换,这种交换是通过问题单的形式进行的。对于各工作组提出的问题,由项目管理人员组成的 S R S 评审委员会对每个问题单进行研究。若是对 S R S 理解不正确,则向有关工作组进行解释;若是 S R S 本身问题,则修改 S R S , 并通知所有工作组。
(2) 相异性确认。
相异性确认在相异成分详细设计后进行,其目的是对相异性进行评估。
(3) 背对背测试。
使用同样的测试数据对 N 版本程序进行测试,将 W 个版本程序的运行结果进行比较,用以发现版本中的软件故障。
2 . 其 他 需 要 注 意 的 问 题
与通常的软件开发相比,除了开发过程不同之外, N 版本程序设计还需要注意以下问题:
(1) N 版本程序的同步。
由于各种不同版本并行执行,有时甚至在不同的计算机中执行,必须解决彼此之间的同步问题。
N 版本程序的同步机制除通常的帧同步之外,还有事件同步机制,以保证输入一致性和交叉检查点的正常工作。在 N 版本程序的同步机制中,需要引入超时处理,以解决失步问题。
(2) N 版本程序之间的通信。
由于 N 版本程序设计的独立性,不同版本的数据表示可能是不同的,因此,在N个版本程序之间进行数据通信时,必须进行数据变换。可将N个版本通信接 n 处的数据规定为一种独立于各个版本的统一的数据格式,任一版本发送数据时,需将该版本的内部数据表示转换为统一的数据表示;当任一版本接收其他版本的数据时,滯将统一的数据表示变换为内部所需的数据表示。
( 3 ) 表决算法。
在 N 版本程序设计中,通常有三种表决算法:
- 全等表决(主要适用于布尔量的表决)、
- 非精确表决(允许设置一个偏差,主要适用于数值量的表决)和
- Cosmetie 表 决 (适用于字符串的表决)。
(4 ) 一致比较问题。
在进行有限精度运算的情况下,计算的结果与所使用的特定算法和计算的顺序有关,在进行计算量比较时(例如,将某计算量与一常量进行比较),虽然这些计算量能满足 S R S 要求,但比较结果可以全然不同,最终导致在 N 版本表决时不能得出正确的结果。对于这个问题,比较好的解决方法是将需要进行比较的计算量进行一•次交叉表决,其缺点是降低了 N 版本程序的相异性,并使系统的实时性变差。
( 5 ) 数据相异性。
软件的故障往往仅在数据空间的个別点发生,当对这些个别点进行修正后,则软件仍可正常工作。这是由于实际情况对数据空间的任一点,往往允许有一定的误差,只要数据点在允许的误差范围内,则可看作是逻辑上等效的。因此,当软件在某个输入数据; c 上存在故障,输出不正确时,可选用适当的数据重新表示算法,计算 出 与 逻 辑 等 效 的 输 入 数 据 然 后 对 >;进行计算,从而得到正确的输出。
19.4.2 恢复块方法
N版本:并行、同时、对等
恢复块:串行、菊花链、优先级
19.4.3 防卫式程序设计(预防性设计)=》广泛使用
N 版本程序设汁和恢复块方法都是基于设计冗余(增加资源)的思想,这给程序员和处理机都增
加了许多工作,而且它们的结构本身又带来了一些问题和困难,例如,多版本程序设计中的相关性错误问题和恢复块方法中的验证测试的设计等。
防卫式程序设计是一种不采用任何传统的容错技术就能实现软件容错的方法,对于程序中存在的错误和不一致性,防卫式程序设计的基本思想是通过在程序屮包含错误检査代码和错误恢复代码,使得一旦发生错误,程序就能撤销错误状态,恢复到一个已知的正确状态中去。
其实现策略包括错误检测、破坏估计和错误恢复三个方面:
1 . 错误检测
在程序中插入状态断言,所谓状态断言,就是包含状态变 M 的逻辑谓词。
这些断言可插入到一些重要的赋值语句之前,使得那些可能导致错误的赋值在变量状态发生变化
之前被检测出来。例如,实型变量 G r a d e 表示一个学生的成绩, C 为一个整型变量,那
么,可以在赋值语句“ Grade = C ”之前插入断言“{0=0.0 and C <=100.0}”,以保证对G r a d e 赋值的正确性。
插入断言法主要适用于抽象数据类型,因为在抽象数据类型中,断言检查代码只需定义一次,就可对该类型变量的操作进行检査。在程序中普遍采用状态断言检査将占用大量空间,折中的办法是在重要操作处进行检查,发现非法状态,再进行破坏估计和错误恢复。
2 . 破坏估计
插入断言法是试图在变量状态改变之前对可能引起错误的操作予以避免,
而破坏估计的任务是在变量条件可能已经遭到破坏的情况下,判断破坏是否已发生,以及状态空间的哪些部分受到了错误的影响。例如,在抽象数据类型中,可以设置一个破坏指示器,通过询问破坏指示器来估计破坏发生的情况。
3 . 错误恢复
在防卫式程序设计中,既可使用前向恢复策略,也可使用后向恢复策略,其中后向恢复是一种更易于实现的技术,可以保持(缓存)一个先前的安全状态的细节,发生错误时再对该状态进行恢复。
通常有两种处理办法,一种是数据状态的变换先不写入,等到处理全部完毕而没有出现错误时,才写入变换后的状态,这种处理多用于数据库系统中;
另一种是在一定时间间隔的检査点制作安全状态的拷贝,当发生错误时,恢复最近检查点的状态。
防卫式程序设计是一种较易实现的方法,比较灵活,尤其适用于小程序或局部程序的容错。
尽管防卫式程序设计不能处理算法中存在的逻辑错误,但对程序运行过程中出现的硬件故障或偶然事件引起的错误能起到屏蔽的作用,并且由于其执行效率高、占用空间小、易于设计和实现,因此,是对恢复块方法和多版本程序设计技术的一个补充。
备注:
所谓前向(未来)恢复是指使当前的计算继续下去,把系统恢复成连贯的正确状态, 弥补当前状态的不连贯情况,这需有错误的详细说明。
所谓后向(过去)恢复是指系统恢复到前一个正确状态,继续执行。这种方法显然不适合实时处理场合。