凯哥stack

计算机体系结构(一) 三大体系结构浅析

Image: First Draft of a Report on the EDVAC

冯诺伊曼结构

1945年6月30日,冯诺伊曼的手稿「 First Draft of a Report on the EDVAC 」,被分发给参与EDVAC计划的相关人员,不久该消息传遍世界,自此举世闻名的「 冯诺伊曼结构 」诞生,并一直影响者计算机领域,当今我们所使用的计算机,大部分都是基于冯诺伊曼结构设计而成。

冯诺伊曼结构(Von Neumann architecture)中有两个特点,一个是程序存储与数据存储使用同一个内存设备,另外一个就是使用二进制计算代替十进制或者其他,通过阅读冯诺伊曼原稿简单总结如下。

Image: Von Neumann Architecture

图1: 冯诺伊曼结构(原图)

结构设计

  • CA(Central Arithmetical)

    算数单元,当时的计算机主要面向复杂的数值计算,ENIAC/EDVAC的设计初衷都是是为了计算弹道,早期计算机大部分都是为了完成复杂计算而设计制造。

  • CC(Central Control)

    逻辑控制单元,指令的执行,异常的处理,I/O处理等,除了计算以外的所有事情都需要处理,这些都交给了逻辑控制单元。

  • M(Memory)

    比如多级计算需要存储中间数据,执行计算用到的程序,算数单元获取的计算数据等等都需要一个设备来存储,一个内存设备是必要的。

为了完成计算,必须将外部数据输入到计算机内部,以及计算完成后将结果输出,因此还需要两个设备,即输入设备和输出设备,以及记录这些输入/输出数据的存储设备。

  • I(Input)

    输入设备,将外部数据输入到计算机,最好的设计是外部输入数据先通过输入设备加载到内存M,然后再加载到控制或者计算单元,这样可以简化计算/控制单元的设计。

  • O(Output)

    输出设备,将计算结果输出到外部设备,同样,输出结果的方式也是控制/计算单元先写入到内存M,然后通过内存M写入到外部记录设备。

  • R(Recording medium)

    记录设备,连接I/O,作为输入计算机的源数据和计算机输出数据的记录设备。

二进制还是十进制

众所周知,当今的通用计算机都采用二进制,而在20世纪40年代,有各种各样的计算机,第一台通用计算机ENIAC,采用的就是十进制而非二进制,使用多个电子管触发器组合成十进制累加器,但冯诺伊曼给出选择二进制的理由:

  • 大部分电子器件如门电路简单的触发器都有2个状态,多个状态的电路也是由2个状态机器组合而成,因此采用二进制在设计上最简单。
  • 可靠性好,使用二进制会导致器件增加以及成本变高,但是由于设计简单带来更高的可靠性,因此EDVAC的设计最终选择了二进制。

自此,二进制一直沿用至今。

哈佛结构

哈佛结构(Harvard architecture)的设计与冯诺伊曼结构非常接近,几大部件包括CA(算数单元)、CC(控制单元)、M(存储单元)、I(Input)、O(Output),唯一不同的是,存储单元M有两个,即程序存储和数据存储分开。

Image: Harvard Architecture

图2: 哈佛结构(原图)

与冯诺伊曼结构对比

  • 在同一时间,可以同时访问指令和数据,效率更高
  • 程序和数据存储分开,地址空间隔离,两种存储之间隔离不能共享,冯诺伊曼的设计中有共享的考虑
  • 程序和数据的分离同时会导致成本升高

因此,要平衡性能与成本、复杂度等因素获取的最佳体验,在当今的体系架构中吸取了两种结构的优点而发展出一种叫改进型的哈佛结构(Modified Harvard architecture)。

改进的哈佛结构

主要的两个改进点:

  • 改进点一,程序和数据地址空间隔离,但可以从程序地址空间读取数据
    大部分MCU使用这种方式,主要原因是单片机的设计一般考虑低成本和低功耗,因此片上的动态内存很少,举例拿atmel的C51系列,拥有4K程序存储,而片上数据存储只有128字节,用来作为栈空间使用,大部分用户用到的数据以只读的方式放在程序存储的flash上,因此设计中加入从程序地址空间读取数据的指令,来完成数据的读取,此为改进点一。

  • 改进点二,程序和数据地址共享,将程序和数据的缓存分开
    当代处理器中将存储单元分为两层,第一层接近CC(控制单元)的存储单元中,将指令和数据存储分开,但是地址空间并不隔离(即程序/数据缓存),与哈佛结构的最大不同就是程序和数据地址空间共用,第二层存储单元为程序和数据共用,采用冯诺伊曼结构,只有在缓存失效时才会访问第二层,不能并行。在一定程度上解决了冯诺伊曼瓶颈,同时兼顾了存储利用率的最大化。

当今大部分处理器如x86处理器、嵌入式arm处理器、powerpc处理器等,处理器内使用分开的一级指令和数据缓存都使用该种改进方式,二级、三级缓存指令和数据共用,内存设备指令和数据共用。

Image: architecture of modern cpu

图3: 现代CPU结构

几种结构对比

根据当前现有处理器/微控制器的分类,从使用结构结合芯片特点及场景进行分析如下:

使用纯哈佛结构

当今纯哈佛结构的芯片非常少,大部分单片机如果忽略改进哈佛结构的第一个改进点,最接近于哈佛结构。

单片机的芯片一般作简单控制,如开关、采样、控制电器等等,大部分使用场景是烧写程序后,长时间保持不变,在设计上为程序存储分配较少的空间,一把从几K到几M不等,数据存储可能会更小,一般会把一些配置数据写在程序存储器中,在运行时加载。

使用改进的哈佛结构

第一种改进方式的,前面已经提到在MCU中大量存在。

第二种改进主要是解决冯诺伊曼瓶颈,大部分嵌入式/商用处理器如arm/x86等在L1缓存到CPU之间使用,当代处理器为了兼顾扩展性,但是仍然要提升性能,降低冯诺伊曼瓶颈带来的延迟

  • 同一时间不能同时访问指令和数据地址
  • CPU处理器速率与内存设备之间的访问速率差异

设计L1缓存,指令与数据内存存取分开,让计算机能并行,同时为了兼顾独立的内存设备,L1缓存的指令地址和数据地址使用同一地址空间,只要缓存命中,即可同时存取。

使用冯诺伊曼结构

大部分嵌入式/商用处理器如arm/x86等在L2/L3缓存、内存这一段使用,为何仍然沿用冯诺伊曼结构呢?

  • 你不会为一台电脑购买2倍内存条,一个分给指令存储,一个分给数据存储
  • 操作系统要设计2套内存管理,一套管理指令内存,一套管理数据存储
  • 程序员不用为某个数据到底应该存储在指令内存还是数据内存中而争论

在不断平衡成本、易用性、复杂度和性能的同时,换来一个适当的折衷。在冯诺伊曼的晚年,当他的学生向他请教做事的方法,他只是说“简单(simple)”。

冯诺伊曼结构是20世纪那一代人的努力的结果,包括Von Neumann、Mauchly、Eckert、Konrad Zuse、Turing等等,让我们向这些先驱们致敬。

参考资料:
[1] https://en.wikipedia.org/wiki/Von_Neumann_architecture
[2] https://en.wikipedia.org/wiki/Harvard_architecture
[3] https://en.wikipedia.org/wiki/Modified_Harvard_architecture
[4] abelgo.cn/cs101/papers/Neumann.pdf

凯哥stack

著作权归作者所有,禁止转载


专题:

本文发表于 2020-05-14,最后修改于 2020-06-01。

本站永久域名kaige86.com,也可搜索「 凯哥stack 」找到我。

期待关注我的 ,查看最近的文章和动态。


上一篇 « 可执行程序和共享库格式的演化史 下一篇 » 计算机体系结构(二) Code As Data ? Data As Code ?

推荐阅读

Big Image