首页 > 代码库 > 三种缓存模式
三种缓存模式
(这是一个MIT同学整理的6.004 Computation Structure的课程的笔记,内容清晰易懂,看一遍可以简单了解计算机组成的基本内容,一共55页,计划全部译成中文。转载请注明出处。)
(笔记原文:?https://app.box.com/s/hj73i5cnek38kpy9yw22)
?
存储层次(Memory Hierarchy)
CUP和内存数据交换的效率不高,这是指令流水线式处理器的瓶颈之一。我们可以通过存储层次(Memory Hierarchy)的方式来解决这个问题。这个存储层次内有:
1、容量小的、高速的缓存
2、容量较大的、慢一点内存
3、容量很大的、但很慢的硬盘
?
所以当CPU获取一个内存地址A时,通常经过这些步骤:
1、检查缓存: 如果地址A保存在缓存里(称作Cache Hit),那么返回这个数据,否则去第2步
2、检查内存(Main Memory):如果A在主存里,那就返回A并把它放在缓存里,否则执行第3步
3、如果A不在缓存和内存里,A必然在硬盘(Disk)里。我们把A放入主存和缓存,并且返回数据。
?
为了简化这个结构,我们在这里假设A不会在硬盘里。所以如果在缓存里没有,必在主存里。
?
缓存是很小而且很快的存储单元,它保存了存储器的临时备份。在6.004课程中,你可以假设一个CPU内部的Clock速率,在这样的速率下,一次Cache Hit会在一个时间周期(Cycle)内返回Cache保存的数据。而且一次失败的Cache查找后,CPU会暂停,知道数据在内存中被找到。如果Cache Miss的概率不是很高,那么使用Cache可以显著提高内存的平均读取时间。
t = t(cache) +?miss_rate * t(memory)
?
?
本地化(Locality)
Cache很有用,因为它利用了Locality的策略:
如果你得到了A位置的数据,你很有可能不久还要使用它。每当有一次Cache Miss,这个内存地址就会进入Cache,并且替代一些Cache中的很久没用的数据。
?
?
全关联缓存(Fully Associative Cache)
?
一个缓存包括很多条线(Cache Line)。一条Cache Line包括:
1、一个有效位(Valid Bit),用来表示这条线中的数据是否有效。
2、一个可选的状态位(State Bit),用来表示这个数据是否被修改过(Dirty),是否是只读(Read-only),等等
3、一个标签,是由内存地址生成的
4、以及地址对应的数据
?
我们将会讨论3种缓存,全关联缓存是其中之一。它和其他结构的区别是,全关联缓存可以把数据放在任何地方。
当一个内存地址送给一个全关联内存时,这个地址标签就和Cache中的所有有效线路(Valid Line)进行对比,如果tag相同,算作Cache Hit。这条线路的数据就被发送给CPU,否则算作一次Cache Miss。
如果Cache中所有的线路都是有效的(Cache是满的),发生了一次Cache Miss。我们就需要做一次数据替换(把得到的数据和Cache中某个数据进行替换)。替换的原则我们会在后文中提到。如果被线路有效并且被修改过(V =1,D = 1),那我们就必须把这线路中的数据写回主存。如果没被修改过,我们直接覆盖这线路。
关于全关联缓存,有一些有用的等式:
Capacity ?= # lines * ( 1 valid bit + S status bits + T tag bits + D data bits)
在 6.004课程中,有一些特别的数值: T = 30 bits, D = 32 bits
?
下面这些例子展示了三次取指操作。从一个空的全关联缓存开始。每幅图展示了Cache在图片下方注释内容被执行后的状态。
?
?
直接映射高速缓存(Direct-Mapped Cache)
直接映射高速缓存比全关联缓存便宜。因为整个缓存中只有一个标签比较器(Tag Comparator)。这和全关联缓存器中每一条线路都有一个比较器不同。
但在直接映射高速缓存中,地址冲突是存在的,这可能会影响cache的效果。
给出一个内存地址后,index会选择缓存线路。如果目标TAG和缓存中的Tag相等,就达成一次Cache Hit。这条缓存中的数据会被发送给CPU。
如果缓存中没有index对应的线路,我们需要去主存,主存中的数据替换了缓存中的index对应的线路的数据。如果线路中的数据是有效的并且被修改过(V=1, D=1)。缓存必须把那个数据写进内存再扔掉。
?
看到这里,我们肯定会思考,全关联缓存和直接映射高速缓存哪个更好,这取决于数据获取的模式(Memory Access Pattern)。不同的模式和数据替换策略(Replacement Strategy,就是发生Cache Miss后的数据替换规则)在不同的缓存结构中各有千秋。
这里是一些关于直接高速缓存的有用的等式:
Capacity = # lines * ( 1 valid bit + S status bit + T tag bits + D data bits)
# lines = 2^(# index bits)
下面这些例子展示了四次取指操作。从一个空的直接高速缓存开始。每幅图展示了Cache在图片下方注释内容被执行后的状态。
?
N路组相联高速缓存(Direct-Mapped Cache)
下次写..
三种缓存模式