配速记页 04-reliability 使用。
工程系统(火箭、核电站、支付系统)的可靠性哲学有一个根本转向:放弃「零故障」幻想,接受故障必然发生,设计让系统在故障下仍正确工作。这就是容错(fault tolerance)——tolerance 不是消灭 fault,是容忍它。
这条思路的代表作是 1960s 的阿波罗导航计算机和 IBM 大型机:用三模冗余表决撑住单点故障。你考试要背的 N 版本程序设计,血统就在这里。
串联 = 乘法:「一坏全坏」的概率就是各环节都正常概率的连乘。链条越多,乘积越小——这就是「分布式系统的可用性天生比单体差」的数学根源:每多一跳,就多乘一个 <1 的数。
并联 = 补集:「全坏才坏」,用 1 减去全部失效的概率。并联的收益边际递减(0.9 并一个变 0.99,再并一个只到 0.999)——冗余是买保险,保费递增、保额递减,这就是为什么金融系统主备 2 份就够、航天才上 3 份表决。
表决 = 二项式:n 份冗余、按多数表决,正确概率是二项分布的「≥半数正确」尾概率。它比并联强的一点:还能掩盖某些错误输出(两份对一份错,表决输出对的)。
MTBF/MTTF/MTTR:MTTF(多久坏)衡量可靠性,MTTR(修多久)衡量可维护性,两者相加为 MTBF。可用度 A = MTTF/MTBF 把两个维度合成一个数——可用性=可靠性×可维护性的归一化。运维团队缩短 MTTR(自动化切换、预案演练)往往比研发提升 MTTF 更便宜。
N 版本程序设计(NVP)——「多样性对抗共同缺陷」 核心假设:独立开发的版本,犯同样的错概率极低。所以要求不同团队、不同算法、甚至不同语言。表决器多数决。
恢复块(Recovery Block)——「带后路的主备」 主块执行后跑验收测试(Acceptance Test),不过就回滚状态、跑备用块。与 NVP 的本质区别:串行降级(后向恢复)vs 并行表决(前向恢复);恢复块便宜(备份块可以只是简化版算法),但验收测试写不好会漏掉错误。
防卫式程序设计——「不信任一切输入」 不做冗余,靠运行时检查(断言/异常/边界校验)把错误尽早暴露而非扩散。它的哲学是「fail fast」:错误藏得越久,定位越贵。PLC 装车的联锁(interlock)就是典型:非法状态直接拒绝动作。
三者关系一句话:NVP 容忍设计错误(贵的保险)、恢复块容忍实现错误(中档保险)、防卫式不减错误只减危害(安全带)。
可靠性:规定时间内连续正确运行的概率。安全(safety):故障发生时不造成灾难的能力。 两者可以分离:核电站停机(不可靠)但安全;反之「可靠地」执行了错误指令(如 Therac-25 放疗机,软件联锁缺陷导致可靠地输出致死剂量)是可靠而不安全。案例里出现「失效安全(fail-safe)」字眼,要往这个辨析上靠。