2软件可靠性理论基础 2.1软件失效机理 软件可靠工程的主要目标是保证和提高软件的可靠性。为达到这一目标,显然首 先要弄清软件为什么会出现失效。只有这样才可能在软件开发过程中减少导致软件失 效的隐患,且一旦出现软件失效,有可能采取有效措施加以消除。 2.1.1软件失效的特点 从可靠性角度来看,硬件与软件存在许多不同点,主要体现在以下四个方面: (1)复杂性 软件内部逻辑高度复杂。例如考虑一个由10至20条高级语言构成的程序B2,其 控制流程图如图2-1所示。其中每个结点或源泉代表一段可能以转移语句结束的顺序 执行语句,每条边或弧则表示两段程序间的控制转移。程序含有一个最少重复20次 的循环语句。假设程序中所有判断都是相互独立的(实际可能不是这样),由于有5 条贯穿循环体的路径,即c→d→e→f→h→m,c→d→e→f→i→m,那么从点A 到点B的所有独立路径数为520+59++5,即大约为1014或1016亿。如果考虑程序输 入数据的变化,那情况就更加复杂了。而硬件内部逻辑较为简单,这就在很大程度上 决定了设计错误是导致软件失效的主要原因,而导致硬件失效的可能性则很小。 (2)物理老化 软件不存在物理老化现象,硬件失效则主要由于物理老化所致。这就决定了软件 正确性和软件可靠性密切相关,一个正确的软件任何时刻均可靠。然而一个正确的硬 件元器件或系统则可能在某个时刻失效。 (3)唯一性 软件是唯一的,软件拷贝不改变软件本身,而任何两个硬件不可能绝对相同。这 就是为什么概率方法在硬件可靠领域取得巨大成功,而在软件可靠性领域不够令人满 意的原因。 12
12 2 软件可靠性理论基础 2.1 软件失效机理 软件可靠工程的主要目标是保证和提高软件的可靠性。为达到这一目标,显然首 先要弄清软件为什么会出现失效。只有这样才可能在软件开发过程中减少导致软件失 效的隐患,且一旦出现软件失效,有可能采取有效措施加以消除。 2.1.1 软件失效的特点 从可靠性角度来看,硬件与软件存在许多不同点,主要体现在以下四个方面: (1)复杂性 软件内部逻辑高度复杂。例如考虑一个由 10 至 20 条高级语言构成的程序[32],其 控制流程图如图 2-1 所示。其中每个结点或源泉代表一段可能以转移语句结束的顺序 执行语句,每条边或弧则表示两段程序间的控制转移。程序含有一个最少重复 20 次 的循环语句。假设程序中所有判断都是相互独立的(实际可能不是这样),由于有 5 条贯穿循环体的路径,即 c→ d→ e→ f→ h→ m,c→ d→ e→ f→ i→ m,那么从点 A 到点 B 的所有独立路径数为 520+519+…+51 ,即大约为 1014 或 1016 亿。如果考虑程序输 入数据的变化,那情况就更加复杂了。而硬件内部逻辑较为简单,这就在很大程度上 决定了设计错误是导致软件失效的主要原因,而导致硬件失效的可能性则很小。 (2)物理老化 软件不存在物理老化现象,硬件失效则主要由于物理老化所致。这就决定了软件 正确性和软件可靠性密切相关,一个正确的软件任何时刻均可靠。然而一个正确的硬 件元器件或系统则可能在某个时刻失效。 (3)唯一性 软件是唯一的,软件拷贝不改变软件本身,而任何两个硬件不可能绝对相同。这 就是为什么概率方法在硬件可靠领域取得巨大成功,而在软件可靠性领域不够令人满 意的原因
≥20次 B 图2-1一个简单程序的控制流程图 2.1.2软件失效的机理 软件可靠性研究的首要任务就是防止软件失效。由于软件内部逻辑复杂,运行环 境动态变化,且不同的软件差异可能很大,因而软件失效机理可能有不同的表现形式。 譬如有的失效过程比较简单,易于追踪分析,而有的失效过程可能非常复杂,难于甚 至不可能加以详尽描述和分析,尤其是运行于高度复杂实时环境中的大型软件。但总 的说来,软件失效机理可描述为:软件错误→软件缺陷→软件故障→软件失效。 (I)软件错误(Software error) 在可以预见的时期内,软件仍将由人来开发。在整个软件生存期的各个阶段,都 贯穿着人的直接或间接参与,人难免会犯错误,这样就必然给软件留下不良的痕迹。 例如,在求最大值的程序中,设计人员因疏忽将求得的最小值作为平均值,这就是一 个软件错误,又称人为错误,其结果就是导致缺陷的产生。 (2)软件缺陷(Software defect) 软件缺陷指代码中能引起一个或一个以上的失效的错误的编码,如少一个逗号、 多一个语句等等。软件缺陷是程序固有的,只要不修改程序去除已有的缺陷,缺陷就 会永远留在程序中。而软件缺陷在一定条件下暴露并导致系统在运行中出现可感知的 不正常、不正确、不按规范执行的状态,这时称软件缺陷被激活。 13
13 A c d e f hi jk l m B ≥ 20次 g 图 2-1 一个简单程序的控制流程图 2.1.2 软件失效的机理 软件可靠性研究的首要任务就是防止软件失效。由于软件内部逻辑复杂,运行环 境动态变化,且不同的软件差异可能很大,因而软件失效机理可能有不同的表现形式。 譬如有的失效过程比较简单,易于追踪分析,而有的失效过程可能非常复杂,难于甚 至不可能加以详尽描述和分析,尤其是运行于高度复杂实时环境中的大型软件。但总 的说来,软件失效机理可描述为:软件错误→软件缺陷→软件故障→软件失效。 (1)软件错误(Software error) 在可以预见的时期内,软件仍将由人来开发。在整个软件生存期的各个阶段,都 贯穿着人的直接或间接参与,人难免会犯错误,这样就必然给软件留下不良的痕迹。 例如,在求最大值的程序中,设计人员因疏忽将求得的最小值作为平均值,这就是一 个软件错误,又称人为错误,其结果就是导致缺陷的产生。 (2)软件缺陷(Software defect) 软件缺陷指代码中能引起一个或一个以上的失效的错误的编码,如少一个逗号、 多一个语句等等。软件缺陷是程序固有的,只要不修改程序去除已有的缺陷,缺陷就 会永远留在程序中。而软件缺陷在一定条件下暴露并导致系统在运行中出现可感知的 不正常、不正确、不按规范执行的状态,这时称软件缺陷被激活
(3)软件故障(Software fault) 在软件执行过程中,缺陷在一定的条件下导致软件出现错误的状态,这种错误的 状态如果未被屏蔽(即没有容错机制)则会发生软件失效。在许多英文文献]中,有 的将这种错误的状态成为fault,有的称为error,.本文将其称为软件故障。 (4)软件失效(Software failure) 软件失效是指程序的运行偏离了需求,是动态运行的结果,软件执行遇到软件中 的缺陷时可能会导致软件的失效。在对软件故障不作任何纠正和恢复的情况下,导致 系统的输出不符合提供的正式文件上指明的要求或双方协议的条款,称为软件的一次 失效。 综上所述,人为错误必定会产生一个或多个软件缺陷。当一个软件缺陷被激活时, 便产生一个软件故障。同一个软件缺陷在不同条件下被激活,可能产生不同的软件故 障。软件故障若没有及时的容错措施加以处理,便不可避免地导致软件失效。同一个 软件故障在不同条件下可能产生不同的软件失效。 由于本文讨论的是对失效的度量,不涉及容错问题,因此后文的分析计算都只围 绕软件失效展开。 2.2软件可靠性的基本概念 2.2.1软件可靠性 软件可靠性是软件质量的关键因素,它表明了程序按照设计的目标,执行其功能 的正确程度。1983年美国IEEE计算机学会软件工程技术委员会将其定义为B4: (1)在规定的条件下,在规定的时间内,软件不引起系统失效的概率。该概率是 系统输入和系统使用的函数,也是软件中存在的失效的函数。 (2)在规定的时间周期内,在所述条件下,程序执行要求的功能的能力。 在软件可靠性定义中,规定的条件是指软件运行的软、硬件环境:软件环境包括 运行的操作系统、应用程序、编译系统、数据库系统等:硬件环境包括计算机的CPU、 高速缓存区、内存、I/O等。不严格地说,软件运行剖面是指软件运行的输入空间及其 概率分布。软件的输入空间是指软件所有可能的输入值构成的空间。按照欧空局标准 14
14 (3)软件故障(Software fault) 在软件执行过程中,缺陷在一定的条件下导致软件出现错误的状态,这种错误的 状态如果未被屏蔽(即没有容错机制)则会发生软件失效。在许多英文文献[33]中,有 的将这种错误的状态成为fault,有的称为error,本文将其称为软件故障。 (4)软件失效(Software failure) 软件失效是指程序的运行偏离了需求,是动态运行的结果,软件执行遇到软件中 的缺陷时可能会导致软件的失效。在对软件故障不作任何纠正和恢复的情况下,导致 系统的输出不符合提供的正式文件上指明的要求或双方协议的条款,称为软件的一次 失效。 综上所述,人为错误必定会产生一个或多个软件缺陷。当一个软件缺陷被激活时, 便产生一个软件故障。同一个软件缺陷在不同条件下被激活,可能产生不同的软件故 障。软件故障若没有及时的容错措施加以处理,便不可避免地导致软件失效。同一个 软件故障在不同条件下可能产生不同的软件失效。 由于本文讨论的是对失效的度量,不涉及容错问题,因此后文的分析计算都只围 绕软件失效展开。 2.2 软件可靠性的基本概念 2.2.1 软件可靠性 软件可靠性是软件质量的关键因素,它表明了程序按照设计的目标,执行其功能 的正确程度。1983 年美国 IEEE 计算机学会软件工程技术委员会将其定义为[34]: (1)在规定的条件下,在规定的时间内,软件不引起系统失效的概率。该概率是 系统输入和系统使用的函数,也是软件中存在的失效的函数。 (2)在规定的时间周期内,在所述条件下,程序执行要求的功能的能力。 在软件可靠性定义中,规定的条件是指软件运行的软、硬件环境:软件环境包括 运行的操作系统、应用程序、编译系统、数据库系统等;硬件环境包括计算机的CPU、 高速缓存区、内存、I/O等。不严格地说,软件运行剖面是指软件运行的输入空间及其 概率分布。软件的输入空间是指软件所有可能的输入值构成的空间。按照欧空局标准
的定义,软件的运行剖面是指“对系统使用条件的定义。即系统的输入值用其按时间 的分布或按它们在可能输入范围内的出现概率的分布来定义”B)。规定的时间一般可 分为执行时间、日历时间和时钟时间。执行时间(execution time)是指执行一个程序所 用的实际时间或中央处理器时间;或者是程序处于执行过程中的一段时间。日历时间 (calendar time)指的是编年时间,包括计算机可能未运行的时间。时钟时间(clock time) 是指从程序执行开始到程序执行完毕所经过的钟表时间。 2.2.2软件可靠性度量 尽管软件可靠性问题十分重要,软件失效后果可能是灾难性的,但是要从数学上 严格证明一个软件正确几乎是不可能的。事实上,有几个曾被“证明”为正确的软件, 事后发现它们仍然含有缺陷。那么,一个软件是否可靠,在多大程度上可靠,或者 是否已经达到所需要的可靠程度,能否达到所需要的可靠程度,所有这些问题均须用 可靠性度量表示。一个产品如果无法度量,便无法控制。需要软件可靠性度量的根本 原因在于需要保证和提高软件可靠性。有了软件可靠性度量,我们至少可以在开发费 用、开发进度、可靠及其它系统参数之间作权衡:进行可靠性管理;监督测试过程并 预测测试完成期限;进行可靠性验证:从可靠性角度评估各种软件工程技术:比较不 同软件的可靠性水平;借助于软件可靠性模型,理解软件可靠性行为。 软件可靠性度量是软件可靠性工程的重要工作,它贯穿于软件生存周期的各个阶 段。在需求阶段,软件可靠性工程的主要工作是进行可靠性需求分析,从而提出软件 可靠性的定性、定量要求,定量要求包括确定可靠性度量参数及其量值要求(即指标): 设计、编码阶段的可靠性度量工作主要是进行早期可靠性预计,目的是找出设计、编 码过程的潜在问题,改进开发过程,保证早期开发中的软件的可靠性;在测试阶段, 随着测试工作的进行,可以不断积累、收集失效数据,根据失效数据可以直接对软件 的可靠性进行评估,以决定是否交付软件;在软件使用、维护阶段,通过收集使用中 的失效数据,可以估计软件的使用可靠性,确认是否达到要求,如果使用中发现了问 题并不断地加以改正,同样还可以根据失效数据进行可靠性增长预计。各阶段与可靠 性度量有关的工作如表2.1所示。 15
15 的定义,软件的运行剖面是指“对系统使用条件的定义。即系统的输入值用其按时间 的分布或按它们在可能输入范围内的出现概率的分布来定义”[35]。规定的时间一般可 分为执行时间、日历时间和时钟时间。执行时间(execution time)是指执行一个程序所 用的实际时间或中央处理器时间;或者是程序处于执行过程中的一段时间。日历时间 (calendar time)指的是编年时间,包括计算机可能未运行的时间。时钟时间(clock time) 是指从程序执行开始到程序执行完毕所经过的钟表时间。 2.2.2 软件可靠性度量 尽管软件可靠性问题十分重要,软件失效后果可能是灾难性的,但是要从数学上 严格证明一个软件正确几乎是不可能的。事实上,有几个曾被“证明”为正确的软件, 事后发现它们仍然含有缺陷[7]。那么,一个软件是否可靠,在多大程度上可靠,或者 是否已经达到所需要的可靠程度,能否达到所需要的可靠程度,所有这些问题均须用 可靠性度量表示。一个产品如果无法度量,便无法控制。需要软件可靠性度量的根本 原因在于需要保证和提高软件可靠性。有了软件可靠性度量,我们至少可以在开发费 用、开发进度、可靠及其它系统参数之间作权衡;进行可靠性管理;监督测试过程并 预测测试完成期限;进行可靠性验证;从可靠性角度评估各种软件工程技术;比较不 同软件的可靠性水平;借助于软件可靠性模型,理解软件可靠性行为。 软件可靠性度量是软件可靠性工程的重要工作,它贯穿于软件生存周期的各个阶 段。在需求阶段,软件可靠性工程的主要工作是进行可靠性需求分析,从而提出软件 可靠性的定性、定量要求,定量要求包括确定可靠性度量参数及其量值要求(即指标); 设计、编码阶段的可靠性度量工作主要是进行早期可靠性预计,目的是找出设计、编 码过程的潜在问题,改进开发过程,保证早期开发中的软件的可靠性;在测试阶段, 随着测试工作的进行,可以不断积累、收集失效数据,根据失效数据可以直接对软件 的可靠性进行评估,以决定是否交付软件;在软件使用、维护阶段,通过收集使用中 的失效数据,可以估计软件的使用可靠性,确认是否达到要求,如果使用中发现了问 题并不断地加以改正,同样还可以根据失效数据进行可靠性增长预计。各阶段与可靠 性度量有关的工作如表 2.1 所示
表2.1生存周期各阶段的软件可靠性度量工作 生存周期的阶段 主要的可靠性度量工作 需求分析阶段 选取软件可靠性参数、确定指标 设计阶段 收集数据、进行早期可靠性预计 编码阶段 测试阶段 收集测试中的失效数据,进行软件可靠性评估 使用、维护阶段 收集使用中的失效数据,进行软件可靠性可靠性评估 本文主要涉及需求分析阶段的软件可靠性参数的选取及指标的确定,测试阶段的 软件可靠评估。使用、维护阶段的软件可靠性评估与测试阶段相似,不再详细介绍。 软件可靠性评估是对失效建模和成功估计概率理论的应用。在实际应用中,研究 者们更为关心的是可以直接表征软件可靠性的指标参数。软件可靠性指标是定量评估 软件可靠性的依据。 常用可靠性指标的物理意义: (1)可靠度R():表示[0,t]时间内软件不发生失效的概率,其取值范围是 R(t)=P{T≥,0≤R(t)≤1 (2)失效率Z):指在1时刻尚未发生失效的条件下,在1时刻后,单位时间内发 生失效的概率。即:设为发生失效的时间,Z为失效率,则有 Z(t)=lim P{t<5<1+△|5> △i P{t<5<t+△ lim w0P{5>t}△1 1 dR R(t)dt 1 f(t) R(t) (3)失效强度:假设软件在1时刻发生的失效数为N(),显然N()是一个随机数, 且随时间1的变化而不同。设m(t)为随机变量N()的均值,即有 16
16 表 2.1 生存周期各阶段的软件可靠性度量工作 生存周期的阶段 主要的可靠性度量工作 需求分析阶段 选取软件可靠性参数、确定指标 设计阶段 编码阶段 收集数据、进行早期可靠性预计 测试阶段 收集测试中的失效数据,进行软件可靠性评估 使用、维护阶段 收集使用中的失效数据,进行软件可靠性可靠性评估 本文主要涉及需求分析阶段的软件可靠性参数的选取及指标的确定,测试阶段的 软件可靠评估。使用、维护阶段的软件可靠性评估与测试阶段相似,不再详细介绍。 软件可靠性评估是对失效建模和成功估计概率理论的应用。在实际应用中,研究 者们更为关心的是可以直接表征软件可靠性的指标参数。软件可靠性指标是定量评估 软件可靠性的依据。 常用可靠性指标的物理意义: (1)可靠度 R( )t :表示[0, ]t 时间内软件不发生失效的概率,其取值范围是 Rt P T t Rt ( ) ,0 ( ) 1 = { ≥≤≤ } (2)失效率Z( )t :指在t 时刻尚未发生失效的条件下,在 t 时刻后,单位时间内发 生失效的概率。即:设ξ为发生失效的时间,Z 为失效率,则有 { } { } { } 0 0 | ( ) lim lim 1 ( ) 1 ( ) ( ) t t Pt t t t Z t t Pt t t P tt dR R t dt f t R t ξ ξ ξ ξ ∆ → ∆ → < < +∆ > = ∆ < < +∆ = > ⋅∆ =− ⋅ = ⋅ (3)失效强度:假设软件在t 时刻发生的失效数为 N t( ) ,显然 N t( ) 是一个随机数, 且随时间t 的变化而不同。设m t( ) 为随机变量 N t( ) 的均值,即有