4

我想知道是否有人可以给我一个好的答案,或者至少为我指出以下问题的良好参考方向:为什么我从未听说过计算机以非常基本的方式发生故障?为什么当我声明 x 为双精度时,它仍为双精度?为什么从来没有短路会剥夺它的一些字节并使其成为整数?为什么我们相信,当我们将 x 初始化为 10 时,永远不会出现导致其变为 11 或类似情况的电源浪涌?

我想我需要更好地理解记忆。谢谢,请不要因为这样一个简单/抽象的问题而抨击我。

4

3 回答 3

3

AFAIK,最大的此类问题是宇宙背景辐射。如果伽马射线击中您的内存芯片,它可以随机翻转内存位。即使在您的计算机中也会时不时地发生这种情况。它通常不会引起任何问题,因为它不太可能是 Excel 输入字段中的一小部分,例如,磁驱动器可以防止此类事故。但是,对于长时间的大型计算来说,这是一个问题。这就是 ECC 内存的发明目的。您还可以在此处找到有关此现象的更多信息:

http://en.wikipedia.org/wiki/ECC_memory

“发现的实际错误率比以前的小规模或实验室研究高几个数量级,每兆位每十亿设备小时有 25,000 到 70,000 个错误(约 2.5–7 × 10−11 错误/bit·h)(即约使用高端错误率,每小时 8 GB RAM 中出现 5 个单比特错误),每年有超过 8% 的 DIMM 内存模块受到错误影响。”

于 2013-11-09T02:19:22.227 回答
2

为什么我从来没有听说过计算机以非常基本的方式发生故障?

硬件非常复杂,有大量工程师的工作是确保硬件按预期工作。每当英特尔、AMD 等发布芯片时,他们都会对设计进行广泛的测试,并在出厂前进行各种诊断。他们这样做有经济动机:如果某处出现错误,代价可能会非常高昂。以英特尔FDIV 错误为例。

为什么当我声明 x 为双精度时,它仍为双精度?为什么从来没有短路会剥夺它的一些字节并使其成为整数?

这部分与装配的工作方式有关。通常,已编译的应用程序二进制文件中没有任何类型信息。相反,他们只是发出诸如“将位置 0x243598F0 的四个字节加载到寄存器中”之类的命令。为了使变量的类型以某种方式发生变异,必须更改大量的应用程序代码。如果有一个错误导致变量空间分配不足,它会弄乱堆栈布局并可能导致程序很快崩溃,因此结果很可能是“它崩溃了”而不是“类型发生了变异”,尤其是因为在二进制级别上,对双精度和整数类型的操作是如此不同。

为什么我们相信,当我们将 x 初始化为 10 时,永远不会出现导致其变为 11 或类似情况的电源浪涌?

可能有!不过,这种情况极为罕见,因为硬件人员在设计一切方面做得非常出色。作为一名软件工程师,其中一件好事就是你处于食物链的顶端:

  • 软件工程师编写在操作系统中运行的软件,
  • 它由系统程序员编写并与硬件对话,
  • 它由电气工程师设计,由硬件门构成,
  • 由材料工程师制造和设计,
  • 由于采矿工程师的努力,他们得到了材料,
  • 等等

许多工程师在链条中的每个环节都过得很好,这就是为什么一切都经过良好测试的原因。确实会发生错误,并且它们确实会破坏真正的计算机系统,但除非您有数千或数百万台计算机在运行,否则这种情况相对罕见。

希望这可以帮助!

于 2013-11-09T03:49:43.277 回答
1

答案 1,我们大多数人很少或从不在足够大的系统或需要这种考虑的系统上工作。在大型数据库或文件系统中,它们具有错误检测功能以注意到您所描述的内容。在物理或数据大型系统中,写入或存储数据时会发生错误(例如,数据包在行程中丢失或损坏,伽马射线命中)。硬盘驱动器中的扇区一直在变坏。当有趣的问题发生时,我们有散列、奇偶校验和许多其他方法来通知我们。

答案 2:我们的公理和模型。我们倾向于使用的模型,命令式或函数式模型,没有考虑到“来自太阳的伽马射线发生了一点变化”。就像环境科学家在研究环境变化时如何抽象出夸克一样,我们抽象出硬件。

编辑#X:这是一个很好的问题。我最近真的偶然听到了这个。在物理学中,他们的模型是错误的。大错特错。他们知道他们错了,但无论如何他们都会使用它们。当我这样说来证明我对这门学科的鄙视时,我学校的 CS 技术人员口头上反驳了我。他基本上就是说你说的,我们怎么知道'int x = 10'后来不是随机的11?

于 2013-11-09T02:02:45.997 回答