![]() |
Cache 的逻辑结构 |
技术分析编辑本段回目录
![]() |
存储层次结构 |
CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入Cache中,可以使得以后对整块数据的读取都从Cache中进行,不必再调用内存。
正是这样的读取机制使CPU读取Cache的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在Cache中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先Cache后内存。
![]() |
缓存 |
Intel从Pentium开始将Cache分开,通常分为一级高速缓存L1和二级高速缓存L2。在以往的观念中,L1Cache是集成在CPU中的,被称为片内Cache。在L1中还分数据Cache(I-Cache)和指令Cache(D-Cache)。它们分别用来存放数据和执行这些数据的指令,而且两个Cache可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能。
在P4处理器中使用了一种先进的一级指令Cache——动态跟踪缓存。它直接和执行单元及动态跟踪引擎相连,通过动态跟踪引擎可以很快地找到所执行的指令,并且将指令的顺序存储在追踪缓存里,这样就减少了主执行循环的解码周期,提高了处理器的运算效率。
以前的L2Cache没集成在CPU中,而在主板上或与CPU集成在同一块电路板上,因此也被称为片外Cache。但从PⅢ开始,由于工艺的提高L2Cache被集成在CPU内核中,以相同于主频的速度工作,结束了L2Cache与CPU大差距分频的历史,使L2Cache与L1Cache在性能上平等,得到更高的传输速度。L2Cache只存储数据,因此不分数据Cache和指令Cache。在CPU核心不变化的情况下,增加L2Cache的容量能使性能提升,同一核心的CPU高低端之分往往也是在L2Cache上做手脚,可见L2Cache的重要性。现在CPU的L1Cache与L2Cache惟一区别在于读取顺序。
![]() |
CACHE存储器 |
CPU在Cache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问内存。从理论上讲,在一颗拥有2级Cache的CPU中,读取L1Cache的命中率为80%。CPU从L1Cache中找到的有用数据占数据总量的80%,剩下的20%从L2Cache读取。由于不能准确预测将要执行的数据,读取L2的命中率也在80%左右(从L2读到有用的数据占总数据的16%)。在一些高端领域的CPU(像Intel的Itanium)中,L3Cache,它是为读取L2Cache后未命中的数据设计的—种Cache,在拥有L3Cache的CPU中,只有约5%的数据需要从内存中调用,这进一步提高了CPU的效率。
为了保证CPU访问时有较高的命中率,Cache中的内容应该按一定的算法替换。算法是“最近最少使用算法”(LRU算法),它是将最近一段时间内最少被访问过的行淘汰出局。因此需要为每行设置一个计数器,LRU算法是把命中行的计数器清零,其他各行计数器加1。当需要替换时淘汰行计数器计数值最大的数据行出局。这是一种高效、科学的算法,其计数器清零过程可以把一些频繁调用后再不需要的数据淘汰出Cache,提高Cache的利用率。
工作原理编辑本段回目录
![]() |
工作原理1 |
![]() |
原理模型 |
基本结构编辑本段回目录
![]() |
全相联映像方式 |
全相联Cache
在全相联Cache中,存储的块与块之间,以及存储顺序或保存的存储器地址之间没有直接的关系。程序可以访问很多的子程序、堆栈和段,而它们是位于主存储器的不同部位上。因此,Cache保存着很多互不相关的数据块,Cache必须对每个块和块自身的地址加以存储。当请求数据时,Cache控制器要把请求地址同所有地址加以比较,进行确认。这种Cache结构的主要优点是,它能够在给定的时间内去存储主存器中的不同的块,命中率高;缺点是每一次请求数据同Cache中的地址进行比较需要相当的时间,速度较慢。
![]() |
直接映射方式 |
不同于全相联Cache,地址仅需比较一次。在直接映像cache中,由于每个主存储器的块在cache中仅存在一个位置,因而把地址的比较次数减少为一次。其做法是,为Cache中的每个块位置分配一个索引字段,用Tag字段区分存放在Cache位置上的不同的块。单路直接映像把主存储器分成若干页,主存储器的每一页与cache存储器的大小相同,匹配的主存储器的偏移量虽可以直接映像为cache偏移量。Cache的Tag存储器(偏移量)保存着主存储器的页地址(页号)。以上可以看出,直接映像cache优于全相联Cache,能进行快速查找,其缺点是当空存储器的组之间做频繁调用时,cache控制器必须做多次转换。
组相联Cache是介于全相联Cache和直接映像Cache之间的一种结构。这种类型的cache使用了几组直接映像的块,对于某一个给定的索引号,可以允许有几个块位置,因而可以增加命中率和系统效率
DRAM一致性编辑本段回目录
![]() |
读写结构 |
贯穿读出式(LookThrough)
该方式将Cache隔在CPU与主存之间,CPU对主存的所有数据请求都首先送到Cache,由Cache自行在自身查找。如果命中,则切断CPU对主存的请求,并将数据送出;不命中,则将数据请求传给主存。该方法的优点是降低了CPU对主存的请求次数,缺点是延迟了CPU对主存的访问时间。
旁路读出式(LookAside)
在这种方式中,CPU发出数据请求时,并不是单通道地穿过Cache,而是向Cache和主存同时发出请求。由于Cache速度更快,如果命中,则Cache在将数据回送给CPU的同时,还来得及中断CPU对主存的请求;不命中,则Cache不做任何动作,由CPU直接访问主存。它的优点是没有时间延迟,缺点是每次CPU对主存的访问都存在,这样,就占用了一部分总线时间。
![]() |
读写模型 |
任一从CPU发出的写信号送到Cache的同时,也写入主存,以保证主存的数据能同步地更新。它的优点是操作简单,但由于主存的慢速,降低了系统的写速度并占用了总线的时间。
回写式(CopyBack)
为了克服贯穿式中每次数据写入时都要访问主存,从而导致系统写速度降低并占用总线时间的弊病,尽量减少对主存的访问次数,又有了回写式。它是这样工作的:数据一般只写到Cache,这样有可能出现Cache中的数据得到更新而主存中的数据不变(数据陈旧)的情况。但此时可在Cache中设一标志地址及数据陈旧的信息,只有当Cache中的数据被再次更改时,才将原更新的数据写入主存相应的单元中,然后再接受再次更新的数据。这样保证了Cache和主存中的数据不致产生冲突。
分级体系编辑本段回目录
![]() |
分级体系 |
L1Cache的设计有在片一级分离和统一设计两种方案。
Intel、AMD、原DEC等公司将L1Cache设计成指令Cache与数据Cache分离型。因为这种双路高速缓存结构减少了争用高速缓存所造成的冲突,改进了处理器效能,以便数据访问和指令调用在同一时钟周期内进行。但是,仅依靠增加在片一级Cache的容量,并不能使微处理器性能随之成正比例地提高,还需设置二级Cache。在L1Cache结构方面,一般采用回写式静态随机存储器(SRAM)。L1Cache容量有加大的趋势。
![]() |
存储单元 |
AMDK6-3内置的256kBL2Cache与CPU同步工作。外置L2Cache,一般都要使二级Cache与CPU实现紧密耦合,并且与在片一级Cache形成无阻塞阶层结构。同时还要采用分离的前台总线(外部I/O总线)和后台总线(二级Cache总线)模式。显然,将来随着半导体集成工艺的提高,如果CPU与二级Cache集成在单芯片上,则CPU与二级Cache的耦合效果可能更佳。由于L2Cache内置,因此,还可以在原主板上再外置大容量缓存1MB~2MB,它被称为L3Cache。
技术发展编辑本段回目录
![]() |
CACHE存储器结构 |