计算机冯诺伊曼体系结构和哈佛体系结构区别和处理器性能评判标准

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎联系我qq2488890051 https://blog.csdn.net/kangkanglhb88008/article/details/89669329

计算机体系结构主要分为两类:冯·诺依曼结构 和哈弗体系

二者的区别就是程序空间和数据空间是否是一体的,冯·诺依曼结构数据空间和地址空间是不分开的,而哈佛结构数据空间和地址空间是分开的。

冯·诺依曼结构 (早期的和现代的微处理器,intel的x86微处理器等)
提前把要执行的程序从硬盘里面复制到内存中,然后在内存中读取指令后,然后再才读取程序需要的变量(也叫操作数)(全局变量或者局部变量,也都是分配在内存中的,看我这篇博客的清楚讲解计算机程序存储分配和c语言函数调用过程),

这样程序和变量都是在内存中,而cpu和内存之间只有一条数据总线相连接,所以只能线取指令再取变量,无法并行化。

早期的和现代的微处理器大多采用冯·诺依曼结构(现在的处理器虽然外部总线上看是诺依曼结构的,但是由于内部CACHE的存在,因此实际上内部来看已经 类似 改进型哈佛结构的了,文章尾我有具体解释),最典型的就是intel的x86微处理器,取指令和取操作数都是在同一总线上,通过分时复用的方式进行,优点是硬件简单,而且在内存里运行指令的话,但是缺点是在高速运行时,不能达到同时取指令和取操作数,从而会形成传输过程的瓶颈。其实程序指令都被放到内存中来执行了,速度也还是挺快的了(毕竟内存芯片的访问速度很高,比cpu慢一百倍左右吧,而硬盘的访问速度比cpu运行速度慢至少慢一万倍(cpu主频好几个GHz),如果程序放在硬盘直接执行,cpu每次都来这里取指令执行的话,将会使得cpu大部分时间都处于等待状态,cpu利用率大大降低,性能得不到发挥

哈佛体系

哈佛总线技术应用是以DSP和ARM为代表的(因为他们的ram(内存)太小了,只有数百KB,放不下那么多程序指令,而且内存还得存变量呀。如果在单片机(本来就是廉价低性能的额处理器)里面集成很大的ram,会使得工艺成本大大提高)。采用哈佛总线体系结构的芯片内部程序空间和数据空间是分开的,这就允许同时取指令和取操作数,从而大大提高了运算能力。  
例如STM320LF240x系列DSP是增强型的哈佛结构通过三组并行的总线访问多个存储空间。它们分别是:程序地址总线(PAB)用于访问flash读取指令,数据地址读总线(DRAB)和数据地址写总线(DWRB)用于在同时在内存中读取变量数据

我们一般用的单片机确实是哈佛体系,但是因为单片机不够高级,实际上还是只有一组共用总线(体系结构与采用的独立与否的总线无关,与指令空间和数据空间的分开独立与否有关,因为单片机就是数据和程序分开存放的,数据放在ram,程序放在flash,所以是哈佛体系结构,属于改进型的哈佛结构),也就是还是得直接从rom(flash)读取指令然后执行,然后在ram(内存)中读取操作数(变量)的方式,由于单片机cpu主频比较低200M或者左右吧,比flash的访问速度快不了多少,所以不怎么会损耗单片机性能(rt1052单片机主频600Mhz,有人做过实验,把程序下载到sram(内存)执行和直接在外部flash芯片中执行的性能对比,好像并没有明显快多少,这就说明,对于单片机而言,这种哈佛体系结构是很适合的,主要是单片机的ram(内存)一般都很小,数百KB罢了,这样的体系结构就能大大节省内存空间,而且性能基本上也没啥影响

上述两种体系结构都是流水线操作(可以实现在刚好执行这条指令的时候并行的得到指令和得到操作数了,那是因为流水线提前已经预测好了,应该说也能几乎同样的解决冯诺伊曼体系结构不能同时读取指令和操作数的问题(虽然哈佛结构从硬件上就能解决这个问题,但是前提也得是存放指令的flash访问速度足够快的前提,但是目前的芯片工艺来看,flash访问速度还是很慢,所以对于电脑还是等高性能的计算机还是得用冯诺伊曼体系结构,而哈佛体系只能运用于一些单片机而已)),其工作都可以分为5个阶段:取指令、指令译码、执行指令、访存取数、结果写回(实际上每个阶段还可以细分成很多阶段),流水线用来实现并行化,即先提前并行的取好指令,译码等等,cpu每次到来来时候只需要执行即可,相当于cpu每个时钟周期都可以执行一条指令(就不需要5次才能执行完这一个指令),这样就可以更加提高cpu性能。但是这里有个问题,提前读取指令,会不会读取到了错误的指令呢(因为cpu此时还正在执行上一条指令嘞),那这个就是指令的分支预测了,一旦预测错误,那么所有后续的译码啥的都得清空从来,也就是流水线等级越深,这个错误纠正就会越大,所以好的预测算法也是提高cpu执行指令效率的关键,据说Intel的最新cpu的流水线已经达到14级了,一般的中等单片机比如stm32也就三四级流水线(缩减流水线可以降低功耗),差的单片机还没有流水线呢。

cach是什么:高速缓冲存储器,集成在cpu芯片内部的,和内存芯片不是一样的存储技术,是跟寄存器一样的工艺,但是存储空间很小, 访问速度贼快,接近cpu速度了

分为指令cach(就是可以存少量的代码)和数据cach(存少量的内存中的变量)

cach可以把频繁访问或者接下来很有可能访问的指令和数据分别加载进入对应的cach,然后cpu在取指令或者数据的时候,先在指令cach或者数据cach瞅瞅,如果已经存在了,那么cpu就直接读取了,如果不在cach里,就去内存里面读取,如果这个是经常需要访问的指令或者数据(需要一定的算法才能预测出哪些是经常访问的数据,以cach提高命中率),那么cpu就自动把他们copy一份放在对应的cach里,下次访问的时候就容易在这里面找到了(那么容不容易在这里面发现目标数据,叫做cach命中率)

比如在stm32h743单片机,context-m7内核,属于高端单片机了,就带了这两个cahe

//使能STM32H7的L1-Cache,同时开启D cache的强制透写,I-cach是指令缓存,D-cach是数据缓存
void Cache_Enable(void)
{
    SCB_EnableICache();    //使能I-Cache,函数在core_cm7.h里面定义
    SCB_EnableDCache();    //使能D-Cache,函数在core_cm7.h里面定义 
    SCB->CACR|=1<<2;    //强制D-Cache透写,如不开启透写,实际使用中可能遇到各种问题
}

因为cpu假如了改变了某个已经存在于D-cach的经常使用的变量的值,现在cpu需要在D-cach和内存中同时更新才行,即强制D-Cache透写,(会需要cpu多执行几个语句透写进去,降低了cpu一点儿性能)。假如我们不开启透写,那么cpu可能只更新这个变量在D-cach中的值,下次cpu再访问这个变量的时候,首先肯定会先在D-cach中访问它且读取他的值,这个没问题,但是假如由于D-cach新加入的一些变量挤掉了这个变量(因为cach存储空间有限),那么在D-cahe就就找不到这个变量了,就得去内存访问,而内存中这个变量上一次却没有被更新,所以读取到的还是上上次的值,那么程序运行肯定就计算出一个错误的结果了。

整个过程(是否新加入指令或者数据进cach或者没有命中后就去内存读取这个过程)对于程序员都是透明的,即程序员根本不知道这个过程的发生,因为是操作系统自动完成的。

如果处理器的I-cahe和D-cahe跟cpu是两组独立的通信总线连接的(现在的处理器就是这样设计的,将指令cache和数据cache相分离,主要是为了避免资源冲突,cpu可以互不影响的分别同时读取到cahe了),那么cpu是可以并行访问到指令和操作数(变量)的,也就从处理器内部实现了哈佛体系结构(跟流水线方式异曲同工之妙),提高了指令执行速度。

因为cach存储空间有限,那么为了进一步提高速度,就干脆做多级cach缓存,所以现在的计算机cpu就有一二三级缓存,而且缓存大小也不一样,当然是越大越好,但是也越贵。

一个程序是由一系列指令组成的集合,然后进行特定的计算,计算的过程就是在不断读取指令和需要的数据后,进行计算然后回写进入存储器的过程。但是计算的过程也可以笼统的称为一条指令的运行,所以下面说的指令执行快慢仅仅指没有计算功能那类指令。注:主频代表着cpu处理数据的快慢(计算速度),比如访问存储器然后得到数据给加法器等运算器,然后进行加减乘除等等。

所以我们可以看出,衡量一个cpu性能的主要方面就是计算快慢和指令执行快慢:对应的就是主频和指令执行的快慢(专业术语是:每秒执行多少百万条指令,MIPS参数,很多cpu都会标明这个参数,比如1t的51单片机为1MIPS,stm32f103是72M主频的1T单片机,那么理论可以达到72MIPS,理论上电脑cpu可以达到几千MIPS吧)。

而指令执行的快慢跟流水线等级,cpu主频(不是唯一因素),cpu带了多少级多大的cach缓存,外部内存条的访问速度(比如金士顿和三星的内存条访问速度可能就不一样,所以访问速度这是买内存条时候的一个重要参数)等。

所以cpu性能跟主频没有直接联系。

所以总结来看,衡量一个cpu性能强弱,就看主频和MIPS(因为这个参数是包含了缓存cach大小,外在的内存条等的综合效果)两个参数即可(那些coreMark跑分软件测量一个处理器性能得分,也就是跑相同的一段程序(包含了大量计算),记录执行时间多少,越短,说明综合计算能力越强,指令执行速度也更快,从而分数更高)

最后说一下关于cpu超频:

处理器的频率是由晶振频率乘以内部锁相环的倍频系数来的,一般外部晶振频率在主板设计好后就是固定的了,而倍频系数是可以通过代码来设置的,一般而言cpu出厂前已经经过多次测试,小于多少频率能够使得cpu长时间稳定工作,所以倍频系数一般就设置为这个对应的值就行了,但是如果计算量太大的时候,可以允许短时间设置高一点这个倍频系数,从而实现cpu超过额定频率而工作,也就是实现了超频,但是因为cpu超过了稳定工作的频率,所以,功耗升高(功耗与cpu运行频率正相关),芯片会产生大量热量,温度升高,cpu内频与主板上的外频不匹配等等,从而可能会引起运行不稳定,死机,烧机等现象,所以在cpu散热好的情况下,可以偶尔短时间超频罢了。所以买电脑还是买那种cpu原本标定的频率就很高的,这样性能强又稳定。

猜你喜欢

转载自blog.csdn.net/kangkanglhb88008/article/details/89669329