三、高速缓冲存储器
1.概述
问题的提出
指令和数据在主存的地址分布不是随机的,而是相对的簇聚,使得CPU在执行程序时,访存具有相对的局部性,这就称为程序访问的局部性原理。一般Cache采用高速的SRAM制作,其价格比主存贵,但因其容量远小于主存,因此能很好地解决速度和成本的矛盾。
Cache的工作原理
将主存的地址分成两段,高m位表示主存的块地址,低b位表示块内地址,则
2m=M
2
m
=
M
表示主存的块数。缓存的地址也分为两段:高c位表示缓存的块号,低b位表示块内地址,则
2c=C
2
c
=
C
表示缓存块数,且C远小于M。主存与缓存地址中都用b位表示其块内字数,即
B=2b
B
=
2
b
反映了块的大小,称B为块长。
CPU欲读取主存某字时,有两种可能:一种是所需要的字已在缓存中,即可直接访问Cache(CPU与Cache之间通常一次传送一个字);另一种是所需的字不再Cache内,此时需将该字所在的主存整个字块一次调入Cache中(Cache与主存之间是字块传送)。如果主存块已调入缓存块,则称该主存块与缓存块建立了对应关系。
上述第一种情况为CPU访问Cache命中,第二种情况为CPU访问Cache不命中。一个缓存块不能惟一地、永久地只对应一个主存块,故每个缓存块需设一个标记,用来表示当前存放的是哪一个主存块,该标记的内容相当于主存块的编号。CPU读信息时,要将主存地址的高m位(或m位中的一部分)与缓存块的标记进行比较,以判断所读的信息是否已在缓存中。
通常用“命中率”来衡量Cache的效率,命中率是指CPU要访问的信息已在Cache内的比率。在一个程序执行期间,设 Nc N c 为访问Cache的总命中次数, Nm N m 为访问主存的总次数,则命中率h为
设 tc t c 为命中时的Cache访问时间, tm t m 为未命中时的主存访问时间,1-h表示未命中率,则Cache-主存系统的平均访问时间 ta t a 为
用e表示访问效率,则有
为提高访问效率,命中率h越接近1越好。一般而言,Cache容量越大,其CPU的命中率就越高。当Cache容量达到一定值时,命中率已不因容量的增大而有明显的提高。
块长的最优值很难确定,一般每块取4至8个可编址单位较好,也可取一个主存周期所能调出主存的信息长度。
Cache的基本结构
它主要由Cache存储体、地址映射变换机构、Cache替换机构几大模块组成。
(1)Cache存储体
Cache存储体以块为单位与主存交换信息,为加速Cache与主存之间的调动,主存大多采用多体结构,且Cache访存的优先级最高。
(2)地址映射变换机构
地址映射变换机构是将CPU送来的主存地址转换为Cache地址。由于主存和Cache的块大小相同,块内地址都是相对于块的起始地址的偏移量(即低位地址相同),因此地址变换主要是主存的块号(高位地址)与Cache块号间的转换。
(3)替换机构
当Cache内容已满,无法接受来自主存块的信息时,就由Cache内的替换机构按一定的替换算法来确定应从Cache内移出哪个块返回主存,而把新的主存块调入Cache。
(4)Cache的读写操作
1.写直达法,又称为存直达法,即写操作时数据既写入Cache又写入主存,但当Cache数据被替换出去时才写会主存。它能随时保证主存和Cache的数据始终一致,但增加了访存次数。
2.写回法,又称为拷回法,即写操作时只把数据写入Cache而不写入主存,但当Cache数据被替换出去时才写会主存。可见写回法Cache中的数据会与主存中的不一致。Cache中的每一块要增设一个标志位,该位有两个状态:“清”(表示未修改过,与主存一致)和“浊”(表示修改过,与主存不一致)。在Cache替换时,“清”的Cache块不必写回主存,因为此时主存中相应块的内容与Cache块是一致的。在写Cache时,要将该标志位设置为“浊”,替换时此Cache块要写回主存,同时要使标志位为“清”。
在写直达法中,由于Cache中的数据始终和主存保持一致,在读操作时Cache失效时,只需选择一个替换的块(主存块)调入Cache,被替换的块(Cache块)不必写回主存。可见读操作不涉及对主存的写操作。因此这种方法更新策略比较容易实现。但是在写操作时,既要写入Cache又要写入主存,因此写直达法的“写”操作时间就是访问主存的时间。
在写回法中,写操作时只写入Cache,故“写”操作时间就是访问Cache的时间,因此速度快。这种方法对主存的写操作只发生在块替换时,而且对Cache中一个数据块的多次写操作只需一次写入主存,因此可减少主存的写操作次数。但在读操作Cache失效时要发生数据替换,引起被替换的块写回主存的操作,增加了Cache的复杂性。
Cache的改进
采用多个Cache的含义是两方面的:一是增加Cache的级数;二是将统一的Cache变成分立的Cache。
(1)单一缓存和两级缓存
所谓单一缓存,是指在CPU和主存之间只设一个缓存。把这个缓存直接与CPU制作在同一个芯片内,故又称为片内缓存(片载缓存)。片内缓存可以提高外部总线的利用率,因为将Cache制作在芯片内,CPU直接访问Cache不必占用芯片外的总线(系统总线),而且片内缓存与CPU之间的数据通路很短,大大提高了存取速度,外部总线又可更多地支持I/O设备与主存的信息传输,增强了系统的整体效率。
如果在主存与片内缓存之间再加一级缓存,称为片外缓存,由比主存动态RAM和ROM存取速度更快的静态RAM组成。不使用系统总线作为片外缓存与CPU之间的传送路径, 使用一个独立的数据路径,以减轻系统总线的负担。从片外缓存调入片内缓存的速度就能提高,而CPU占用系统总线的时间也就大大下降,整机工作速度有明显的改进。这种由片外缓存和片内缓存组成的Cache称为两级缓存,并称片内缓存为第一级,片外缓存为第二级。
(2)统一缓存和分立缓存
统一缓存是指指令和数据都存放在统一缓存内的Cache;分立缓存是指指令和数据分别存放在两个缓存中,一个称为指令Cache,一个称为数据Cache。两种缓存的选用主要考虑如下两个因素:
1.它与主存结构有关,如果计算机的主存是统一的,则相应的Cache采用统一缓存;如果主存采用指令、数据分开存储的方案,则相应的Cache采用分立缓存。
2.它与机器对指令执行的控制方式有关。当采用超前控制或流水线控制方式时,一般都采用分立缓存。
所谓超前控制,是指在当前指令执行过程尚未结束时就提前将下一条准备执行的指令取出,称为超前取指或指令预取。所谓流水线控制实质上是多条指令同时执行,又可视为指令流水。超前控制和流水线控制特别强调指令的预取和指令的并行执行,因此这类机器必须将指令Cache和数据Cache分开,否则可能出现取指和执行过程对统一缓存的争用。
数据Cache通过存/取单元支持整数和浮点操作;指令Cache为只读存储器,支持指令单元。执行部件是3个可并行操作的整数ALU和一个浮点运算部件。
2.Cache——主存地址映射
由主存地址映射到Cache称为地址映射。地址映射方式很多,有直接映射(固定的映射关系)、全相连映射(灵活性大的映射关系)、组相连映射(上述两种映射的折衷)。
直接映射
每个主存块只与一个缓存块相对应,映射关系式为
i=jmodC i = j m o d C 或 i=jmod2C i = j m o d 2 C
其中,i为缓存块号,j为主存块号,C为缓存块数。
这种方式的优点是实现简单,只需利用主存地址的某些位直接判断,即可确定所需字块是否在缓存中。主存地址高m位被分成两部分:低c位是指Cache的字块地址,高t位(t=m-c)是指主存字块标记,它被记录在建立了对应关系的缓存块的“标记”位中。
直接映射方式的缺点是不够灵活,因每个主存块只能固定地对应某个缓存块,即使缓存内还空着许多位置也不能占用,使缓存的存储空间得不到充分的利用。如果程序恰好要重复访问对应同一缓存位置的不同主存块,就要不停地进行替换,从而降低命中率。
全相连映射
全相连映射允许主存每一字块映射到Cache中的任何一块位置上。这种映射方式可以从已被占满的Cache中替换出任一旧字块。这种方式灵活,命中率也更高,缩小了块冲突率。与直接映射相比,它 的主存字块标记从t位增加到t+c位,这就使Cache“标记”的位数增多,而且访问Cache时主存字块标记需要和Cache的全部“标记”位进行比较,才能判断出所访问主存地址的内容是否已在Cache中。这种比较通常采用“按内容寻址”的相联存储器。
这种方式所需的逻辑电路甚多,成本较高,实际的Cache还要采用各种措施来减少地址的比较次数。
组相联映射
组相联映射是对直接映射和全相联映射的一种折衷。它把Cache分为Q组,每组有R块
Cache字块地址字段由c为变为组地址字段q位,且q=c-r,其中 2c 2 c 表示Cache的总块数, 2q 2 q 表示Cache的分组个数, 2r 2 r 表示组内包含的块数。主存字块标记字段由t位变为s=t+r位。组内2块的组相联映射又称为二路组相联。
组相联映射的含义:主存的某一字块可以按模16映射到Cache某组的任一字块中。主存的第j块会映射到Cache的第i组内,两者之间一一对应,属直接映射关系;另一方面,主存的第j块可以映射到Cache的第i组内的任一块,这又体现出了全相联映射关系。当r=0时是直接映射方式,当r=c时是全相联映射方式。
3.替换策略
先进先出(FIFO)算法
FIFO算法选择最早调入Cache的字块进行替换,它不需要记录各字块的使用情况,比较容易实现,但没有根据访存的局部性原理,故不能提高Cache的命中率。
近期最少使用(LRU)算法
LRU算法比较好地利用访存局部性原理,替换出近期用的最少的字块。它需要随时记录Cache中各字块的使用情况,以便确定那个字块是近期最少使用的字块。它实际是一种推测的方法,比较复杂,一般采用简化的方法,指记录每个块最近一次使用的时间。LRU算法的平均命中率比FIFO的高。
随机法
随机法是随机地确定被替换的块,比较简单,可采用一个随机数产生器产生一个随机的被替换的块,但它也没有根据访存的局部性原理,故不能提高Cache的命中率。