关于软件容错设计,高手必进!!!! (100分)

  • 主题发起人 lsgd1688
  • 开始时间
to dop:
首先感谢你花费时间和精力来关注并解决我的这个问题,并进行了很精彩的论述!
真心感谢。
不过你的方案不适合我,因为我这个系统必须是单机的(成本和惯例限制),怪
我没有事先交待。还是真心感谢你!致敬!
to sunshine_zk:
我先看看资料,谢谢你

请大家继续发言,谢谢
 
贴一些资料上来:http://www.chinakong.net/asp/artical/list.asp?owner=3&Curpage=3
容错技术在控制系统软件中的应用

梁立勇(河北科技大学) 刁哲军 艾树峰(河北师范大学电子系)

摘 要:针对控制系统对软件的可靠性的要求,论述了在控制软件设计中几种常用的容错方法。

关键词:容错;冗余;控制系统

实时控制系统要求连续运行,不允许故障停机,也不允许因程序错误而产生错误的控制输出。这就要求系统的可靠性。提高系统可靠性的方法有排错设计和容错设计。排错设计,是指在系统设计时努力消除各种干扰将错误、故障排除在外,使系统失效的概率减少到最小。但排错技术不能将干扰完全解决。而容错就是允许系统发生故障,借助于冗余技术而使其自动抵消,在故障存在的情况下也能使系统正常运行。容错设计采用的是投入超常规设计所需的资源即附加资源来换取常规设计所不能达到的高可靠性。这些附加资源有硬件、软件、时间以及它们的组合等等。这也就是冗余技术。

一、下面介绍一下常用的几种软件容错方法

1、时间冗余

在程序的适当位置设置若干检查点,在每一个检查点保存程序在该检查点之前正确运行而得到的全部信息及标志。如果故障是暂时性的则程序卷回到上一检查点开始重新执行,这样可以完全消除错误。它只能检出而不能消除永久性故障。
  正确设置检查点非常重要,设置过多会使计算和检查点信息处理时间增加,设置太少又会使程序卷回太长。此外,对于实时控制系统中只允许执行一次的特殊过程不可重复。例如某些涉及输入、输出的操作。如图1所示。



图1 卷回操作程序框图

2、N版本程序设计

从形式上看,N版本设计与N冗余的容错方式类似
  三模冗余(TMR)是最常见的硬件冗余方法,最初是由Von.Neumann提出的,其基本思想如图2所示。



图2 三模冗余框图

  其中M为结构、功能完全相同的模块,V为多数表决器。表决器将三个模块的输出做多数表决,其结果作为其输出。设单个模块的可靠度为R,则三模冗余结构的可靠度为:

  RTMR=R3M+3R3M(1-RM)=3R2M-2R3M
  三模冗余向上推广即为N模冗余,向下可构成双机系统。
  在N版本程序设计中,也同样为某一确定功能而独立编制的几个程序同时运行,其结果是通过这些独立程序的运行结果经多数表决而得到的。N版本程序设计中,特别强调N版本因为如果各程序采用了相同的结构、相同的算法,就有可能产生相同的错误而使多数表决失败。
  N版本程序设计中包含了程序设计上的冗余,用效率换取可靠性,能容忍设计错误的能力,还能屏蔽某些类型的暂时性硬件故障。
  数据的冗余保护也是N版本程序设计思想的应用。将重要数据同时存入几个不相邻的存储单元因干扰而被同时改写的可能性很小,因此即使有一、两个存贮单元出错也能得到正确的数据。
  三版本程序结构框图如图3所示。



图3 三版本程序结构框图

  下面给出的是PASCAL程序,在程序中,result、result1、result2、result3分别为最终、程序1、程序2、程序3的输出结果,er的值标志着发生错误的程序号,er=0则无错误程序,devla的值是认为程序输出等价的充分相似程度,ERROR为三个输出均不相等时的错误处理模块。
程序:

PROCEDURE TVP(result:real;er:lnteger)
 CONST devla=?
 VAR er:lnteger
  result,result1,result2,result3:real
BEGIN result:=0; er:=0
 BEGIN
    程序1
 END (result1)
 BEGIN
    程序2
 END (result2)
 BEGIN
    程序3
 END (result3)
 IF |result1-result2|>devla→
  IF |result1-result3|>devla→
   IF |result2-result3|>devla→
    |result2-result3|<devla→result:=result2;er:=1
   ENDIF
   |result1-result3|<devla→result:=result1;er:=2
   ENDIF
   |result1-result2|<devla→result:=result1
   IF |result1-result3|>devla→er:=3
|result1-result3|<devla→er:=0
   ENDIF
  ENDIF
END{result,er}

3、弃权规则

弃权规则就是当程序运行或继续运行的某些必要条件未能具备时,放弃对这些条件的要求,不是产生等待、中断、出错或停机,而是采用跳过、转移、N-1默认等方式保证程序继续运行,这些方法只适用于屏蔽暂时故障,所以要求同时产生报警输出,以便确定是否需要人为干预来消除永久故障。弃权规则首先要不影响程序的正确性和适用性,还应对要求的条件有重试、重读、等待的过程。必要条件是指运行程序所需的资源,包括:外设、存储空间时间、数据信息等。必要条件未能具备包括:一是条件未形成或未出现;二是条件具备了但含有不合理性,如采集到的数据超出允许范围控制台输入了非常操作指令等。

(1)跳过

指在不影响控制系统正常运行的前提下,跳过条件没具备而导致故障的模块向下执行,这是软件失效运行的形式之一。所谓软件失效运行就是在故障发生时先把故障模块从系统中断开,再对系统的其余模块进行重构,使系统能继续运行,但功能降低、即降级运行。可靠性的提高是以某些功能的损失为代价的。例如程序运行到打印输出模块时,而打印机离线,则跳过这一输出模块继续向下运行。

(2)转移

这是在某些未考虑容易设计的软件中,当错误发生后往往会导致机器死锁,需要重新启动及初始化操作。转移可以在错误发生并检测到以后,根据某些标志的取值转不同的错误处理程序或执行后备程序。根据标志实现转移不论是高级语言还是汇编语言都是容易做到的,例如BASIC语言中的ON ERROR语句。
程序:

  10 在打印机上列出学生名和成绩
  20 ON ERROR GOTO 500
  30 LPRINT "NAME"; "GRADE":LPRINT
  40 READ S.NAME$,GRADE
  50 WHILE S.NAME$ <> "$END$"
  60   LPRINT S.NAME$,GRADE
  70   READ S.NAME$,GRADE
  80 WEND
  90 ON ERROR GOTO 2000  '2000语句为程序出口
  100 RETURN
  500 IF ERROR=24 OR ERROR=27 THEN
      INPUT "打印机未打开,打开后请回车。",A$
      RESUME
  510 ERR=24、27为DEVICE FAULT
  520 IF ERR=4 THEN
      PRINT "末记录未找到。":RETURN
  530 ERR=4 为 OUT OF DATA
  540 IF ERR=1000 THEN
      PRINT "数据错,跳过这个记录。"
      READ A$,B$:pRINT A$,B$:RESUME
  550 ON ERROR GOTO 2000
  1000 DATA Peter,90,Bob,84…,Mary,88,$END$, 0
  2000 错误处理语句

(3)N-1方式

N-1方式是基于控制程序的循环执行特性,即采用上一循环(第N-1次)的数据代替本次循环(第N次)所需的却未出现或未具备的数据。这种方法特别适用于缓变的被控对象。例如某次控制输出被判断为不合理,则利用上次循环的输出代替之。
  改进的N-1方式增加了趋势补偿,即用N-1次的数据加系统变化的趋势补偿作为采用的数据设第N-1次循环数据为Dn-1,第n-2次循环数据为Dn-2而第N次循环故障,则代用数据为:
  Dn=Dn-1+(Dn-1-Dn-2)=2Dn-1-Dn-2
趋势补偿的加入使系统的可靠性和正确性都大大增加了。

(4)默认

默认也是弃权规则的形式之一,与跳过不同的是采用预先置入的合理条件代替未具备的条件,即默认为条件存在。例如将非法输入的操作指令默认为无输入,继续原操作。
  总之,弃权规则的目的是使工作在实时方式的控制系统保证连续运行,以确保被控系统的长期稳定工作,虽然系统的功能有可能降低。

4、非正常性规则

实践证明,在工业控制系统中,特别是在环境条件差、系统工作初期或不稳定时,以及操作人员水平尚不高时,系统常常遇到非正常情况,对控制系统造成不利影响,甚至导致灾难性后果。例如非法的控制台操作、非法的数据输入或输出、运算结果及中间数据出现上溢或下溢等。
  非正常性规则要求软件设计要充分考虑当非正常条件出现时的容错处理。因为程序员在软件设计中通常会无意识地只考虑正常情况,只有明确提出应严格遵循非正常性规则时,程序员才会自觉地在设计中有针对性地研究对异常情况的容错处理,以避免造成系统的故障与错误。
  在工业现场会遇到许多意想不到的情况,采用非正常性规则的容错设计可以有效地屏蔽偶然的故障,提高系统的可靠性。
  与非正常性规则类似的是边缘值规则。根据经验,程序往往在处理边缘情况时发生错误。边缘情况指的是输入或输出允许值范围的边界值。例如某数组的上、下边界和循环变量的初值与终值。边缘值规则要求在软件设计中充分考虑处理边界值的情况,在软件测试中采用的边缘值分析法对排错也是非常有效的。

5、失效保险设计

在钢铁冶金、石油化工等生产过程控制系统中,既要求系统能长期稳定地不间断运行,又要求保证系统控制输出的正确性。如果因某一系统或某一模块失效而导致了错误的输出,则一旦被执行将对生产过程构成严重威胁,甚至产生灾难性后果。采用失效保险设计是解决这种问题的方法之一。
  失效保险设计是在系统发生故障时,其输出呈现一预定的安全值,从而减少了可能受损失的程度。例如当发生故障时某些阀门被关闭就是取其安全值。
  失效保险设计涉及到数据合理性判断的问题。数据合理性判断就是利用检测方法对所处理的数据产生合理性或不合理性判断从而决定接受或不接受该数据的过程。数据有输入数据、中间数据和输出数据;合理性有范围合理性、类型合理性、变化量合理性和逻辑合理性等。
  下面是一个输入数据范围合理性判断的QUICK BASIC程序例子。

  INPUT "输入数据:", VALUE
  DO WHILE VALUE < LOW OR VALUE > HIGH
  BEEP
  PRINT "数据应在";LOW;"到";HIGH;
"之间。"
  INPUT "重新输入:",VALUE
 LOOP

  有时数据的合理性不能直接判断时,可由附加的检测程序根据几个数据之间的某些关系进行判断。
  控制系统常用的容错方法很多,以上介绍的几种常用软件容错方法是作者在长期工作实践中摸索出的一些经验,在此提出供参考。
 
我考!这个dop什么来头? 大哥我佩服之至啊!
 
lsgd1688:
既然必须是单机的,那就将其B机上的内容移到A机上来好了。即两者共存于一台机器之上。
虽然在一台机器之上,但是,却是两个在逻辑上完全独立的对等体系。
注意:独立性。
因为这个涉及到算其出错概率时用的指标。假设你的程序本身的可用性为90%,
两个相关联的程序可用性为90%。
两个独立的程序的可用性为90% + 10% * 90% = 99%。
就是说,在你的方案中,你的进程A与进程B是互相关联的,算是一个点。
而在你的机器上运行两个独立的对等体系(即将我前面所说的对等机制放到一台机器上)
那么,其中任何一个失效的机会在90%的话,第一个失效的时候,第二个同有效的机会在
90%,那么,得出的结果就是99%。同理,如果运行三个这样的结构,那么,得到的结果是
99.9%。当然,这个算法只是假设其它所有的情况在运行一个,运行两个,运行三个时
都没有改变。事实上,如果你一台机器上运行两个时,因为它们是同一个操作系统环境,
不可避免地相互影响,比如一个将内存占用而不释放,运行时间,吃尽内存而死机,
同样,此机器上的所有进程,包括对等点的程序也会死亡,这样的概率就不一样的。
这也是为什么要将其放于双机上的原因。当然,放在双机上,引入了新的出错点(两台
机器上的网线问题),但是,这个点可以通过B没有收到消息就报警启动程序来避免。

所以说,运行于单机上的对等点会根据实际情况,调低其可用性比例。具体调整方法,
最科学地方法就是实地测试结果。

其实,如果这是一个关键的监控程序的话,如果是我来做,我会建议客户使用双机。
实在做不到,可以使用另外一台比较破的机器做B机。比如已经淘汰的586或486的机器也
是可以的。现在的PC大约也就1000多一点可以买到一个二手的。不是么?
成本应该不是一个拥有这样关键任务的厂商考虑的问题。如果是习惯的话,
哪一次进步不是在打破习惯中实现的。如果明知道习惯不是很好,还是遵守习惯么?

如果我是项目经理,我一定会建议用户购买一台机器,将建议客户将这台机器的成本
一千多元,打入本次项目的成本的。

当然,或许这是你个人做的项目。如果是你个人给企业的做的东西,我建议你在单机上实现
两点,然后,告诉你的客户,详细描述这样的风险及这些风险的技术无关性(即与你没有关系)。
这样的话,我相信,会说服客户的。
实在说服不了,算了,一个连一千多元都不花的客户,他付给你的钱估计也只是有限的。
如果他付给你很多的话,你替他买一台机器,送给他吧。[:)]
 
to dop大虾:
你的方法和建议我会仔细考虑,谢谢关注和知道,给分了。
dop大虾能给个联系方式吗?如果可以的话向你讨教一二,如果不可以,那也谢谢你。
还可以继续讨论,如果有更好的方法,另外开贴送分!!!
 
呵呵,我这里留下来的资料都是可以联系到我的。

中文网名:青海渔风 英文网名:dop, dopsun
OICQ号:6006839 MSN号:sunht@dopsun.com
Email:sunht@dopsun.com

小成:精通一种或几种开发工具,模仿别人做出程序
中成:知其然,亦知其所以然。现在我应该还在这里吧。
大成:融会贯通。一直在努力。

QQ现在用得比较少了。
 
顶部