前面的各种存储器大概看了一下,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 CacheE路相联缓存)
E>1时,每组都有E块可供缓存,也就是说,相同set index的地址可以不用争夺那仅有的一个块了,现在有很多块可供大家选用。由于有选择的空间了,也就能够选择进来一个的时候覆盖在哪个旧数据块上了,也就开始需要淘汰算法了。
下面有一个2-Way 的例子。
每次进来一个数据时,同样分解为tag,set index和block offset,同样找到对应的set index那一行,然后去比较那一组上所有的块是否有对应的tag并且valid=1。
3.全相联映射
从直接映射到组相联映射,数据存于缓存哪个位置的自由性增加,这个自由性在全

本文详细介绍了Cache的三种映射方式:直接映射、组相联映射和全相联映射,以及不同写策略。探讨了存储器层次结构的重要性,并分析了Cache对程序性能的影响,包括存储器山模型和如何通过优化循环提高空间和时间局部性。
最低0.47元/天 解锁文章





