码迷,mamicode.com
首页 > 其他好文 > 详细

三种缓存模式

时间:2014-12-05 00:29:39      阅读:550      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   使用   sp   strong   

(这是一个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)

bubuko.com,布布扣

?

一个缓存包括很多条线(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在图片下方注释内容被执行后的状态。

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣

?

?

直接映射高速缓存(Direct-Mapped Cache)

直接映射高速缓存比全关联缓存便宜。因为整个缓存中只有一个标签比较器(Tag Comparator)。这和全关联缓存器中每一条线路都有一个比较器不同。

bubuko.com,布布扣

bubuko.com,布布扣

但在直接映射高速缓存中,地址冲突是存在的,这可能会影响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在图片下方注释内容被执行后的状态。

bubuko.com,布布扣

bubuko.com,布布扣

?


N路组相联高速缓存(Direct-Mapped Cache)

下次写..

三种缓存模式

标签:style   blog   http   io   ar   color   使用   sp   strong   

原文地址:http://www.cnblogs.com/gintaberry/p/4145333.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!