冯诺依曼结构和哈佛结构

最近公司面试,被问及冯诺依曼结构和哈佛结构的区别及应用面,一时未答上来,遂简单翻阅了相关资料,总结一下,愿与诸君分享。


在解释冯诺依曼结构和哈佛结构之前简单说明一下指令和数据的概念。


最早的计算机器仅包含固定用途的程序。例如一个计算器仅有固定的数字计算程序,它不能被拿来动作文字处理软件,更不能拿来玩游戏。也就是说在机器设计之时,它的用途、工作模式就已被决定,若想改变此机器的程序,你必须更改线路,更改结构甚至重新设计整台机器。


而存储程序型电脑的概念改变了这一切。机器的运作被转化成一串程序指令的运行。通过创造一组指令集结构(Instruction Set Architecture, ISA),并利用此指令集中的指令编写程序。由此,机器的运转变得更有弹性。例如下面就是三条简单的MIPS指令:

add R1, R2, R3
sub R4, R5, R6
lw R7, 0(R8)
至此,计算机的运作就变成如上的程序指令执行过程。这些指令通过对寄存器、内存中存储的数据进行操作而达到改变计算机状态的功能,例如上面三条指令中各个寄存器Rn中所存储的数据以及最后一条(r8+0)所对应的内存地址所存储的数据。由此计算机的运作也可以看作各条指令的执行和各种数据操作的过程。因此,计算机需要存储以上各条执行的程序指令及指令操作的对象数据。


冯诺依曼结构(Von Neumann architecture)和哈佛结构(Harvard architecture)应运而生。


冯诺依曼结构,也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储结构,也就是说程序指令和数据存储在同一个物理存储器中。而于此对应的,哈佛结构是一种将程序指令存储和数据存储分开的存储结构,也就是说程序指令和数据存储在不同的物理存储器中。中央处理器首先到程序指令存储器中读取程序指令,然后解析(decode)程序指令得到需要操作的数据所存储的地址,再到相应的数据存储器中读取数据,再进行下一步的操作,例如执行(execute)。


哈佛结构将程序指令存储和数据存储分开,可以使指令和数据拥有不同的数据带宽,设计更灵活,但也意味着设计更复杂。而冯诺依曼指令和数据的存储设计更简单,因此现如今的通用处理器通常讲两者相结合而使用。


通用处理器中,指令的执行、数据的操作都是在CPU中完成,但指令以及操作的数据都是存储在内存中。指令执行时,先从内存中将所需的指令读入CPU,然后需要操作数据时,又将数据从内存读入CPU。当指令和数据保存在内存中的时候,两者不是独立存储的,因此可以看作是冯诺依曼结构。


但内存和CPU的处理速度有很大的差距,CPU处理速度很快,内存的读写速度很慢,导致从内存中读取的指令和数据无法满足CPU的处理性能,CPU有大量的闲置时间是在等待从内存中读取指令和数据。因此,在现代通用处理器中,内存和CPU之间通常会有分层结构的cache存在。cache比内存的读写速度要快,但相应的容量更小价格更贵。cache通常采用分层结构配置,越往顶层的cache容量越小,读写速度越快,越往底层的cache容量越大,读写速度越慢。重要性高(读写频率高)的指令和数据放在高层cache中,重要性低(读写频率低)的指令和数据存放在低层cache中。现代通用处理器中,通常采用2-3层的cache架构,分别位level 1(L1),level 2(L2),level 3(L3)等,L1容量最小,速度最快,L3容量最大,速度最慢。从内存中读取的指令和数据都是先存放在cache中,再读取到CPU中进行操作的。CPU执行指令的时候,也是先从cache中获取指令和数据,如果cache中没有所需的指令和数据,即cache miss的时候,CPU再去内存中读取所需数据,但性能会大大降低。


但cache终归要比内存小(即使intel i7核,L3 cache 也仅有8M,相对于4G,8G甚至16G的内存来说确实很小),因此不可能将所有需要的指令和数据都存储在cache上。所以如何将有用的数据留在cache上,将无用的数据从cache上删除,是一个很关键的课题。


指令和数据有各自的特性决定了不同于memory,cache上的指令、数据存储需要分别对待。相对于数据,指令的存储更具有规律性。翻阅过C代码经过编译生成的汇编代码的同学肯定知道,大部分指令为顺序指令,即通常一条一条按顺序执行,即便有jump/br/ret 这样的跳转指令,因为现在处理器有分支预测功能(branch prediction),这些跳转指令的跳转地址大部分也能被提前预测。因而对指令来说,具有很强的规律性和可预测性。因而可以提前知晓需要执行的指令,有用指令可以被存储cache上而无用指令可以从cache上删除,cache miss发生概率较小。


而数据则不同,数据存储和使用具有很大的随机行和不可预测性,无法很准确的将所需数据存储在cache中,因而cache miss发生的可能性较大。因为指令和数据的cache miss概率不同,通用处理器在两者的存储选择上也不同。对于非常珍贵(容量小)的L1 cache,数据和指令是分开存储的,分别存储在L1 instruction cache(L1指令cache)和L1 data cache(L1数据cache)中,因而L1可以看作是哈佛结构。而对于相对较大的L2 cache和L2 cache,数据和指令是统一存储的,因而可以看作是冯诺依曼结构。


综上,在现代通用处理器中,冯诺依曼结构和哈佛结构是相辅相成同时存在的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值