1软件可靠性基本概念
软件可靠性和硬件可靠性区别
- (1)复杂性:软件复杂性比硬件高,大部分失效来自于软件失效。
- (2)物理退化:硬件失效主要是物理退化所致,软件不存在物理退化。
- (3)唯一性:软件是唯一的,每个COPY版本都一样,而两个硬件不可能完全一样。
- (4)版本更新周期:硬件较慢,软件较快。
软件可靠性的定量描述
- 1.规定时间:自然时间、运行时间、执行时间(占用CPU)。
- 2.失效概率:软件运行初始时为0,随着时间增加单调递增,不断趋向于1.
- 3.可靠度:软件系统在规定的条件下、规定的时间内不发生失效的概率。等于1 - 失效概率。
- 4.失效强度:单位时间软件系统出现失效的概率。
- 5.平均失效前时间(MTTF):平均无故障时间,发生故障前正常运行的时间。
- 6.平均恢复前时间(MTTR):平均故障修复时间,发生故障后的修复时间。
- 7.平均故障间隔时间(MTBF):失效或维护中所需的平均时间,包括故障时间以及检测和维护设备的时间。MTBF=MTTF+MTTR。
- 系统可用性=MTTF/(MTTF+MTTR)*100%
总结:
1.失效率:开始为0,随着时间单调递增趋向于1。可靠度:跟失效率有关,1 - 失效率。失效强度:单位时间失效的概率。
2.MTTF:运行直到失败,那就是正常运行时间,失效前时间。MTTR:失效直到修复,恢复时间呗。MTBF:两次失败的间隔,正常运行时间+修复时间
3.系统可用性 = 正常运行时间占的比例MTTF /(MTTF+MTTR)
串并联系统可靠性


可靠性测试的意义
- (1)软件失效可能造成灾难性的后果。
- (2)软件的失效在整个计算机系统失效中的比例较高。
- (3)软件可靠性技术很不成熟,加剧了软件可靠性问题的重要性。
- (4)软件可靠性问题是造成费用增长的主要原因之一。
- (5)软件对生产活动和社会生活的影响越来越大,从而增加了软件可靠性问题在软件工程领域乃至整个计算机工程领域的重要性。
总结:软件在社会生产活动中越来越重要,但是软件的可靠性技术不成熟,失效主要是软件引起,而且造成后果严重,费用增加。

2软件可靠性建模
一个软件可靠性模型通常(但不是绝对)由以下几部分组成:
- (1)模型假设。模型是实际情况的简化或规范化,总要包含若干假设,例如测试的选取代表实际运行剖面,不同软件失效独立发生等。
- (2)性能度量。软件可靠性模型的输出量就是性能度量,如失效强度、残留缺陷数等。在软件可靠性模型中性能度量通常以数学表达式给出。
- (3)参数估计方法。某些可靠性度量的实际值无法直接获得,例如残留缺陷数,这时需通过一定的方法估计参数的值,从而间接确定可靠性度量的值。
- (4)数据要求。一个软件可靠性模型要求一定的输入数据,即软件可靠性数据。
总结:
可靠性模型组成:模型假设(代表实际运行剖面,失效独立)、模型输出量--性能度量,无法直接获取的通过间接估计---参数估计方法,可靠性数据。
绝大多数的模型包含3个共同假设:
- (1)代表性假设。是指可以用测试产生的软件可靠性数据预测运行阶段的软件可靠性行为。 -- 测试阶段获得的可靠性数据代表运行阶段。
- (2)独立性假设。此假设认为软件失效是独立发生于不同时刻,一个软件失效的发生不影响另一个软件失效的发生。 -- 失效之间不互相影响独立发生
- (3)相同性假设。此假设认为所有软件失效的后果(等级)相同,即建模过程只考虑软件失效的具体发生时刻,不区分软件的失效严重等级。 -- 失效强度相同
软件的可靠性模型分类
- 1.种子法模型。利用捕获一再捕获抽样技术估计程序中的错误数,在程序中预先有意“播种”一些设定的错误“种子”,然后根据测试出的原始错误数和发现的诱导错误的比例,来估计程序中残留的错误数。-- 预先播种错误,最后测完了,看看预先设置错误和其他错误的比例。
- 2.失效率类模型。用来研究程序的失效率。
- 3.曲线拟合类模型。用回归分析的方法研究软件复杂性、程序中的缺陷数、失效率、失效间隔时间。
- 4.可靠性增长模型。这类模型预测软件在检错过程中的可靠性改进,用增长函数来描述软件的改进过程。
- 5.程序结构分析模型。是根据程序、子程序及其相互间的调用关系,形成一个可靠性分析网络。
- 6.输入域分类模型。选取软件输入域中的某些样本“点”运行程序,根据这些样本点在“实际”使用环境中的使用概率的测试运行时的成功/失效率,推断软件的使用可靠性。
- 7.执行路径分析方法模型。分析方法与上面的模型相似,先计算程序各逻辑路径的执行概率和程序中错误路径的执行概率,再综合出该软件的使用可靠性。
- 8.非齐次泊松过程模型。是以软件测试过程中单位时间的失效次数为独立泊松随机变量,来预测在今后软件的某使用时间点的累计失效数。
- 9.马尔可夫过程模型。
- 10.贝叶斯模型。是利用失效率的试验前分布和当前的测试失效信息,来评估软件的可靠性。
3软件可靠性管理
软件可靠性管理的内容包括软件工程各个阶段的可靠性活动的目标、计划、进度、任务和修正措施等。可靠性在生命周期各阶段设计任务如下:
- 需求分析阶段:确定可靠性目标、分析影响因素、确定验收标准、制定框架、制定文档编写规范、制定初步计划、确定数据收集规范。-- 目标、计划、标准、规范、框架、因素等等
- 概要设计阶段:确定可靠性度量、制定详细验收方案、可靠性设计、收集数据、调整计划、明确后续阶段详细计划、编制文档。-- 详细验收方案/计划等,度量、设计
- 详细设计阶段:可靠性设计、预测、调整计划、收集数据、明确后续阶段详细计划、编制文档。-- 设计。收集,文档
- 编码阶段:可靠性测试(单元)、排错、调整计划、收集数据、明确后续阶段详细计划、编制文档。-- 测试,排错,收集,文档
- 测试阶段:可靠性测试(集成和系统)、排错、可靠性建模、评价、调整计划、收集数据、明确后续阶段详细计划、编制文档。-- 测试、排错、评价、收集、
- 实施阶段:可靠性测试(验收)、排错、收集数据、调整模型、评价、编制文档。--测试、排错、评价、文档
4软件可靠性设计
软件可靠性设计原则:
- (1)软件可靠性设计是软件设计的一部分,必须在软件的总体设计框架中使用,并且不能与其他设计原则相冲突。
- (2)软件可靠性设计在满足提高软件质量要求的前提下,以提高和保障软件可靠性为最终目标。
- (3)软件可靠性设计应确定软件的可靠性目标,不能无限扩大化,并且排在功能度、用户需求和开发费用之后考虑。
原则总结:
1.在整体框架中使用,不与其他设计原则冲突。
2.首先得满足质量要求,再谈可靠性。
3.可靠性设计优先级毕竟低,要有限投入,它排在功能度,需求、开发费用之后。
软件可靠性设计技术主要有容错设计、检错设计和降低复杂度设计等技术。
- 增加冗余和计算程序的容错(比如投票表决)
- 发现错误及时提醒的检错(但不能自己处理)
- 把软件复杂度降下来
1.容错设计技术。
构造冗余(按工作方式分)
· 动态冗余/积极
动态冗余,也称为主动冗余,主要通过故障检测、故障定位及故障恢复等手段达到容错的目的。其主要方式是多重模块待机储备,当系统检测到某工作模块出现错误时,就用一个备用的模块来顶替它并重新运行。动态冗余需要检测、切换和恢复过程,因此称为动态冗余。备块工作的叫热备(双重系统),备块不工作(不工作是停机或者干一些与主块无关联的事情)的冷备(双工系统,双份系统)。
· 静态冗余/屏蔽/被动
静态冗余通过表决和比较来屏蔽系统中出现的错误。它不需要进行故障检测和切换,而是通过多个模块同时运行并比较结果,只有当多个模块的结果不一致时才认为出现了错误。静态冗余不需要实时检测,因此称为静态冗余。常用的是三模冗余(就是三模块表决)。· 区别
- 动态冗余适用于对实时性和可靠性要求较高的系统,如航空航天、军事通信,优点是能够快速检测并替换故障模块,缺点是需要复杂的检测和切换机制,增加了系统的复杂性和成本.
- 静态冗余适用于对实时性要求不高,但对可靠性要求较高的系统,如数据中心、大型服务器集群等,优点是简单可靠,缺点是资源利用率较低,因为所有模块都需要同时运行
· 混合冗余
被动 + 主动,效果好于它们但是成本太高,只在对可靠性要求极高的场合用。
信息冗余
除了功能信息外,添加一些其他信息保证运行成果可靠性,比如校验码。
时间冗余
本质是反复多次的重复计算,把每次的结果存起来然后比较,适应于对时间不敏感的情况。
冗余附加
软件容错的主要方法是提供足够的冗余信息和算法程序,使系统在实际运行时能够及时发现程序设计错误,采取补救措施,以提高系统可靠性,保证整个系统的正常运行。
软件容错技术主要有N版本程序设计、恢复块方法和冗余设计、防卫式程序设计等。
①N版本就是同一项功能,用不同的语言、方法、人开发出来,然后获得的结果投票表决。
②冗余设计:增加冗余,比如硬盘冗余阵列,数据备份到新盘等等,分结构、信息、时间、附加冗余4种。
③恢复块方法:动态冗余,它是通过故障检测、故障定位及故障恢复来完成的,比如主块计算结果判断有问题,立马启用备用块1,再次执行,在判断,还不对再启用备用块2,在计算,再判断...
④防卫式程序设计:它是在代码里加入错误检测,恢复的代码,比如try catch等
- 冗余设计:冗余是指在正常系统运行所需的基础上加上一定数量的资源,包括信息、时间、硬件和软件。冗余是容错技术的基础,通过冗余资源的加入,可以使系统的可靠性得到较大的提高。主要的冗余技术有结构冗余(硬件冗余和软件冗余)、信息冗余、时间冗余和冗余附加4种。
- N版本程序设计:是一种静态的故障屏蔽技术,其设计思想是用N个具有相同功能的程序同时执行一项计算,结果通过多数表决来选择。其中N个版本的程序必须由不同的人独立设计,使用不同的方法、设计语言、开发环境和工具来实现,目的是减少N个版本的程序在表决点上相关错误的概率。
与通常软件开发过程不同的是,N版本程序设计增加了三个新的阶段:相异成分规范评审、相异性确认、背对背测试。
其他需要注意的问题:N版本程序的同步、N版本程序之间的通信、表决算法、一直比较问题、数据相异性。
- 恢复块设计(动态冗余):动态冗余又称为主动冗余,它是通过故障检测、故障定位及故障恢复等手段达到容错的目的。其主要方式是多重模块待机储备,当系统检测到某工作模块出现错误时,就用一个备用的模块来替代它并重新运行。各备用模块在其待机时,可与主模块一样工作,也可以不工作。前者叫热备份系统(双重系统),后者叫冷备份系统(双工系统、双份系统)。

二者比较
后向恢复:回滚到无错误点,然后重新执行;前向恢复:从某点继续对损坏/丢失数据补充

- 防卫式程序设计:是一种不采用任何传统的容错技术就能实现软件容错的方法,对于程序中存在的错误和不一致性,防卫式程序设计的基本思想是通过在程序中包含错误检查代码和错误恢复代码,使得一旦发生错误,程序就能撤销错误状态,恢复到一个已知的正确状态中去。其实现策略包括错误检测、破坏估计和错误恢复三个方面。
2.检错技术
3.降低复杂度设计
双机容错技术
区别于联系:双机热备=主机+备机
简单理解:主要应用运行于主机,备机即备用机器 -- 备机不工作
双机互备=主机(备机)+备机(主机)
简单理解:部分应用运行于主机,部分应用运行于备机 -- 两机互备但是运行应用不同
双机双工=主机+主机
简单理解:两台机器同时运行应用 -- 两机互备运行应用也相同
第一种,备机不工作,主机出现故障时备机接管主机的所有工作
第二、三种,主机备机同时工作,两台服务器可以跑不同的应用,例如主机跑ORACLE,备机跑IIS,任意一台服务器故障时,所有服务会自动切换到正常的服务器上
第一种,备机不运行应用,处于等待状态
第二种,备机运行与主机不同的应用,应用互为备份
第三重,备机运行与主机相同的应用
集群技术
负载均衡
比较常用的负载均衡实现技术主要有以下几种:
--补充:正向代理和反向代理服务器1.正向代理是代理客户端,C指定要访问的服务器,然后发送给正向S,S根据指定的服务器去请求真正的S,得到结果,然后再发送给C。这种情况下C端还需要配置。经典应用:防火墙内的局域网客户端提供访问服务器的途径,科学上网2.反向代理是代理服务器,C不用指定要访问的服务器了(因为对C来说反向代理S就是要访问的S),然后反向S得到结果,再给C。C端无需任何配置。经典应用:将防火墙外的服务器提供给客户端访问,负载均衡。
- 正向代理是客户端的代理,服务器不知道真正的客户端是谁;反向代理是服务器的代理,客户端不知道真正的服务器是谁。
- 正向代理一般是客户端架设的;反向代理一般是服务器架设的。
- 正向代理主要是用来解决访问限制问题;反向代理则是提供负载均衡、安全防护等作用。二者都能提高访问速度。
5软件可靠性测试与评价
可靠性5个活动
软件可靠性评价3个过程
选择可靠性模型
可靠性数据的收集
可靠性评估和预测

