软件可靠性的重要性
软件可靠性直接关系到计算机系统乃至更大的系统能否在给定时间内完成指定的任务,不可靠的软件引发的失效可能给软件使用者带来灾难性的后果。比如海湾战争中,一个软件故障扰乱了"爱国者"导弹的雷达跟踪系统,导致发射导弹时产生1/3的时间误差,结果未击中伊拉克的飞毛腿导弹,比如医疗设备中放射性治疗设备的软件错误导致美国的放射治疗仪产生超量辐射,造成多起癌症病人死忙。提高软件的可靠性已成为软件开发人员迫切要解决的问题。软件可靠性工程可以有效地对软件产品特性进行度量和预测,对软件开发过程的状态进行控制、设计并开发出高可靠性的软件。
什么是软件可靠性
1983年美国IEEEE计算机学会给出的软件可靠性(reliability)的定义:
1) 在规定的条件下,在规定的时间内,软件不引起系统失效的概率。
2) 在规定的时间周期内,在所述条件下程序执行所要求的功能的能力。
软件可靠性工程(Software Reliability Engineering,SRE)是一门以减少软件系统在运行中不满足用户要求的可能性为目标的应用科学,其研究内容包括:
1) 软件可靠性的分析: 确定指标、设计开发过程、进行预计、分析失效严重性等。
2) 软件可靠性的测量: 用失效数据和软件可靠性模型估计(或测量)软件运行的可靠性。
3) 软件可靠性的管理:利用可靠性测量和其他信息来控制和改进开发过程,并对采购或重用的软件进行管理。
4) 软件可靠性开发过程的改进:确定影响软件可靠性的因素,改进费用效益关系。
软件可靠性的3个要素
软件可靠性的定义的3个要素: 失效(failure)、时间(time)和操作环境(environment)。
1) 软件可靠性的关键是如何能保证软件无故障运行,使其功能能更好地满足用户需求。软件故障(software fault)是软件运行过程中出现的一种不希望或不可接受的内部状态。软件故障是软件缺陷(software defect)被激活后的表现形式。软件故障总是软件错误(software error)引起的,但软件错误不一定引起软件故障。当软件运行时出现软件故障,并没有采取措施处理时,便会产生软件失效(software failure)。软件失效是软件运行时产生的一种不期望或不可接受的外部行为结果,是系统运行行为对用户要求的偏离。软件失效的例子,如数据库收到一个查询但未产生任何响应,飞机自动飞行系统未按指令保持某确定高度,银行查询某支票余额却显示读错,电话转接系统未按要求连接到正确线路。
所有软件失效都是由软件故障引起,但软件故障不一定引起软件失效。判断软件失效的依据:系统死机、系统无法启动、不能输入/输出显示记录、计算数据有误、决策不合理以及其他削弱或使软件功能丧失的事件或状态。软件失效对系统服务的影响来判定失效的严重程度级别,如灾难性失效、重大失效、微小失效。
软件故障如果没有得到自动、有效、及时的处理,便不可避免地导致软件失效。
2) 可靠性量化通常用相关时间来定义,先确定时间基准。
假设某软件系统1周内运行了42h,CPU的时间为运行时间的2/3,则日历时间为1周,时钟时间为42h,执行时间为28h。时钟时间指程序运行开始到程序运行结束所用的时间。执行时间是计算机在执行程序时实际占用中央处理器CPU的时间。
对于可靠性测量和建模而言,执行时间比日历时间更准确,然而为了便于用户理解,可靠性量化必须和日历时间相联系,必然存在日历时间和执行时间的转换。
时间基准确定好后,失效可以用3种方式表示: 累积失效函数(the cumulative failure function)、失效强度函数(the failure intensity function)和平均失效时间函数(the meantime to failure function)。累积失效函数表示与每一时间点相关的平均累积失效。失效强度函数(失效发生率)表示累积失效函数的变化率。平均失效时间(MeanTime To Failure,MTTF)表示观察到下次失效的期望时间。
与时间有关的另一个量化指标为平均修复时间(MeanTime To Respair,MTTR),表示观察到失效后,修复系统所需要的时间。硬件的MTTR很容易评估,因为典型的硬件修复过程通过诊断确定系统出错的部件,然后同样的或等效的部件来替换它,这一标准过程对MTTR的估计十分精确。软件的MTTR则不同,软件失效的暂时恢复可以是简单的重装软件或重运行软件直到失效再次出现。永久性的修复需要调试、修改、确认、重装该软件。
可用性指在需要时系统可用的概率,用MTTF/(MTTF+MTTR)来表示。
3) 不同的操作环境 ,软件的可靠性是不同的。定义软件可靠性所要求的操作环境,主要指对输入数据的要求和计算机当时的状态(软件环境),而其他一切支持系统及因素都假定对该软件是理想的,即不会影响软件的正常运行。
软件操作环境通常以操作概图(profile)来描述。操作概图是软件可执行的操作及其发生概率组成的集合。操作指一组包含相同处理的运算。当然软件操作的数量可能极大,当不可能确定所有操作及其概率时,常使用基于输入状态的分组或划分成域的操作。

失效数据采集
失效数据采集: 失效计数数据和失效间隔时间数据。失效计数数据跟踪单位时间内检测到的失效次数,常见于工程报告和安装说明中。较长时间的测试可以消除短时间间隔内产生的偏差,所以形成失效计数的时间越长,结果越稳定。建议采用和目标一致的最小时间单元内所报告的失效次数。

失效间隔时间数据,可以通过时间单元平均利用率算法来调整时钟系统。如果无法直接得到失效间隔时间数据,而仅有每一时间单元发生失效的次数数据,那么失效间隔时间可通过下面2种方法间接得到。

许多可靠性建模程序根据失效计数数据和失效间隔时间数据来评估模型参数的能力。有时候很遗憾,只能提供其中一种数据。
如果程序提供失效间隔时间数据,而期望输入数据是失效计数数据,可以先将失效间隔时间数据转换成累计计数数据,然后在规定时间内发生失效的累计计数。
如果程序提供失效计数数据,而期望输入数据为失效间隔时间数据,可以通过2个方法进行转换(除非十分必要,不提倡这种转换,会引起模型操作的噪音):
1) 在规定时间间隔内随机分配失效,随机性对某些模型不会造成15%以上的估计差错。
2) 在时间长度内均匀分配失效。
可靠性评价和预测
软件可靠性测试包括2方面: 可靠性评价和可靠性预测。
可靠性评价是对系统测试和系统运行期间得到的失效数据应用统计推理,从而断定系统当前的软件可靠性,其目的是评价当前软件的可靠性,并确定可靠性模型是否为回溯的正确依据。
可靠性预测是利用已知的任何软件度量与规程确定未来软件的可靠性。
1) 可靠性预测:在已知失效数据时,可利用评价技术来定参和验证软件可靠性模型,从而完成对未来软件可靠性的预测。
2) 早期预测:在不知失效数据时,软件开发过程中得到的规程和所得产品的特性可被用来确定系统的软件可靠性。
早期预测技术通常用来求静态度量标准,如固有错误密度、期望错误总数和初始错误率。早期预测对软件管理中的耗费评价、资源计划、方案确证和质量预报十分重要。基于失效数据的可靠性预测技术得到的可靠性模型,更能测量和预测软件产品的可靠性。
软件可靠性建模
软件可靠性建模是试图以数学模型来模拟软件的可靠性行为,并对这一可靠性行为给出一种或多种定量的估计或预测,其基本方法是对过去失效数据建模,以预测未来失效数据,包括单位时间内软件的失效次数和软件的失效间隔时间。

如上图所示,软件系统的失效率总体随着软件失效的发现与消除而减少。在任意给定时间,可以看到软件相应的失效率。软件可靠性建模技术通过统计结果预测失效率曲线,建模有2个目的:1) 预测达到规定目标还需要多少测试时间,2) 在规定测试时间的情况下,预测测试结束时软件的期望可靠性。
对于不同模型的应用经验表明,没有一个普遍适用的模型能对所有产品都能做出最好的可靠性评价和预测,因此有必要为用户建立关于选择哪一个模型以及对软件可靠性测量采用什么过程的指导性准则与推荐性意见。
为了对软件可靠性模型进行总体评价,建立以下7个评价准则:诊断有效性、测量参数的简易性、假设质量、能力、可用性、简单性、对噪音的不敏感性。
1) 诊断有效性(predictive validity):包括对当前失效强度的测量精度以及对操作失效率的预测和完成测试的时间预测。
2) 测量参数的简易性(ease of measuring parameters):模型所需要的参数数量以及评价这些参数的难度。
3) 假设质量(quality of assumptions):软件可靠性模型所做的假设应该尽量与现实工程测试和操作环境相近。常用的假设:a) 测试输入随机地遇到错误;b) 所有失效结果相互独立;c) 测试空间覆盖使用空间;d) 所有失效在其发生时都可恢复;e) 错误会在失效时被及时地清除或不会再遇到;f) 软件失效强度与软件中存在的错误数有关,软件可靠性模型可以确定这一关系。
4) 能力(capability):模型能评价软件系统中与可靠性相关的量的能力。相关的量包括a) 在给定时间内被评价的固有错误,期望的全部失效或残留的错误;b) 当前可靠性MTTF或失效强度;c) 达到规定可靠性所期望的数据MTTF,失效强度目标或遗留的错误数;d) 在实现目标相关的人机资源及耗费需求。
5) 可用性(applicability):软件可靠性模型的可用性根据不同的代码规模、结构、功能和应用领域来校验。
6) 简单性(simplicity):简单性体现在数据采集过程,建模概念及其使用软件工具的实现过程。
7) 对噪音的不敏感性(insensitivity to nosie):一个好的模型不仅能在纯净数据的理想情况下表现出有效性,还能在失效数据集不完全或含有测量不确定性时完成精确测量。
除以上另外用5种方法对软件可靠性进行改进:1) 重新校准"标准"软件可靠性评价模型减少误差;2) 以线性方式将两个或多个"标准"软件可靠性评价模型组合成一个复杂模型,以增加论断精度;3) 在可靠性中引入软件复杂性规程,并评价在软件可靠性增长中的不同测试类型;4) 模拟技术,由设计编码或测试阶段提供的软件规程模拟可靠性评价;5) 神经网络模型,利用输入的失效数据学习产品的可靠性增长模式。
一道练习题来找找感觉吧

题目中可以看到硬件的可靠性,软件整系统的可靠性,软件子系统的可靠性。但每个部件的MTTR和MTTF数据怎么来的?整个系统的MTTR和MTTF又是怎么算出来的呢?
摘自由赵靖 王延斌 曲立平 史长亭编著的国防特色教材《软件可靠性工程》一书第1章导论。