1.1软件可靠性的定义★★★
软件可靠性是指在规定的时间内,软件不引起系统失效的概率。该概率是系统输入和系统使用的函数,也是软件中存在的缺陷函数;系统输入将确定是否会遇到已存在的缺陷。
该定义的三个特点
- 用内在的"缺陷"和外在的"失效"关系来描述可靠性,更能深刻地体现软件的本质特点。
- 定义使人们对软件可靠性进行量化评估成为可能。
- 用概率的方法去描述可靠性是比较科学的。
1.2软件可靠性的定量描述★★★
考点
规定时间的三种形式,执行时间最适合度量软件的可靠性。
| 指标 |
定义 |
| 规定时间 |
分为三种:① 自然时间;② 运行时间;③ 执行时间。其中执行时间最适合度量软件的可靠性。 |
| 失效概率 |
软件从运行开始算起,运行到某一时间 t,出现失效的概率是一个随机函数,称为失效概率。 |
| 可靠度 |
软件在规定条件下、规定时间内不失效的概率。 |
| 失效强度 |
单位时间内软件失效的概率。 |
| 失效率 |
也称风险函数或条件失效强度,在运行系统未出现失效的情况下,单位时间软件系统出现失效的概率。 |
| 平均无失效时间 |
软件运行后,到下一次失效的平均时间。更直观地反映软件的可靠度。 |
1.3可靠性的目标
概念
软件可靠性是指用户对所使用的软件的性能满意程度的期望。可以用 可靠度、平均失效时间 和 故障强度 等来描述。
1.4可靠性测试的意义和目的
测试的意义(五点)
- 软件失效可能造成灾难性的后果。
- 软件的失效在整个计算机系统失效中的比例较高。
- 相比硬件可靠性技术,软件可靠性技术不成熟。
- 软件可靠性问题会造成软件费用增长。
- 系统对软件的依赖性强,对生产活动和社会生活影响日益增大。
测试的目的(三点)
- 发现软件系统的缺陷。
- 为软件的使用和维护提供可靠性依据。
- 确认软件是否达到可靠性的定量要求。
1.5广义的可靠性测试 vs 狭义的可靠性测试★
| 分类 |
定义 |
| 广义 |
为了最终评价软件系统的可靠性而运用建模、统计、试验、分析和评价等一系列手段对软件系统实施的一种测试。 |
| 狭义 |
为了获取可靠性数据,按预先确定好的测试用例,在软件预期使用环境中,对软件实施的一种测试。 |
2.1影响可靠性的因素
软件可靠性的影响因素主要来自以下几个方面:
- 运行剖面(使用方式):软件的输入分布和使用强度直接决定缺陷被触发的频率。
- 软件规模与复杂度:规模越大、复杂度越高,潜在缺陷越多。
- 软件内部结构:模块化程度、耦合度、内聚度等结构特征。
- 软件开发方法和开发环境:开发过程的规范程度、工具支持。
- 软件的可靠性投入:人力、时间、可靠性技术的投入程度。
2.2软件可靠性模型的组成与特性
模型的组成要素
- 模型假设:模型对软件运行环境、开发环境、使用方式所做的假设。
- 性能度量:可靠性模型的输出量,如可靠度、失效强度、剩余缺陷数等。
- 参数估计方法:确定模型参数取值的方法(最大似然估计、最小二乘估计等)。
- 数据要求:模型需要收集哪些类型的失效数据作为输入。
模型应具备的特性
- 预测能力:能基于历史数据对未来可靠性进行预测。
- 简洁性:模型假设和计算尽量简单清晰。
- 适用性:模型应当能够适配不同类型的软件项目。
- 有效性:模型给出的结果应当贴近真实情况。
2.3软件可靠性建模方法
- 确定预测的目标,明确要度量的可靠性指标。
- 选择适合该项目特征的可靠性模型。
- 收集可靠性数据(失效数据、运行剖面等)。
- 使用收集的数据估计模型参数。
- 用估计出来的模型进行可靠性度量与预测。
软件可靠性管理贯穿软件生命周期的六个阶段:
01
需求分析阶段
确定可靠性目标,识别关键功能,进行可靠性需求规约。
02
概要设计阶段
进行可靠性分配,制定容错策略,确定可靠性设计原则。
03
详细设计阶段
详细设计容错、检错、降低复杂度等可靠性设计手段。
04
编码阶段
遵循可靠性编程规范,进行代码审查,使用静态分析工具。
05
测试阶段
实施可靠性测试,收集失效数据,进行可靠性度量与预测。
06
实施阶段
监控运行数据,持续评估可靠性,根据需要进行可靠性维护。
记忆要点: 需求 → 概要 → 详细 → 编码 → 测试 → 实施。每一阶段都有可靠性活动,越早投入收益越大。
4.1容错设计技术★★
容错的核心思想:当软件出现错误时,系统仍能继续运行。常见的四种容错技术:
| 技术 |
核心思想 |
| 恢复块设计 |
选择一组操作作为容错设计单元,把单一的操作变成"主块 + 验证测试 + 后备块"结构,主块失败时切换到后备块。 |
| N 版本程序设计 |
由 N 个独立小组开发功能相同的 N 个软件版本,运行时并行执行并表决,少数服从多数。 |
| 冗余设计 |
通过硬件冗余、信息冗余、时间冗余等方式,对关键模块做备份,避免单点失效。 |
| 防错性程序设计 |
在程序中包含错误检查代码,对输入、输出、中间状态进行校验,避免错误传播。 |
4.2检错技术
容错设计成本高,对可靠性要求不太高的部分可采用检错技术。检错设计需考虑四个要素:
- 检测对象:明确检测哪些错误。
- 检测延时:错误发生到被检出的时间间隔。
- 实现方式:在哪一层(语句、函数、模块)实施检测。
- 处理方式:检出错误后如何处置(报告、终止、回退)。
4.3降低复杂度设计
原则
软件的复杂度越高,可靠性越低。在保证软件实现功能的前提下,应尽可能简化软件结构。
常用手段:
- 简化模块间的接口和数据流。
- 采用结构化、模块化设计,降低耦合、提高内聚。
- 减少不必要的功能堆叠和过度设计。
4.4系统配置技术
通过系统层面的配置策略提高可靠性,常见手段:
- 双机热备份:主备机同时运行,主机故障自动切换到备机。
- 服务器集群:多台服务器协同工作,单点故障不影响整体服务。
- 负载均衡:合理分配请求,避免单节点过载导致失效。
5.1软件可靠性测试概述
软件可靠性测试与一般功能测试不同,重点在于按照真实使用模式进行测试,并从测试中获取可靠性度量数据。包含四个主要步骤:
- 定义软件运行剖面。
- 设计可靠性测试用例。
- 实施可靠性测试。
- 评估软件可靠性。
5.2定义软件运行剖面★★
概念
运行剖面(Operational Profile):对软件系统使用条件的定量描述,即软件输入空间的概率分布。
运行剖面定义包含:
- 确定系统的客户类型。
- 确定用户类型。
- 确定系统模式。
- 确定功能剖面。
- 确定运行剖面。
5.3软件可靠性测试用例设计
可靠性测试用例的设计应当:
- 根据运行剖面生成测试用例,使测试输入分布与实际使用分布一致。
- 覆盖软件的关键功能和高风险场景。
- 包含边界、异常、错误恢复等特殊情况的测试。
- 每个测试用例都应能独立判定成功或失败,便于失效数据的统计。
5.4软件可靠性测试的实施
- 制定测试计划:明确测试目标、范围、资源安排、进度等。
- 准备测试环境:搭建与实际运行环境一致的测试环境。
- 执行测试用例:按运行剖面分布执行测试。
- 记录测试结果:详细记录失效现象、失效时间、失效模式。
- 缺陷分析与修复:定位失效原因并修复,跟踪验证。
6.1软件可靠性评价概念
概念
软件可靠性评价是运用统计方法对软件可靠性测试和软件运行获取的数据进行处理,并评价软件可靠性的过程。
评价的四个主要步骤:
- 选择可靠性模型。
- 收集可靠性数据。
- 可靠性评估和预测。
- 验证评估结果。
6.2如何选择可靠性模型★
选择模型时考虑的因素:
- 模型假设:模型假设是否与实际项目相符。
- 预测能力与质量:模型的历史预测精度。
- 输出值的能力:模型能否输出所需的可靠性指标。
- 使用的简便性:参数估计、数据收集是否可行。
6.3可靠性数据的收集
数据收集是可靠性评价的基础,应注意:
- 制定数据收集计划,明确收集内容、责任、时机、方法。
- 记录失效数据:失效时间、失效模式、严重等级、修复情况。
- 记录运行数据:运行时长、执行场景、运行剖面相关数据。
- 数据要保证准确性、完整性、可追溯性。
6.4软件可靠性的评估和预测
常见的可靠性度量指标包括:
- 可靠度 R(t):规定条件下规定时间内不失效的概率。
- 失效强度 λ(t):单位时间内的失效次数期望。
- MTBF(平均失效间隔时间):相邻两次失效之间的平均时间。
- 剩余缺陷数:尚未发现的缺陷数量估计。
论文方向提示
论文题中常考:① 论软件可靠性设计(容错、检错、降低复杂度、系统配置);② 论软件可靠性测试(运行剖面、测试用例设计);③ 论软件可靠性评价(模型选择、数据收集、评估预测)。答题套路:背景 → 项目简介 → 具体技术应用 → 实施效果。
| 考点 |
题型 |
速记 |
| 可靠性定义 |
单选 |
规定时间内不失效的概率;缺陷 → 失效;可量化 |
| 规定时间 |
单选 |
自然时间、运行时间、执行时间(最适合度量) |
| 失效率 |
单选 |
= 风险函数 = 条件失效强度 |
| MTBF |
单选 |
平均无失效时间,最直观反映可靠度 |
| 广义 vs 狭义测试 |
单选 |
广义:评价为目的;狭义:获取数据为目的 |
| 容错四技术 |
论文 |
恢复块、N 版本、冗余设计、防错性程序设计 |
| 运行剖面 |
论文 |
输入空间的概率分布,是可靠性测试的核心 |
| 管理六阶段 |
论文 |
需求 → 概要 → 详细 → 编码 → 测试 → 实施 |