- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里有人可以解释一下 NASA 如何设计他们的航天器架构以确保他们能够修补部署代码中的错误吗?
我从未构建过任何“实时”类型系统,这是阅读本文后想到的一个问题:
http://pluto.jhuapl.edu/overview/piPerspective.php?page=piPerspective_05_21_2010
“One of the first major things we’ll do when we wake the spacecraft up next week will be uploading almost 20 minor bug fixes and other code enhancements to our fault protection (or “autopilot response”) software.”
最佳答案
我一直是公共(public)电话交换系统软件的开发人员,该软件对接近航天器系统所需的可靠性、可用性、生存能力和性能有相当严格的限制。我没有在航天器上工作过(尽管我在 IBM 与许多前航天飞机程序员一起工作过),而且我不熟悉 VXworks,这是许多航天器上使用的操作系统(包括火星探测器,它有惊人的运行记录)。
可修补性的核心要求之一是应该从头开始设计系统以进行修补。这包括模块结构,以便可以添加新变量和替换方法,而不会中断当前操作。这通常意味着更改方法的旧代码和新代码都将驻留,并且修补操作只是更新类或模块的调度向量。
将修补(和取消修补)软件集成到操作系统中几乎是强制性的。
当我在电话系统上工作时,我们通常在系统中使用补丁和模块替换功能来加载和测试我们的新功能以及错误修复,早在这些更改提交构建之前。作为日常工作的一部分,每个开发人员都需要熟悉修补和替换模块。它在这些组件中建立了一定程度的信任,并确保定期执行修补和替换代码。
对这些系统的测试比您在任何其他项目中遇到的任何测试都严格得多。部署系统的完整和部分模型将随时可用。可能还会有虚拟机环境,可以在其中运行和测试完整的负载。单元测试之上的所有级别的测试计划都将被编写和正式审查,就像正式的代码检查一样(这些也将是例行的)。
容错系统设计,包括软件设计,是必不可少的。我不知 Prop 体的航天器系统,但是像高可用性集群这样的东西可能是标准的,增加了同步和非同步运行的能力,以及在故障转移期间在双方之间传输信息的能力。这种系统结构的另一个好处是,您可以拆分系统(如有必要),用新的软件负载重新加载非事件端,并在生产系统中对其进行测试,而无需连接到系统网络或总线。当您对新软件正常运行感到满意时,您可以简单地故障转移到它。
与打补丁一样,每个开发人员都应该知道如何进行故障转移,并且应该在开发和测试期间都进行。此外,开发人员应该了解可能强制故障转移的每个软件更新问题,并且应该知道如何编写补丁和模块替换,以尽可能避免所需的故障转移。
通常,这些系统是针对这些环境从头开始设计的(硬件、操作系统、编译器和可能的编程语言)。我不会认为 Windows、Mac OSX、Linux 或任何 unix 变体足够强大。其中一部分是实时要求,但可靠性和生存能力的整个问题同样至关重要。
更新:作为另一个兴趣点,这里是 blog by one of the Mars rover drivers .这将使您了解维护运行中的航天器的日常生活。整洁的东西!
关于debugging - 十亿英里的软件补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3078387/
Debug.Assert/Debug.Fail 是否自动条件编译#if "DEBUG"?或者它是否更像是没有附加调试器(即使在发行版中)它什么也做不了?如果是这样,将它们留在您的代码中是否会对性能产生
我有一个应用程序,我配置了多个路由,一切正常,直到我配置的最新路由不起作用(显示错误的屏幕)。 我的问题是如何进行调试?没有打印错误日志,我无法找到如何获取有关正在发生的事情的更多日志。我也不知道从哪
我正在 Intellij 中调试代码。我使用 maven 来构建项目,并且在本地 .m2 存储库中有该项目的各种版本。当我开始调试时,Intellij 继续从项目的前一个快照中选择旧版本的代码。如何让
我喜欢在业余时间进行一些 TiVo 黑客事件 - TiVo 使用 Linux 变体和 TCL 。我想在我的 Windows 笔记本电脑上编写 TCL 脚本,测试它们,然后将它们通过 FTP 传输到我的
我有 ASM 代码,它使用循环语法打印 abc 。这是我的代码 ;abc.com .model small .code org 100h start: mov ah, 02h mov
我在 Debugging .net 2.0 Applications 中看到了以下代码 [Conditional("DEBUG")] void AssertTableExists() { #i
在大型项目中哪个更好用,为什么: #if DEBUG public void SetPrivateValue(int value) { ... } #endif 或 [System.D
我似乎无法让调试器运行。调试运行图标变灰,菜单选项丢失。 这只是main的情况,我可以很好地调试单元测试。 类似的问题提到了项目结构,但我看不出有什么不对: $GOPATH/src/foo.bar.c
只是想知道我的浏览器一直询问我是否想在每次点击浏览器链接刷新时停止调试非常烦人,因为这会减慢开发时间。 有没有其他人遇到过这个? 干杯 最佳答案 更新的答案,现在找到根本原因 经过两年看到这个错误时断
我正在尝试包含调试/发布相关编译器标志,例如: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x -Wall -DUSE_BOOST") set
当我尝试使用 debug.phonegap.com 调试我的phonegap 应用程序时遇到问题。 我把这个视频放在 HTML 文档的头部 在启动应用程序之前,我从 build.phonegap.
GDB 7.0以后,支持反向调试。 生成核心转储时,我可以使用反向调试命令吗? 我怎样才能做到这一点? 最佳答案 你不能。核心文件是某个时间点程序状态的快照。要在该状态下向后移动,您需要程序状态的较早
首先:如果之前有人问过这个问题,我很抱歉。我是一个熟练的谷歌用户,但这确实让我难住了,我找不到任何东西。 我目前正在编写一个小型库,我想对其进行调试。我还希望能够完全关闭调试,并且编译后的代码不应包含
我想在 tomcat 中将级别日志记录设置为 DEBUG,但在控制台中仍然只有 INFO 和 WARN 输出。谁能告诉我哪里出了问题? 我的 C:\tomcat\logging.properties:
我已经开始像这样使用定义类了: internal sealed class Defines { /// /// This constant is set to true iff th
在使用编译器指令时,我不清楚以下两个代码片段中哪一个是正确/首选的,以及为什么。似乎我见过的大多数开发人员和开源项目都使用第一种,但我也看到第二种也经常使用。 #ifdef DEBUG [self d
我遇到错误,无法完成构建。我搜索了 Stackoverflow 和 Github。我已经尝试了很多方法,但我无法修复。请帮忙。 (1) 在 [src/nullnull/debug, src/debug
我刚刚意识到,使用 TFS 部署时,DEBUG 处理器指令仍然有效,有没有办法更改 TFS/Azure 网站或构建定义中的设置,而不是在本地解决方案配置? 我仍然希望本地解决方案保持调试状态,只有部署
我有一段代码在 VS2008,C++ 中以 Debug模式运行。 问题是,当我逐行调试代码时,在代码的一个非常奇怪的地方,它崩溃并说: debug assertion faild. Expressio
我有一个简单的 Xamarin.Forms 项目,我在 Visual Studio 中运行,使用 iphone 模拟器。我在 App.cs 中有以下代码: protected override voi
我是一名优秀的程序员,十分优秀!