第六章软件容错技术—软件冗余软件容错技术概述软件可靠性的基本概念软件避错技术软件容错技术软件N版本设计技术软件恢复技术软件可靠性模型概述软件危机的产生软件老化问题软件可靠性技术的兴起软件危机1962年,“水手1号”因其机舱计算机导航程序差错未能到达进行,这是早期人类从软件差错中得到的重大教训20世纪60年代后期,计算机用户首先意识到了软件危机:软件产品迟迟不能交付、软件质量低劣、维护代价高昂;软件开发人员感到力不从心,对软件的正确性缺乏信心;高软件需求和低生产效率导致软件费用急剧上涨1998年的软件工程NATO会议上,科学界和实业界终于一致承认了软件危机的存在软件故障的根源软件错误导致产生含有缺陷的软件的人为行动(国标GB/T11457-1995)软件误差存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差人为操作失误软件运行过程中的非法输入软件老化(Softwareaging)软件老化是指软件系统运行速度的降低,或者是由于操作系统资源的耗尽、碎片以及错误的积累导致的程序突然崩溃主要是由于软件系统资源的损耗因其的,原因包括内存泄露、未释放的文件操作符、数字舍入错误、操作环境的数据损坏等软件的缺陷等因素都会导致软件老化现象的产生,有效地方式是主动式容错策略,比如软件再生技术软件再生技术:定期主动停止运行程序,清理程序的内部环境,清除积累错误,然后重新启动软件使之进入一个正常的初始状态,从而避免因软件老化引起的突发性失效,提高软件系统的可靠性和可用性软件可靠性的兴起管理技术程序设计方法学验证技术管理技术软件行业管理包括有关软件的政策、法律和标准化等问题项目管理针对一个具体软件开发项目进行过程包括:制定开发目标和验收标准,以及阶段目标。根据软件生存周期(要求、说明、设计、实现、验证、运行和维护),在每一阶段具有标准文件,通过对文件的管理控制项目的管理组织管理通过合理分配项目成员的工作,使每个成员能动性充分发挥并使乘员减达到良好的协调组织管理主程序员负责制主程序员负责指挥整个项目开发组。主程序员负责设计任务和关键代码、对外交流等。后备主程序员,负责备选方案。同时参与计划、设计、编码和测试等工作其他成员是编程人员,负责管理程序库、文件、测试数据和测试结果实践表明,主程序员负责制是生产高可靠软件产品的合理体制编程秘书制集体编程制软件可靠性的兴起管理技术程序设计方法学包括结构程序设计、程序综合、程序推导、函数程序设计、递归程序设计以及有关的形式说明和程序变换技术这些技术是程序具有易于理解和验证的良好结构,但以运行效率为代价为此,可以先设计一个良好结构的程序作为理解和验证的文本,然后用程序变换技术把它变换成一个高效运行的程序,最后运行验证技术软件可靠性的兴起管理技术程序设计方法学验证技术程序测试:以发现差错为目的的过程,通过对被测试的结构分析(静态测试)或实际运行(动态测试)来实现程序正确性证明:在不考虑程序运行环境条件下的确认程序正确性。方法包括Floyd-Manner的不变式推理方法、MchMarchy的递归归纳法、Horare的公理化方法和Dijkstra的弱谓词变换方法软件容错技术概述软件可靠性的基本概念软件避错技术软件容错技术软件N版本设计技术软件恢复技术软件可靠性模型软件可靠性的基本概念一.软件可靠性二.主要指标三.软件故障、失效和错误一.软件可靠性1983年,IEEE对出如下定义:①在规定的条件下,在规定的时间内,软件不引起系统失效的概率②在规定的时间周期内,在所述条件下程序执行所要求的功能的能力经美国标准化研究所批准作为美国的国家标准1989年我国国标GB/T-11457采用了这个定义几个概念正确性软件系统本身没有故障,并能证明它完全符合要求健壮性在硬件发生故障或输入不正常或环境发生异常情况等条件下,软件仍能进行适当工作可靠性第一节软件可靠性的基本概念一.软件可靠性二.主要指标三.软件故障、失效和错误二.主要指标1.软件可靠度函数R(t)2.软件失效分布函数F(t)对于一个系统,如果只考虑系统成功与失败tetR)(0)0(1)()(FtFtR二.主要指标3.失效密度函数f(t)系统在t时刻单位时间内的失效概率二.主要指标4.软件失效率函数取一个不太长的时间t,可以假设)(ttetR)()()(常数t)(t软件和硬件的比较)(t软件失效率第一节软件可靠性的基本概念一.软件可靠性二.主要指标三.软件故障、失效和错误三.软件故障、失效和错误故障(fault):软件的内在缺陷称为故障,可能在软件生存期的各个阶段产生错误(error):故障所造成的后果,亦即导致运行中出现的异常状态失效(failure):错误造成系统的输出不满足最初对软件的要求和说明软件故障的性质对人的依赖性固有性对环境的敏感性传播性软件可靠性技术的架构软件容错技术概述软件可靠性的基本概念软件避错技术软件容错技术软件N版本设计技术软件恢复技术软件可靠性模型软件避错技术形式说明可靠性程序设计的基本技术程序验证技术软件避错技术-形式说明软件开发的目标是要把问题用一种严格的、数据化或逻辑化的语言把问题描述出来,得到问题的形式说明形式说明是程序设计和验证的基础分类:描述问题功能性质的说明,通常把问题描述成一个函数,问题的输入对应于函数的参数,输出则对应于函数的值描述问题逻辑性质的说明,通常把问题描述成一个过程、流程图或方框图功能说明功能说明有限制输入取值范围的输入说明和规定输出结果的输出说明组成例:求自然数的阶乘Functionf(n:Integer,n=0):Integer;f:=n!;Return;逻辑说明对有些问题,给出问题的逻辑描述更容易,或者给出逻辑描述后,换换成程序更容易,在此情况下需要给出问题的逻辑说明例计算一个整数集合中大与整数a的元素个数可靠程序设计的基本技术程序综合技术首先把形式说明变为解的存在性定理,容纳后寻找这个存在性定理的构造型证明,最后把证明过程转换为程序递归程序设计技术软件结构化设计技术))!)((0:)((nffnIntegernn递归程序设计技术步骤1、定义参数上的一个良序集合,以便程序一定能中止2、对参数进行适当的分析,其中必须包括一种易于计算的特殊情形作为结束条件(非递归分支)3、计算出特殊情况下的函数值4、找出一般情况下函数值与具有较小参数的函数值之间的等式关系,得到递归分支5、把所有分支用条件表达式综合为一个程序软件结构化设计技术结构化设计存在于软件生存期的说明、设计和实现阶段设计阶段的数据流设计设计阶段的数据结构设计技术实现阶段的结构化程序设计技术数据流设计1974年作为软件系统设计的自顶向下方法有Constantine提出,突出了模块化的设计思想,力图在软件设计的开始就把所设计的系统划分为若干相互独立的模块,使每个模块要完成的任务明确而单纯,达到程序设计简单、易于理解、调试和修改的目的数据流设计以加强模块的独立性为基础,要求模块间的联系尽可能弱,信息和数据交流尽可能少,模块内部联系尽可能强,信息和数据交流尽可能多,几所谓的弱耦合性和强内聚性设计为获得耦合性弱和内聚性强的模块划分,需要按层次来组织模块,顶层模块负责主要功能变换,顶层模块下属输入、输出和变换模块。当需要输入数据时,顶层模块调用其下属输入模块,。。。,之所以需要经过模块传递和变换输入、输出信息,是为了保证设计的弱耦合性和强内聚性数据结构设计数据结构设计方法由Jackson提出,这种方法试图把描述问题的数据结构映射为程序结构,因为形式说明中的数据结构通常是定义明确的,所以,从同样的形式说明出发,用此方法可以得到类似的程序结构结构化程序设计结构:顺序型、条件选择型和循环型结构定理:任何一个适当程序在功能上等价于一个结构化程序,而且,这个结构化程序可以使用原来程序中的函数、谓词以及赋值语句、条件测试语句定理中的适当程序满足:具有一个入口和一个出口对于程序中的每一条语句都存在一个合法输入,使得程序控制流从输入出发经过这个语句然后达到输出结构化程序的实质是取消转移语句goto软件避错技术形式说明可靠性程序设计的基本技术程序验证技术程序验证技术可靠程序设计技术可以减少软件故障的发生,但像任何设计过程一样,不能避免设计故障的发生。程序验证技术通过检查程序与其说明的符合性来发现故障、消除故障,从而提高软件可靠性程序验证技术程序正确性证明程序的自动证明技术程序测试技术程序正确性证明证明定理:用满足输入说明的任一输入执行程序,程序将输出满足输出说明的结果并且终止。程序正确性证明可以分为两个独立的证明:部分正确性证明,即证明如果程序能终止,对于任意合法输入,程序给出正确输出终止性证明,即证明对于任意合法输入,程序能够终止程序的自动证明技术程序的正确性证明可以用机械步骤自动完成。即通过给机器提供推理规则,机器能自动完成部分正确性证明困难中间断言的自动生成很困难,致使生成程序变得很复杂如何确认证明程序的正确性?引为证明程序往往比被证明程序复杂得多程序正确性证明技术以严格的数学分析和逻辑推理为基础,经过证明能保证程序设计的正确性。但这种方法难度大,复杂性高尔未能投入实际使用程序测试技术对常见的故障模型进行测试,尽管通过测试的程序不能保证程序的正确性,甚至也不能保证把程序的故障率或故障数控制在一个规定的量级之下,然而,由于程序测试技术的可行性和令人满意的实践结果,使它得到广泛的应用程序测试技术测试方法:根据测试中被测程序是否在输入数据驱动下实际运行,可以把测试分为静态测试和动态测试静态测试:检查程序的语法是否正确、程序结构是否合格(从输入不可到达的语句、不能到达输出的语句、不经入口转入循环体或过程体等都是不合适的结构),是否所有变量都赋了初值或者是否有说明而没有使用的变量动态测试:在输入数据驱动下对程序进行实际运行,然后通过输出响应分析确定程序运行中是否发生了差错动态测试可以按非增式的方法进行,即先测每个模块,再测由若干个模块组成的子系统,最后测整个程序系统。在测试模块或子系统时,对其中的全局变量需要构造一个虚拟的测试背景(对变量赋初值或返回值)。模块测试应尽可能完全,保证模块处理的各种输入都被测到。子系统测试要求检查模块间的借口操作,包括数据接口、控制接口等。子系统的测试还要经过多级测试系统测试要涉及到整个程序的接口、数据流、控制流、数据结构、程序结构等问题动态测试非增式测试的缺点每个模块和子系统都要求建立测试背景子系统的组合数较大,使测试复杂性高动态测试增式测试:被测程序是按层次结构方法组织的,则可以按自顶向下的增式测试方法,即先顶层测试,然后依次加入底层的模块测试系统级测试次数减少首先测试和反复测试顶层模块式主要功能模块得到最完全测试高层模块自动为底层模块提供了部分测试背景当发现差错时,故障被局限在新加入的模块内或新加入模块与已测模块的接口上动态测试测试数据生成:无法进行穷举法,常用随机测试方法确定测试目标包括测试数据是所有输入测试数据使程序中每条通路至少执行一遍测试数据使程序中每条分支至少执行一遍测试数据使程序中每个语句至少执行一遍测试数据生成方法程序测试技术自动测试工具自动测试工具是一个综合的自动测试系统,它能够分析程序结构,检查出某些类型的差错并指出可能发生的差错,同时,它能够生成测试数据、驱动被测程序运行,并分析测试响应、输出整理成文的测试结果SADAT的结构软件容错技术概述软件可靠性的基本概念软件避错技术软件容错技术软件N版本设计技术软件恢复技术软件可靠性模型第二节软件N版本设计技术一.N版本的设计方法二.N版本容错系统的组成三.N版本的管理程序一.N版本的设计方法所谓NVP,就是针对同一任务,采用N(N=