冯诺依曼模型和图灵模型实际上不是一回事吗?

Aren't the von Neumann model and the Turing model practically the the same thing?

根据我的理解,图灵模型由I/O数据、一个CPU和一个“程序”组成。 “程序”用于配置 CPU 如何处理输入数据以生成输出数据。如果我们更改程序,那么 CPU 将以不同的方式处理输入,我们会得到不同的输出。

冯·诺依曼模型在逻辑上将 I/O 和程序合二为一....好吧,但实际上这在设计计算机时有什么区别?为什么冯·诺依曼的模型看起来只是图灵模型的修改版却受到关注?这是否意味着像智能手机这样的现代计算机是冯诺依曼计算机(而不是图灵计算机),因为它们集成了程序和 I/O?老式游戏机是否被认为是图灵计算机(而不是冯诺依曼计算机),因为程序(卡带)可以在心理上与 CPU 和 I/O 数据分开?有人请给我一些见解。

区别在于图灵机是用于讨论 computation/computability 的数学构造。这些不受物理现实的限制;图灵机有无限内存,Lambda微积分允许无限递归。

同时,冯·诺依曼架构与哈佛架构作为构建计算机的一种特殊方式形成对比,none 其中,由于它们作为物理对象存在,因此可以被视为数学概念,尽管一些数学通常是进入他们的工程。

所有 real-world 商业 CPU 设计都是冯诺依曼架构,或者它的一个小变体:Harvard architecture 其中程序内存与数据内存分开。哈佛是当你有一个单独的地址 space,连接到物理上独立的内存,通常是 non-volatile 和 read-only 或者至少编程速度很慢。真正的哈佛通常只存在于用于嵌入式系统的微控制器中,它们不需要随时 运行 新程序的能力。

von Neumann vs. Harvard 的区别在于允许控制台卡带在 read-only 内存中带有“程序”。

请注意,约翰·冯·诺依曼是一个非常酷的人,有很多东西以他的名字命名。一种情况下的“冯·诺依曼”可能与另一种情况下不同于“冯·诺依曼”的事物形成对比。例如冯·诺依曼与完全不同的计算模型(如有限自动机又名生命游戏)更多地是关于串行 stored-program 计算机与 inherently-parallel 东西,而不是哈佛与冯·诺依曼在 [=65 内的区别=] 计算机。参见

Harvard 机器仍然以与 von Neumann 相同的方式存储程序,作为 CPU 获取的内存中的字节。(尽管公平地说,通用图灵机在开始 运行 之前也会从磁带读取其程序。但是一旦 运行ning,内部表示就可以是任何东西。现实生活中的 x86 CPUs 已经存在,例如,Transmeta Crusoe 在内部将 x86 机器代码动态重新编译为 VLIW CPU 代码。或者现代 Sandybridge 和 Zen 系列具有 decoded-uop 缓存而不是 re-decoding x86 机器代码。但是这些只是缓存,并且可以 re-fetch x86 机器代码在执行期间用于新的、更改的或 evicted-from-cache 区域)。


“图灵机”意味着 non-random-access 内存,沿磁带或等效物移动。在硬件中构建有限的图灵机意味着您的内存是一个巨大的移位寄存器或其他东西(看似合理但密度比普通 DRAM 或 SRAM 差),或者是在程序控制下移动而不是以恒定速度移动的物理磁带或鼓内存(可能很糟糕).

你可以在现实生活中构建一个实用的(有限的)图灵机,但它很难编程,而且速度非常慢。我怀疑任何商业设计都曾经是那样的。对于性能和编程的易用性,甚至计算的 O(f(n)) 时间复杂度来说,这显然都是不利的。

请注意,复杂性分析取决于计算模型:我们通常假设随机访问和串行计算,例如将所有已完成的操作相加。如果我们有 computational memory,你可以要求多组记忆单元并行递增自己,或者找到它和一组邻居之间的最小值,你可能会为某些事情实现较低的复杂性界限。

串行计算瓶颈是所有计算都发生在“CPU”中所固有的,它一次只能做一件事。 (或者在实践中,使用超标量流水线执行一次可以做 4 件事,或者使用 SIMD 在上面再做 4 到 16 的另一个因子。但这些都是常数因子,不会随着问题的大小而扩展。在实践中很好,但不不会影响问题的复杂性 class,例如在未排序的数组中查找最小值。)

("von Neumann bottleneck" can be narrowly defined as needing to actually fetch data and program from external memory, significantly mitigated by caches, including split L1d / L1i caches over unified L2 (aka modified Harvard). So the serial model of computation imposed by having a CPU read an instruction stream might not fall under that heading. Related: Does the Harvard architecture have the von Neumann bottleneck?)


通常 我们只讨论带有无限磁带的理想图灵机,用于理论 CS 目的,因为它们为复杂的现实世界任务编程太糟糕了。任何可计算的东西都可以在图灵机上计算,但效率不高。 (假设 unprovable(?) Church/Turing thesis 为真,以及任何其他正式警告。)

当您确实想用比伪代码中的计算操作更多的形式主义来谈论效率时,您需要一个类似于 real-world 计算机的正式抽象计算模型。这方面的一个例子是抽象 CS 随机存取机 (wikipedia).

它的程序与 RAM 是分开的,它是哈佛架构。

程序 RAM 中self-modifying,它是一个 RASP(随机存取存储程序),一个理想化的冯·诺依曼机器。

所以不,冯·诺依曼与图灵的对决并不是real-world与理论上的无限对决;这两种类型都可以在现实生活中构建,并且两种类型的抽象模型都存在并被使用。很容易犯这个错误,因为您永远不会看到 real-life 图灵机用于任何事情,并且通常对冯·诺依曼体系结构的讨论集中在 real-life 硬件上。

抽象 RAM 机器特别适用于分析并行 算法。 (PRAM = 并行 RAM 模型)。任何头脑正常的人都不希望并行图灵机在同一条磁带上来回穿梭。 PRAM 模型真实 CPU 足以证明算法是 wait-free、lock-free 或 obstruction-free(wiki)。