Cache的工作原理

高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。 Cache的功能是用来存放那些近期需要运行的指令与数据。目的是提高CPU对存储器的访问速度。为此需要解决2个技术问题:一是主存地址与缓存地址的映象及转换; 二是按一定原则对Cache的内容进行替换。

主要由三大部分组成:

Cache存储体:存放由主存调入的指令与数据块。

地址转换部件:建立目录表以实现主存地址到缓存地址的转换。

替换部件:在缓存已满时按一定策略进行数据块替换,并修改地址转换部件。

通过Q/A来对cache的相关知识进行阐述:

Q1:一个块可以放在cache的哪里?

块放置策略可分为三种cache组织形式:

直接映射:一个块可以放到cache中的唯一的位置上

全相联:一个块可以放到cache中的任意的位置上

组相联:一个块可以放到cache的受限的组里,该块可以放置到组内的任意一个块里

Q2:一个块在cache中,如何找到它?

Cache与主存都分成块,每块由多个字节组成,主存和cache中的块大小相等。在一个时间段内,Cache的某块中放着主存某块的全部信息,即Cache的某一块是主存某块的副本(或叫映像),如图1所示:

Cache除数据部分外,还应记录放在某块中的信息是主存中哪一块的副本。因此,还应有第二个组成部分,即标记(tag)——记录主存块的块地址信息。

采用Cache后,进行访问存储器操作时,不是先访问主存,而是先访问Cache。由于Cache数据块和主存块大小相同,因此主存地址的低地址部分(块内地址)可作为Cache数据块的块内地址;而主存地址的高地址部分(主存块号)与主存块和Cache块之间的映像关系有关:

(1)直接映像模式下的地址映射

设主存分为4096块,因此其块的标志位应该是12位(4096=212),用16进制表示为000H~FFFH;按照同样大小,cache被分为16块(同4096一样,为假设值),因此cache的标志位应该是4位(24),即0H~FH,根据直接相联模式下的映射规则,主存和缓存的块对应应如下图所示:

主存中的块只能放入与其块号的后四位相同的cache中,即主存中的块只能跟其块号最后一位指定的cache块号建立映像联系。根据这种约定,某一主存块和Cache建立起映像关系时,该Cache块的标记部分只需记住主存块的高2位十六进制数。例如,第010H号主存块当前和Cache第0块建立起映像关系,则Cache第0块的标记部分只需记住01H。由此可见,当用主存地址访问Cache时,主存的块号可分解成Cache标记和Cache块号两部分。如图3所示:

Cache的工作原理_第1张图片

设当前010号主存块在Cache中,即它和Cache的第0块建立起映像关系。现要对两个主存地址单元进行读操作,第一个地址的高3位(十六进制)为0l0H,第二个地址的高3位(十六进制)为020H。

CPU进行读操作时,首先用主存地址的中间部分——Cache块号找到Cache中的一块(对此例,为第0块,对应步骤(1)),读出此块的标记(对此例,现在为01H),然后拿它与主存地址的高位部分——标记进行比较(步骤(2))。对于第一个主存地址,比较的结果是相等的。这表明主存地址规定的块在Cache中(有副本),这种情况称为命中步骤(3:a、4:a)。此时用主存地址的低位部分——块内偏移从Cache块号所选择的块中读取所需的数据。

对于第二个主存地址,比较的结果不相等(3:b)。 这表明主存地址所规定的块不在Cache中,称为未命中,这时需要访问主存,并且将含有该地址单元的主存块的信息全部装入Cache的第0块,并修改第0块Cache标记,使其值为02H。如图4所示:

采用直接映像Cache的某一块只能和固定的一些主存块建立映像关系,主存的某一块只能对应一个Cache块。直接映像的优点是硬件简单、成本低;缺点是不够灵活,主存的若干块只能对应惟一的Cache块,即使Cache中还有空位,也不能利用。

(2)全相联模式下的地址映射

采用全相联映像时,Cache的某一块可以和任一主存块建立映像关系,由于Cache的某一块可以和任一主存块建立映像关系,所以Cache的标记部分必须记录主存块块地址的全 部信息。例如,主存分为2n块,块的地址为n 位,标记也应为n位。

采用全相联映像方式时,主存地址被理解为由两部分组成:标记(主存块号)和块内地址。 CPU在访问存储器时,为了判断是否命中,主存地址的标记部分需要和Cache的所有块的标记进行比较。为了缩短比较的时间,将主存地址的标记部分和Cache的所有块的标记同时进行比较。如果命中,则按块内地址访问Cache中的命中块(其标记与主存地址给出的标记相同);如果未命中,则访问主存,并按照相关替换策略替换到cache中的某块。

    全相联映像的优点是灵活,Cache利用率高。缺点有两个:一是标记位数增加了(需要记录主存块块地址的全部信息),使得Cache的电路规模变大,成本变高;二是比较器难于设计和实现(通常采用“按内容寻址的”相联存储器)。因此,只有小容量Cache才采用这种映像方式。

(3)组相联模式下的地址映射

组相联映像方式是介于直接映像和全相联映像之间的一种折中方案。设Cache中共有m个块,在采用组相联映像方式时,将m个Cache块分成u组(set),每组k个块(即m=u×k),组间直接映像,而组内全相联映像。组间直接映像,是指某组中的Cache块只能与固定的一些主存块建立映像关系。这种映像关系可用下式表示:

i=j mod u

其中i为Cache组的编号,j为主存块的编号(块地址),u为Cache的组数。例如,Cache第0组只能和满足i mod u=0的主存块(即第0块、第u块、第2u块……)建立映像关系,Cache第1组只能和满足i mod u=1的主存块(即第l块、第u+1块、第2u+l块……)建立映像关系。所谓组内全相联映像,是指和某Cache组相对应的主存块可以和该组内的任意一个Cache块建立映像关系。

在组相联模式中,主存地址被理解为由三部分组成:标记、组号和块内偏移地址。CPU在访问存储器时,由组号选择的一组的全部标记(k个) 同时被送往比较器与主存地址给出的标记进行比较。如果命中,则按块内地址访问组内的命中块,否则访问主存。如下图所示:

Cache的工作原理_第2张图片

(4)cache的读操作

CPU进行存储器读操作时,根据主存地址可分成命中和未命中两种情况。对于前者,从Cache中可直接读到所需的数据;对于后者,需访问主存,并将访问单元所在的整个块从内存中全部调入Cache,接着要修改Cache标记。若Cache已满,需按一定的替换算法,替换掉一个旧块。

Q3:如果没有命中,哪个块应该被替换?

当没有命中时,在直接映射模式下,替换方法比较简单,直接将主存的某块放到对应的cache中就行了,因为主存中的块在cache中的放置位置是唯一的。

当采用全相联和组相联模式时,发生缺失时进行替换时就要从多个块中进行适当选择,有三个基本的替换策略:随机替换策略、最近最少使用(LRU)替换策略、先进先出(FIFO)替换策略。

Q4:写操作时会发生什么?

CPU进行存储器写操作时,可分成两种情况:写命中和写缺失。

写命中时:

Cache中的块是主存相应块的副本,程序执行过程中如果遇到对某块的单元进行写操作时,显然应保证相应的Cache块与主存块的一致。

这里有两种处理方式:

写回法(write back):暂时只向Cache写入,并用标志注明,直到这个块被从Cache,中替换出来时,才一次写入主存;

写直达(write through):每次写入Cache的同时也写入主存。

两种方式各有优缺点。写回法占用总线时间少,写速度快,但不能随时保证Cache与主存保持一致,如果此期间发生DMA操作,则可能出错。所以,可能出现CPU和DMA控制器同时访问同一主存块的情况);写直达可使Cache块和主存块始终保持一致,但占用总线时间长,总线冲突较多。

写缺失时:

所要写入的存储单元根本不在Cache中,这时写操作直接对主存进行操作(与Cache无关),在这种情况下通常采用两种策略:

写分配(write allocate):在发生写缺失时,内存的块被读到cache中,然后执行写命中时的操作;

不按写分配(no-write allocate):在发生写缺失时,进仅修改低层存储器中的块,而不将该块取到cache中,因而写缺失不影响cache内容。

附:局部性原理:

CPU访问存储器时,无论是取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。

两种不同类型的局部性:

时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。

程序循环、堆栈等是产生时间局部性的原因。

空间局部性(Spatial Locality):在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的。

指令的顺序执行、数组的连续存放等是产生空间局部性的原因。

你可能感兴趣的:(Cache的工作原理)