标签:style http ar color os 使用 sp strong 文件
不管是台式机还是笔记本的CPU,处理器的二/三缓存都是极其重要的一个数量,一方面是被厂家宣传的重点,另一方面也确实影响着电脑的速度。同时在内存不足的电脑里,增加内存对系统的性能提升往往有着立杆见影的效果。于是玩家不禁要问,为什么CPU的缓存和内存对系统的性能影响这么大呢?这就得从计算机的存储系统的工作方式和原理谈起。
存储器是计算机中用于存放指令和数据的部件。计算机在处理数据时,中央处理器从存储器读出指令,再按照指令中的地址从存储器中读出数据,按照指令要求对数据进行操作。中央处理器的高速运算要求存储器要在很短的时间内完成指令和数据的存取操作。
计算机层次结构存储器
随着对计算机性能的要求越来越高,现代计算机对存储系统有三个基本要求,即:存取时间短(速度快)、存储容量大和价格成本低。而容量越大存取的时间就会长,速度越快,价格就越高。为了解决这个问题,便采用了高速缓冲存储器,主存储器和辅助存储器3个部分组成。
其中寄存器(Registe)是用于CPU内部各单元之间的周转,是CPU内部用来创建和储存CPU运算结果和其它运算结果的地方,拥有非常高的读写速度,里面的数据是下一步必然会用到的,所以寄存器不属于层次结构存储器。CPU内部的寄存器有很多种类型。CPU对存储器中的数据进行处理时,往往先把数据取到内部寄存器中,而后再作处理。外部寄存器是计算机中其它一些部件上用于暂存数据的寄存器,它与CPU之间通过“端口”交换数据,外部寄存器具有寄存器和内存储器双重特点。而通用寄存器的数据宽度决定了处理器一次可以运行的数据量。
X86-64技术就是新增的几组CPU寄存器将提供更快的执行效率。标准的32位的x86架构包括8个通用寄存器,AMD在64 位X86架构中又增加了8组,将寄存器的数目提高到了16组。X86-64寄存器默认位64-bit。还增加了8组128-bit XMM寄存器,将能给单指令多数据流技术运算提供更多的空间,这些128位的寄存器将提供在矢量和标量计算模式下进行128位双精度处理,为3D建模、矢量分析和虚拟现实的实现提供了硬件基础。通过提供了更多的寄存器,按照X86-64标准生产的CPU可以更有效的处理数据,可以在一个时钟周期中传输更多的信息。
高速缓冲存储器就是我们平常所说的CPU缓存,通常包括一级、二级缓存,过去的高端产品还会有三级缓存,现在中低端产品也有L3了,比如AMD羿龙II双核系列,Intel的i3系列。关于高速缓存,后面会有更详细的介绍。
主存储器就是我们常说的内存条。高速缓冲存储器和主存储器(内存条)由于可以直接被CPU读取,故称之为内存储器。
辅助存储器主要是指硬盘,而海量存储器则是指过去主要用的磁带机一类的设备,现在随便硬盘技术的提升,辅助存储器也可以达到“海量”的标准。而且现在的辅助存储器一般都带有自身的缓存。
介绍完存储结构后,可能会产生一个疑问,那就是为什么层次结构存储器会加速计算机的速度,或者说层次结构的依据是什么?
下面就得引入必备的“程序的局部性原理”知识了。
程序的局部性原理:是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个存储区域。局部性原理又表现为:时间局部性(temporal locality)和空间局部性(spatial locality)。
时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执 行;如果某数据被访问,则不久之后该数据可能再次被访问。
空间局部性是指一旦程序访问了某个存储单元,则不久之后。其附近的存储单元也将被访问。
空间局部性和时间局部性是有区别的。空间局部性指执行涉及很多簇聚的存储器单元的趋势,这反映了处理器顺序访问指令的倾向,同时,也反映了程序顺序访问数据单元的倾向,如处理数据表。时间局部性指处理器访问最近使用过的存储器单元的趋势,例如,当执行一个循环时,处理器重复执行相同的指令集合。
传统上,时间局部性是通过将最近使用的指令和数据值保存到高速缓存中并使用高速缓存的层次结构实现的。空间局部性通常是使用较大的高速缓存并将预取机制集成到高速缓存控制逻辑中实现的。
举例:当硬盘受到CPU指令控制开始读取数据时,硬盘上的控制芯会控制磁头把正在读取的簇的下一个或者几个簇中的数据读到硬盘的缓存中(由于硬盘上数据存储时是比较连续的,所以读取命中率较高),当需要读取下一个或者几个簇中的数据的时候,硬盘则不需要再次读取数据,直接把缓存中的数据传输到内存中就可以了,由于速度远远高于磁头读写的速度,所以能够达到明显改善能的目的,即根据空间局部性原理,预测下一步所需要的数据,并将其提前写入内存。
为了保证CPU访问时有较高的命中率,内存储器(包括CPU缓存和内存)中的内容应该按一定的算法替换。较常用的算法是“最近最少使用算法”(LRU算法),它是将最近一段时间内最少被访问过的行淘汰出局。因此需要为每行设置一个计数器,LRU算法是把命中行的计数器清零,其他各行计数器加1。当需要替换时淘汰行计数器计数值最大的数据行出局。这是一种高效、科学的算法,其计数器清零过程可以把一些频繁调用后再不需要的数据淘汰出,提高利用率。这样内存储器中的数据在更新的时候则会根据时间局布性原理把读取频率高的及其周围的相关数据留下,把低导入虚拟内存或者淘汰掉(关于虚拟内存后面会有描述)。
在层次存储结构中的每一级都采用程序局部分布原理的原理来预读和更替数据。由于预读的命中率很高,故续约了时间,这也是采用层次存储结构的基础。
现在高速缓存的概念已被扩充,不仅在CPU和主内存之间有高速缓存而且在内存和硬盘之间也有Cache(磁盘高速缓存),乃至在硬盘与网络之间也有某种意义上的 Cache(Internet 临时文件夹)——凡是位于速度相差较大的两种硬件之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。Cache与上下流之间的数据交换都是程序局部性原理。这次我们主要讨论CPU的高速缓存,前面已经介绍了CPU高速缓存是内存储器的一种,下面将介绍其产生的原因及演变。
早期计算机的CPU与主存的工作速度较为接近,主内存的速度并不影响整机的运算速度。随着IC设计和半导体制造工艺的发展,CPU的运行速度远高于主内存的速度。这要求系统中主存的存取速度提高,存储容量增大。而主存储器一般采用DRAM (动态随机存储器) ,其容量的提高是比较快的,但是读取速度的提高却很慢,因此在速度上与CPU主频的提高产生了不相配的情况。为解决高速CPU 与低速内存之间的速度差异,最经济、有效的方法是在两者之间插入容量不大但操作速度很高的存储器高速缓存(Cache) ,起到缓冲作用,解决了两者速度的平衡和匹配问题,对微处理器整体性能有很大提高。
486时代的两个代表产品486DX和486SX
早期的80486相当于把80386和完成浮点运算的数学协处理器80387以及8kB的高速缓存集成到一起,这种片内高速缓存称为一级(L1)缓存,80486还支持主板上的二级(L2)缓存。缓存概念由此诞生,并一直延续到今天成为影响CPU性能的重要因素。
随着CPU制造工艺的发展,二级缓存和三级缓存也能轻易的集成在CPU内核中,容量也在逐年提升。至今,在中低端产品中集成三级缓存的CPU也不少见。
当然,有人可能要问,为什么不直接把内存的速度提高到和缓存一样快呢?这涉及到两个方面,为了得到更高的速度,那信号的发射频率必须提升,而为了得到更大的容量,就必须减少集成电路中信号传输中存在干扰,干扰与传播速度又正相关,如果频率提高,干扰就会增强,所以两者比较难以统一。
另一方面是“经济”原因,高速缓存缓存通常都是静态RAM (SRAM),速度是非常的快, 但是静态RAM集成度低,存储相同的数据,静态RAM的体积是动态RAM的6倍,高同容量的静态RAM价格是动态RAM的四倍。这就限制了静态RAM容量的进一步扩大,同时缓存大小也成了CPU级别的一个重要标志。
虽然我们知道了高速缓存可以大幅的提高CPU的速度,那么,它们工作的具体原理是什么呢?
当CPU处理数据时,它会先到Cache中去寻找,如果数据因之前的操作已经读取而被暂存其中,就不需要再从内存中读取数据——由于CPU的运行速度一般比主内存的读取速度快,主存储器周期(访问主存储器所需要的时间)为数个时钟周期。因此若要访问主内存的话,就必须等待数个CPU周期从而造成浪费。
Cache由控制和存储器2部分组成,如上图所示,其中虚线框内为控制部分。Cache的存储器中存放着主存的部分拷贝,其控制部分有3 个功能:
(1) 判断要访问的数据是否在Cache中,若在,为命中;否则,为未命中。
(2) 命中时,进行Cache 的寻址。
(3) 未命中时,按替换原则,确定主存中的信息块要读入到Cache 中的哪个信息块空间。
CPU在缓存中找到有用的数据被称为命中,当缓存中没有CPU所需的数据时(这时称为未命中),CPU才访问内存。从理论上讲,在一颗拥有一级缓存的CPU中,读取一级缓存的命中率为80%。也就是说CPU一级缓存中找到的有用数据占数据总量的80%,剩下的20%从二级缓存中读取。由于不能准确预测将要执行的数据并将其预读到缓存中,读取二级缓存的命中率也在80%左右(从二级缓存读到有用的数据占总数据的16%)。那么还有的数据就不得不从内存调用,但这已经是一个相当小的比例了。较高端的CPU中,还会带有三级缓存,它是为读取二级缓存后未命中的数据设计的—种缓存,在拥有三级缓存的CPU中,只有约5%的数据需要从内存中调用,这进一步提高了CPU的效率。
拥有144MB缓存的八路IBM POWER5处理器
但这个比例也不是绝对的,因为随着软件的发展,需要越来越多的缓存来预存将要运算的数据,如果缓存的容量不随着软件的发展而增大,就会出现不够用的情况。
另外在处理器缓存的发展中,Intel和AMD的处理器一级缓存在逻辑结构设计上在Core之前并不一样。AMD对一级缓存的定位是“实数据读写缓存”,基于该架构的一级数据缓存主要用于存储CPU最先读取的数据;而更多的读取数据则分别存储在二/三级缓存和系统内存当中。即二级/三级缓存中的一部分数据都要在一定的规则下搬到一级缓存中。二级缓存的容量自然对AMD CPU的整体性能影响小些。相对的,AMD则总是试图把一级缓存做的更大些。
Intel在对Core之前一级缓存的理解是“数据代码指令追踪缓存”,即是说一级缓存中存储的其实只是二级缓存中数据的地址,而不是这些数据的复制。由于一级数据缓存不再存储实际数据,因此“数据代码指令追踪缓存”设计能够极大地降CPU对一级数据缓存容量的要求,降低处理器的生产难度。但这种设计的弊端在于数据读取效率较“实数据读写缓存设计”低,而且对二级缓存容量的依赖性非常大。
事实上CPU性能对二级缓存容量的“敏感”与否还受到诸如内存控制器,流水线长度、频率、总线架构和指令集等等多方面的影响。在多核CPU中还关乎各个物理内核之间的数据交换问题。从Core开始,Intel开始采用“实数据读写缓存”,而目前最新的Nehalm架构则像AMD一样,把内存控制器集成在CPU内部,并更新了总线。这一方面说明了AMD在CPU架构设计上的强项,另一方面在Intel采用AMD的这种占优势的存储架构之后,AMD的优势将被进一步削弱。
这里还涉及到一个问题:CPU提供给Cache的地址是主存的地址,要访问Cache,就必须将这个地址变换成Cache 的地址,这种地址变换为地址映射,Cache的地址映射有直接映射、全相联映射和组相联映射三种,目前的主流CPU都是采用组相联。
我们常说的虚拟内存与前面的层次存储结构是不一样。先看虚拟内存的定义:虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。虚拟内存就是当物理内存不足够的时候,把硬盘的一部分当作内存内部数据的周转,而不是当做内存来使用。
比如当我们运行某程序时候占用了15M,不管此时内存的空闲空间够不够15M,系统都会用虚拟内存技术在硬盘上指定了一个虚拟空间,如果我们的物理内存够用,则此时这个虚拟空间里面没有信息而已 。当物理内存不足的时候,系统则会将些时内存里暂时用不上的程序存放到原先给它指定的虚拟空间中,然后留出地方给新的程序使用,在物理内存再次空闲,或者被存入虚拟空间的程序需要再次运行时,便会再将其读入内存。这样一个循环交换过程就是虚拟内存技术,为什么叫它虚拟呢,因为系统把文件释放到了硬盘上,而这个硬盘可不是内存,只是临时的保存内存信息的地方,这个区域并不可以被CPU读取和运算。
如果没有虚拟内存技术,我们在物理内存不够用的时候根本就启动不了新的程序,因为新的程序不能在内存中写入相关信息。虚拟内存的功能和作用都不属于计算机的层次存储结构,仅仅是操作系统单独对内存的一种管理方案。
现在主流的配机内存已经升级到2G,稍微好点儿的都采用了4G,这样大的内存很少出现用满的情况,于是有人提出是不是可以禁用虚拟内存?不可以,至少在目前的软件环境这样做是不行的,因为从1961年虚拟内存诞生以来,虚拟内存技术已经成各种计算机操作系统和许多应用软件在编写时的一个规范,即使主内存足够用,有些程序也仍然需要虚拟内存的支持,如果禁掉虚拟内存会影响系统的稳定性和程序的兼容性。
本文总结:
本文讲述了计算机的存储层次,其中以CPU的高速缓存为主,而且其它的方面如硬盘的缓存,内存与硬盘之间都采取了与CPU高速缓存相同的原理来实现系统的加速。
提供“高速缓存”的目的是为了让数据访问的速度适应CPU的处理速度,其基于的原理是内存中“程序执行与数据访问的局部性原理”,即一定程序执行时间和空间内,被访问的代码集中于一部分。为了充分发挥高速缓存的作用,不仅依靠“暂存刚刚访问过的数据”,还要使用硬件实现的指令预测与数据预取技术——尽可能把将要使用的数据预先从内存中取到高速缓存里。
可以这么说,以CPU缓存为代表的所有的层次存储结构都是以程序局部性原理为基础的空间换取速度。另外,CPU的寄存器和虚拟内存虽然不属于层次存储结构,但对计算机的速度和程序运行的稳定性都有非常积极的意义。
转载:http://cpu.zol.com.cn/194/1946150_all.html
标签:style http ar color os 使用 sp strong 文件
原文地址:http://www.cnblogs.com/chenying99/p/4116642.html