我想知道是否有人能给出我的答案,或者至少指出我对以下问题的良好提及: 为什么我从未听说过以非常根本的方式打破计算机?为什么当我声明x为双倍时它保持为双倍?为什么从来没有一个短路来抢夺它的某些字节并使它成为一个整数?为什么我们相信当我们将x初始化为10时,永远不会出现导致它变为11或类似的电源浪涌?
我想我需要更好地理解记忆。 谢谢,请不要因为这么简单/抽象的问题而抨击我。
答案 0 :(得分:3)
AFAIK,最大的问题是宇宙背景辐射。如果伽马射线撞击你的内存芯片,它可以随机翻转一个内存位。甚至在您的计算机中偶尔也会发生这种情况。它通常不会导致任何问题,因为它不太可能是您的Excel输入字段中的位,例如,磁驱动器可以防止此类事故。但是,对于长时间的大型计算来说,这是一个问题。这就是ECC内存的发明。您还可以在此处找到有关此现象的更多信息:
http://en.wikipedia.org/wiki/ECC_memory
“发现的实际错误率比之前的小规模或实验室研究高出几个数量级,每兆位每十亿设备小时有25,000到70,000个错误(约2.5-7×10-11错误/位·h) (即使用高端错误率,每小时8 GB内存大约5个单位错误),超过8%的DIMM内存模块每年都会受到错误的影响。“
答案 1 :(得分:2)
为什么我从来没有听说过计算机以非常根本的方式破坏?
硬件非常复杂,并且有大量的工程师,他们的工作就是确保硬件按预期工作。每当英特尔,AMD等发布芯片时,他们都会对设计进行广泛测试,并在出厂前运行各种诊断。他们有这样做的经济动机:如果在某个地方出现了错误,那可能会非常昂贵。请查看英特尔FDIV bug的示例。
为什么当我声明x为双倍时,它会保持为双倍?为什么从来没有一个短路来抢夺它的某些字节并使其成为整数?
部分原因与装配工作方式有关。通常,编译的应用程序二进制文件中不包含任何类型信息。相反,它们只发出命令,如“将位于0x243598F0的四个字节加载到寄存器中”。对于要以某种方式进行变异的变量类型,需要更改大量的应用程序代码。如果有一个错误未定义变量的空间,它会搞乱堆栈布局并可能导致一个非常快速的程序崩溃,所以结果可能是“它崩溃”而不是“类型变异”,尤其是因为在二进制级别,对双精度和整数类型的操作是如此不同。
为什么我们相信当我们将x初始化为10时,永远不会出现导致它变为11或类似的电源浪涌?
可能有!然而,这是非常罕见的,因为硬件人员在设计一切方面做得非常好。作为一名软件工程师,最好的事情之一就是你坐在食物链的顶端:
许多工程师在链条的每个环节都能过上好日子,这就是为什么一切都经过如此充分的测试。确实发生了错误,它们确实取消了真正的计算机系统,但除非你有数千或数百台计算机在运行,否则这种情况相对较少。
希望这有帮助!
答案 2 :(得分:1)
答案1,我们大多数人很少或从不在足够大的系统或需要这种考虑的系统上工作。在大型数据库或文件系统中,它们具有错误检测功能,可以检测您所描述的内容。在物理或数据大型系统中,在写入或存储数据时会发生错误(例如,数据包在旅途中丢失或损坏,伽马射线被击中)。各个部门的硬盘都坏了。我们有哈希,奇偶校验和许多其他方法,以便在有趣的问题发生时通知我们。
答案2:我们的公理&楷模。我们倾向于使用的模型,势在必行或功能模型,没有“来自太阳的伽马射线改变了一点”作为考虑因素。就像环境科学家在研究环境变化时如何抽象夸克一样,我们抽象出硬件。
编辑#X: 这是一个很好的问题。我最近偶然听到了这个。在物理学中,他们的模型是错误的。死了错了。而且他们知道他们错了,但无论如何他们都会使用它们。当我这样说是为了证明我对这个主题的蔑视是合理的时候,我学校的CS技术人员口头回复了我。他基本上说了你说的话,我们怎么知道'int x = 10'后来不是随机的?