十九、流水线和高速缓存
一、中央处理器(CPU)
微处理器(中央处理器)是由控制器和运算器组成的一个新元器件,它的英文缩写叫做CPU。
CPU的速度很快,尽管振荡器(时钟)的频率不能完全代表处理器的速度和性能,但还是具有参考意义。
几十年前,处理器还在几兆赫兹(MHz)的频率下工作,但是现在这个数值已经提高到了几个吉赫兹(GHz),增加了1000倍。
为了直观,我们通常更喜欢用每秒钟可以执行的指令数来衡量CPU的速度,这个数值在现代计算机中的CPU中,每秒可以是几百万条指令到几亿条指令。
CPU的工作大概几个步骤:从存储器取指令、译码、执行指令。
理想情况下,当一条指令执行完成后,CPU立马执行下一条指令,中间不应该存在时间上的延迟。
但事实上并非如此,CPU并不是孤立地工作,需要一大堆外围设备的配合,为它提供数据,遗憾的是这些东西的速度跟不上CPU的速度。
比如,每次你用U盘复制文件的时候,总能在屏幕上得到一个进度条,这不能怪处理器太慢,是你的U盘不够快。
主板就像是一个国家的铁路,公路,光缆等
CPU是插在主板上,就可以通过主板控制所有插到主板或者出厂的时候就和主板成为一体的元器件通信了。
当我们要运行硬盘中的一些程序的时候,首先程序会进入到RAM(内存)中。
因为CPU和内存交流速度比较快,和硬盘交流速度比较慢(效率低)
即使CPU和内存交流速度快,也仅仅是相对于CPU和硬盘的交流速度做比较。
内存的速度还是赶不上CPU的速度。
举个例子:
假设执行一条指令,理想状态是振荡器产生7次脉冲信号即可完成。(移动数据,打开传输门,关门传输门,送入运算器等等)
可实际上需要振荡器产生50次脉冲信号才能完成,中间多出来的这些时钟周期,完全是为了等待而临时插入的。
就拿一条汇编指令举例说明吧:
MOV RA,[0x11]
比如,上述汇编指令的意思是,定位内存地址0x11的存储单元,并获取其中的数据,传送到寄存器RA中。
CPU收到脉冲信号,开始从内存中取出这条指令。
可是内存把这条指令传到CPU内部的时候(这是需要一定的时间,虽然这个时间对于我们人类来说,几乎感受不到,但对于振荡器的速度而言,这个速度比它慢,它需要等等),这个时候已经发生过几十次脉冲信号。
(在发生几十次脉冲信号的时候,CPU也源源不断地收到脉冲信号的激励,但却不可以做任何事情的,因为还没有把MOV RA,[0x11]获取到呢)
等这条指令传到了CPU内部的时候,CPU通知译码器开始解释翻译这条指令,这个时候又发生过几十次脉冲信号。
(在发生几十次脉冲信号的时候,CPU也源源不断地收到脉冲信号的激励,但却不可以做任何事情的,因为还没有把MOV RA,[0x11]翻译完呢)
译码器解释完之后,CPU要开始执行这条指令,执行的过程中,这个时候又发生过几十次脉冲信号。
(在发生几十次脉冲信号的时候,CPU也源源不断地收到脉冲信号的激励,但却不可以做任何事情的,因为还没有把MOV RA,[0x11]执行完呢)
直到CPU,把这条指令终于执行完之后,再次收到脉冲信号的时候,才可以开始获取下一条指令执行了。
二、流水线的技术
CPU的工程师科学家们为了让CPU能够在单位时间执行更多的指令,充分发挥它的性能,而不是老是休息,等待,就想到了一种类似“流水线的技术”
查看动图对比
使用流水线技术,现在的计算机可以改进其设计和结构,允许在一个时钟周期内运行多条指令,这称为超表量体系结构。
尽管看起来非常了不起,但是流水线技术并不如我们想象中的那样完美,有很多潜在的因素会影响它的效率。
比如对于一条跳转指令,当它开始执行的时候,后面的两条指令以及进入了流水线,在这种情况下,CPU只能清空流水线,从将要跳转到的新的目标地址那里重新获取读取指令。
解决这个问题的方法就是为CPU增加分支预测功能。
通过为CPU增加额外的电路,来预测将要发生的跳转。
分支预测不会百分之百成功,但总比猝不及防要好多的多。
充其量预测失败了,清空流水线,使CPU速度变慢,但不会比这更坏。
三、高速缓存技术
字面上的意思是速度很快的缓存存储器,类似蓄水池,程序在被执行的过程中常常会访问最近刚刚访问的数据,或者该位置附近的数据。
而有一种存储器,是在RAM的基础上改造的,叫做SRAM,但是制造成本很高,不能像内存那样,设计那么大的存储空间被大规模使用。
但可以设计的小一点,在CPU和内存之间放一小块SRAM,当处理器从一个新的内存地址开始执行时,将那一整片的东西都搬到这块SRAM中。
这样一来,下次要访问的内容正好再SRAM中,不用再到内存中去取,从而节省了时间。(访问内存比访问SRAM需要更长的时间)
这一小块SRAM就是缓存,也就是我们经常在技术文章立马看到的单词“Cache”。
RAM内存可以理解是硬盘的缓存,SRAM又可以理解成RAM的缓存,缓存的目的都是为了能够尽量的提升和CPU交换数据的速度。