前面的各种存储器大概看了一下,DRAM和SRAM是理解的,其他的存储器就朦朦胧胧知道是怎么回事,就不深入了,这里主要做一下Cache的笔记。
文章目录
一、何为Cache
一个Cache,由S组(sets)
组成,每组都有E块(blocks)
数据块,每个数据块都有B个字节(bytes)
,所以总缓存大小C=S*E*B data bytes
.
这里的块也就Cache中的一行嘛,每次传输一整块的数据。
注2:
!!!block和line是同个意思!!!
看CSAPP的时候困惑了好久,一会block一会line,原来是一样的。那么这里就统一用block来表示
1.直接映射缓存(Direct-Mapped Cache)
最简单的情况,S=2^s
sets,E=1blocks
per set,B=2^b 字节
per block,且地址位数为t+s+b
,那么得到的一个地址可以如下图这样划分:
所以找某个地址的数据的时候,传入地址,将地址上面的方式切分成tag
标记位,set index
组号,和block offset
块内偏移。
如上图,就是E=1的一个示例。每次进来一个地址,都剥离出tag,set index 和 block offset,先根据set index找到那一组,由于每个组只有一块,所以只需要比对找到的那一块记录的标志位是否与传入的tag相等,若相等且valid=1,则表示该数据在缓存中,直接从缓存中取走数据即可,否则表示没在缓存中。
这叫
直接映射缓存
,因为每次来,根据set就直接找到那个block了(因为one set 就只有 one block),然后直接和那个比对即可。
这种缓存有个明显的缺点,就是如果AB的set index相同,然后程序的特点是ABABAB这样交错地访问的话,那么一次都不会命中。
所以更好的办法是增加E,使得每一组可以并行放好几个相同set index的block,在下面介绍。
2.组相联映射(E-way Set Associative Cache
E路相联缓存)
E>1时,每组都有E块可供缓存,也就是说,相同set index的地址可以不用争夺那仅有的一个块了,现在有很多块可供大家选用。由于有选择的空间了,也就能够选择进来一个的时候覆盖在哪个旧数据块上了,也就开始需要淘汰算法了。
下面有一个2-Way 的例子。