系统架构师学习笔记_第十三章(下)_连载

13.2  软件可靠性建模

13.2.1  影响软件可靠性的因素

软件可靠性模型(Software Reliability Model)是指 为预计或估算软件的可靠性 所建立的可靠性框图和数学模型。

模型 将复杂系统的可靠性 逐级分解为简单系统的可靠性,以便 定量预计、分配、估算、评价 复杂系统的可靠性。

影响软件可靠性的主要因素:缺陷的引入、发现、清除。

缺陷的引入 主要取决于 软件产品的 特征和软件的开发过程特性。

缺陷的发现依靠 运行剖面。

缺陷的清除 依赖于 失效的发现、修复活动、可靠性方面的投入。


影响软件可靠性的主要因素如下:

1、运行剖面(环境)。

2、软件规模。

3、软件内部结构。

4、软件的开发方法和开发环境。

5、软件的可靠性投入。人力、资金、资源、时间 等。

早期重视软件可靠性 并采取措施 开发出来的软件,可靠性有明显的提高。


13.2.2  软件可靠性建模方法

可靠性模型通常 由以下几部分组成:

1、模型假设。模型是实际情况的简化或规范化,总要包含若干假设。

2、性能度量。软件可靠性模型的输出量就是性能度量。

3、参数估计方法。

4、数据要求。


绝大多数模型包含三个共同假设:

1、代表性假设。选取代表软件实际的运行剖面。

2、独立性假设。假设认为软件失效是独立发生于不同时刻。

3、相同性假设。认为所有软件失效的后果(等级)相同,即建模过程只考虑软件失效的具体发生时刻,不区分软件的失效严重等级。


如果在进行预测时发现 引入了新的错误,或修复行为使新的故障不断发生,就应该停止预测。否则,这样的变化会因为增加问题的复杂程度而使模型的 适用性降低。


好的软件可靠性模型 应该具有如下 重要特性:

1、基于可靠性的假设。

2、简单。

3、计算一些有用的量。

4、给出未来失效行为的好的映射。

5、可广泛使用。


13.2.3  软件的可靠性模型分类

可靠性模型 大致可分为如下 10类:

1、种子方法模型。

利用 捕获一再捕获抽样技术 估计程序中的错误数,在程序中预先有意“播种”一些设定错误的“种子”,然后 根据测试出的原始错误 和 发现的诱导错误比例,估计程序中残留的错误数。

优点是 简单易行,缺点是 诱导错误的“种子”与实际的原始错误之间的类比性估量困难。

2、失效率类模型。

3、曲线拟合类模型。

用回归分析的方法 研究软件 复杂性、缺陷数、失效率、失效间隔时间,包括 参数方法 和 非参数 方法两种。

4、可靠性增长模型。

5、程序结构分析模型。

通过对每一个节点 可靠性、节点间转换的可靠性 和 网络在节点间的转换概率,得出该持续程序的整体可靠性。

6、输入域分类模型。

7、执行路径分析方法模型。

8、非其次泊松过程模型。

NHPP,以软件测试过程中 单位时间的失效次数 为独立泊松随机变量,来预测 今后软件的某使用时间点的积累失效次数。

9、马儿可夫过程模型。

10、贝叶斯模型。

利用失效率的试验前分布 和 当前的测试失效信息,来评估软件的可靠性。

当软件可靠性工程师对软件的开发过程有充分的了解,软件的继承性比较好时 具有良效果的可靠性分析模型。

时间域。

失效数类:失效数是有限的还是无限的。

失效数分布。

有限类:用时间表示的失效强度的函数形式。

无限类:用经验期望失效数表示的失效强度的函数形式。


13.2.4  软件可靠性模型举例

1、模型假设

JM 模型的基本假设如下:

1. 初始错误个数为一个未知的常数。

2. 发现错误立即被完全排除,并且 不引入新的错误,排除时间忽略不记,因此 每次排错后 就要减 1.

3. 失效率 剩余的错误个数 成正比。

2、函数表达式。

略。

软件可靠性模型并不成熟,定量分析方法和数学模型要在实践中不断加以验证和修正。

不同类型的软件,应用方式也有很大区别。


13.2.5  软件可靠性测试概述

可靠性测试 由可靠性目标的确定、运行剖面的开发、测试用例的设计、测试实施、测试结果的分析 等主要活动组成。

软件可靠性测试 还必须考虑对软件开发进度和成本的影响,最好是在受控的自动测试环境下,由专业测试机构完成。


13.2.6  定义软件运行剖面

弧 用来连接状态并表示由各种激励导致的转换,将转换概率分配给每个 弧。

每类用户都可能以不同的方式使用系统。

两种类型分层形式:用户级分层、用法级分层。

用法级分层依赖于 在测试状态下 系统能做什么。

用户级分层 考虑 各种类型的用户,以及他们如何使用系统。


这些概率估计主要是基于如下几个方面:

1、从现有系统收集到的数据。

2、与用户的交谈或对用户进行观察 获得的信息。

3、原型使用与测试分析的结果。

4、相关领域专家的意见。


13.2.8  可靠性测试的实施

有必要检查软件需求与文档是否一致,检查软件开发过程中形成的文档的准确性、完整性、一致性。

可靠性测试依赖于软件的可测试性。

为了获得更多的可靠数据,应该使用多态计算机同时运行软件,以增加累计时间。


用时间定义的软件可靠性数据分为4类:

1、失效时间数据。

2、失效间隔时间数据。

3、分组时间内的失效数据。

4、分组时间的累计失效数。

这 4类数据可以相互转化。


测试过程中必须真实地进行记录,每个测试记录必须包含如下信息:

1、测试时间。

2、含有测试用例的测试说明或标识。

3、所有与测试有关的测试结果,包括失效数据。

4、测试人员。


测试活动结束后要编写《软件可靠性测试报告》具备如下内容:

1、软件产品标识。

2、测试环境配置(硬件和软件)。

3、测试依据。

4、测试结果。

5、测试问题。

6、测试时间。


13.3  软件可靠性评价

13.3.1  软件可靠性评价概述

估计软件当前的可靠性,以确认是否可以终止测试并发布软件,还可以预计软件要达到相应的可靠性水平所需要的时间和工作量,确认软件的执行与需求的一致性。


13.3.2  怎样选择可靠性模型

可以从以下几个方面进行比较和选择:

1、模型假设的适用性。

2、预测的能力与质量。

3、模型输出值能否满足可靠性评价需求。

最重要的几个需要精确估计的可靠性定量指标 包括如下内容:

1. 当前的可靠度。

2. 平均失效时间。

3. 故障密度。

4. 期望达到规定可靠性目标的日期。

5. 达到规定的可靠性目标的成本要求。

4、模型使用的简便性

简便性一般包含如下三层含义:

1. 模型需要的数据 易于收集,成本不能超过可靠性计划的预算。

2. 模型应该简单易懂,测试人员不会花费太多的时间去研究专业的数学理论。

3. 模型应该便于使用。


13.3.3  可靠性数据的收集

面向缺陷的可靠性测试 产生的测试数据经过分析后,可以得到非常有价值的可靠性数据,这部分数据取决于定义的运行剖面和选取的测试用例集。

可靠性数据的收集工作 是贯穿整个软件生命周期的。

可行的一些办法如下:

1、及早确定所采用的可靠性模型。

2、指定可实施性较强的可靠性数据收集计划,指定专人负责,按照统一的规范收集记录可靠性数据。

3、重视软件测试特别是可靠性测试产生的测试数据的整理和分析。

4、充分利用数据库来完成可靠性数据的存储和统计分析。


13.3.4  软件可靠性的评估和预测

1、判断是否达到了可靠性目标。

2、如未能达到,要再投入多少时间、多少人力、多少资金。

3、在软件系统投入实际运行 若干时间后,能否达到交付或部分交付用户使用的可靠性水平。


没有失效就无法估计可靠性。

要在模型之外运行一些统计技术和手段对可靠性数据进行分析,作为可靠性模型的补充、完善、修正。


辅助方法如下:

1、失效数据的图形分析方法。

1. 积累失效个数图形。

2. 单位时间段内的失效数的图形。

3. 失效间隔时间图形。


2、试探性数据分析技术(Exploratory Data Analysis,EDA)对可靠性分析有用的信息如下:

1. 循环相关。

2. 短期内失效数的急剧上升。

3. 失效数集中的时间段。


13.4  软件的可靠性设计与管理

13.4.1  软件可靠性设计

实践证明,保障软件可靠性 最有效、最经济、最重要的手段是 在软件设计阶段 采取措施进行可靠性控制。

1、软件可靠性设计是软件设计的一部分,必须在软件的总体设计框架中使用,并且不能与其他设计原则相冲突。

2、软件可靠性设计在满足提高软件质量要求的前提下,以提高和保障软件可靠性为最终目标。

3、软件可靠性设计应确定软件的可靠性目标,不能无限扩大化,排在功能度、用户需求、开发费用 之后考虑。


容错设计、检错设计、降低复杂度设计 等技术。


1、容错设计技术

1. 恢复块设计,一旦文本出现故障,用备份文本加以替换。

2. N版本程序设计,对于相同初始条件和相同输入的操作结果,实行多数表决,防止其中某一软件 模块/版本 的故障提供错误的服务。

必须注意以下两方面:

使软件的需求说明具有完整性和精确性。

设计全过程的不相关性。

3. 冗余设计

在相同的运行环境中,一套软件出故障的地方,另外一套也一定会出现故障。

在一套完整的软件系统之外,设计一种不同路径、不同算法或不同实现方法的模块或系统作为备份。

费用可能接近单个版本软件开发费用的两倍,还有可能导致软件运行时所花费的存储空间、内存消耗、运行时间 有所增加,需要在可靠性要求和额外付出代价之间做出折中。


2、检错技术

检错技术实现的代价一般低于容错技术和冗余技术,但它有一个明显的缺点,就是不能自动解决故障。

着重考虑几个要素:检测对象、检测延时、实现方式、处理方式。


3、降低复杂度设计

模块复杂性主要包含模块内部数据流向和程序长度两个方面,结构复杂性用不同模块之间的关联程度表示。

软件复杂性是产生软件缺陷的重要根源。

在设计师就应该考虑降低软件的复杂性,是提高软件可靠性的有效方法。

在保证实现软件功能的基础上,简化软件结构,缩短程序代码长度,优化软件数据流向,降低软件复杂度,从而提高软件可靠性。


13.4.2  软件可靠性管理

为了进一步提高软件可靠性,又提出软件可靠性管理的概念,把软件可靠性活动贯穿于软件开发的全过程。

各个阶段的可靠性活动的 目标、计划、进度、任务、修正措施 等。

由于软件之间的差异较大,下面的每项活动并不是每一个软件系统的可靠性管理的必须内容,也不是软件可靠性管理的全部内容。

列表略。

你可能感兴趣的:(学习笔记)