这是一个冗余故事的自助餐。我提供了几件,你选择其中哪一个读取和分享,并且在哪个顺序中。每件事都包含相同的想法,只有不同的思想,所以不要害怕错过任何东西。实验和享受!
组件冗余在很大程度上用于安全关键和关键任务系统,以实现可靠性改进。但在这个利基外,它'在软件世界中令人惊讶的是令人惊讶的。这是一个耻辱自It'是一个简单但经济的想法。它不需要记住,它可以在修补程序和紧急维修时拯救您很多。
但是,如果您拥有不可靠的组件和软件组件理论上无限可靠,则冗余只会有意义。它只是在实践中,他们aren' t。
假设您希望在控制下保持核心温度。你把一个热传感器放在那里,将它电向某种苏米达,你走了。除了它非常重要,因为你不能依赖一根电线。如果不管它捕捉到什么原因,怎么办?
所以你添加另一个扫描仪和另一个电线。现在更可靠。但是,如果其中一个扫描仪显示300摄氏度,另一个1234?如果您关闭反应堆或替换破碎的扫描仪?
嗯,你添加另一个扫描仪和另一根电线。现在它是300,300,1234或1234,1234,300。您现在可以做出决定。
在乌克兰,直到90年代初期,这些组成部分在所有核电站都有三次。但随后与原子能机构的合作开始,他们带来了新问题:让我们说你知道你需要更换破碎的传感器。现在你怎能确定,在更换它时,你会得到足够的数据吗?
世界其他地区已经四分类的组件,但乌克兰NPP行业尚未拥有可靠的四分夹子 - 一种特殊的设备,可以将四个信号带到一起。考虑到最严格的可靠性要求,开发和生产该设备,在那一点上会过于危险,因此他们决定重复一份三倍者。
让它进入。乘法乘以验证的乘法器被认为是比向系统引入完全新的组件的更好的选择。
好吧,没有。因为我们以某种方式假设软件组件完美无瑕。当然,他们是不是,但这是我们选择相信的模型。二极管可以失效,电阻可以燃烧,电容器可以泄漏,但是一个地狱世界永远是一个地狱世界。
如果软件完美无瑕,那么冗余带来没有值。但经验,它确实如此。要了解为什么在安全关键发展的世界中如此赞赏,并学会使用它的优势,我们首先必须放弃软件无谬误的概念。
在世界上固有的不可靠的组件,a。 k。一种。现实世界,引入冗余是提高系统可靠性的唯一现实方式。这是简单的数学。
让我们说你有3个组件。每个人都有10%的失败机会和90%的工作机会。如果您如下,此子系统的可靠性将是:
现在,如果您具有相同的低可靠性组件,但您并联地连接它们,因此工作组可以替换失败,那么此类子系统的可靠性将是:
在序列中添加不可靠的组件可减少您的系统' S的可靠性小。但是,重复的不可靠的组件急剧改善了您的系统和#39; S的可靠性。那个' s冗余如何运作。
硬件家伙,尤其是那些燃烧足够电阻的人,意识到这一点。这就是为什么他们重复和三份值得一式一同的东西。我们没有。
因为在软件中,我们假设代码总是无缺陷或至少确定的。有一个整个研究领域,使前者和许多轶事证据具有矛盾,但总体概念是:计划不容易磨损和腐烂,而且单独使它们最终使他们最终可靠。
当然,如果您的可靠性被测量为1,那么您可以乘以它,但是您喜欢,您'仍然获得1.冗余是无意义的。如果我们承认该软件本身就像易受世界上其他所有其他东西一样,它只有意义。
我必须建立一个非常酷的事情,我无法讲述法律原因。我可以讲述它的构建过程。它应该是用CMake和Linux上运行的C ++代码连接的CUDA。构建指令实际上是Docker文件,是关于版本的显式,但仅对它在Docker中工作的点。我想在WSL上建立这件事,这带来了足够的不确定性来使构建系统崩溃。
我发现的那个周末。出于某种原因,CMAKE版本16和更高版本在GCC 5到7上不会引导。但仅在WSL2上。在WSL上,他们这样做,但CUDA没有看到你的GPU。 CUDA的目标架构在CMake 17和CMake 18中不同地设置。和克朗 - 工具和Clanglib可以但真的不属于不同版本的铿cl声。
还有不同的C ++标准和方言的麻烦。最烦人的,最琐碎的和最不必要的人。就像在msvc上一样,您可以在普通的std ::例外,在gcc上播放消息,你不能。在C ++ 17中,有Messageless Static_Asserts,但在C ++ 14中,应使用消息字符串提供所有静态断言。
构建过程太过连续,任何子系统的失败导致所有构建都失败。如果你甚至尝试了CMake,CUDA,甚至跨平台C ++,你就知道这些事情是多么脆弱。您无法从不可靠的子系统中构建可靠的连续系统。这是简单的数学。
但实际上,构建过程有很多冗余。这只是我必须手动管理它。
当CMake 17没工作时,我尝试了18.当Clang 10不够时,我安装了Cuda 11.当CUDA 11要求STD = C ++ 17选项时,我添加了此选项。这种可变性在数学和实际情况下使构建成为可能。
来思考它,这只是疯了。您不需要一个人在核心内切换连接器。事实上,你不希望这个人在那里。而这个人不想在那里。所以电气工程师发现了一种自动化的方法。但是,我们,应该在任何可能的自动化中领先的软件工程师仍在手动切换子系统。
当然,我们也可以向我们的系统引入冗余。但这需要对感知的转变。我们必须承认,软件就像容易出现故障。一个构建可以吃掉你的磁盘空间,由于网络问题,一个包可能无法使用,甚至一个编译器可以误解。
程序与电阻器和电容器一样有故障。这只是一个规模问题。当然,prnit"你好世界"是可靠的。但是每两条缺陷每两条代码都是这些日子的行业规范。软件子系统显然是容易发生的。
在安全关键应用中,每个组件都被视为错误。如果您承认有问题的组件,则无法以其他选项,但要考虑以获得最佳结果的方式拼凑它们。冗余不是银弹,但它使得可以从不可靠的部件中建立可靠的系统。
如果我们想建立可靠的系统,如果我们愿意开始考虑可靠性,首先我们必须承认我们的组件aren' t可靠。