天天看点

CACHE简述CACHE简述

CACHE简述

1. 为什么要使用CACHE

  • CPU速度越来越快
  • 处理的数据量越来越大,需要更大的内存
  • 内存速度越快,价格越高,大容量存储器,一般价格低廉,但是速度慢。
CACHE简述CACHE简述

2. 局部原则

Cache减少内存存取时间是利用内存存取具有局部特性。就是说如果内存某一处的数据在某一时刻被存取,那么它周围的数据就非常有可能继续被存取。也就是数据存取具有两个局部特性:时间上的局部性(即红字“某一时刻”),及,和空间上的局部性(即红字“周围的数据”)。CACHE真是利用数据存取的这两个特性来提供内存存取效率的。珍贵的容量小速度的cache内存,保存着当前这段时间最有可能使用的数据。

3. Cache内存结构概述

CACHE简述CACHE简述

4. Cache的基本概念

4.1 直接映射(Direct-Mapped)Caches

以程序CACHE L1P为例解释Direct-Mapped Cache是如何工作的。

CACHE简述CACHE简述
CACHE简述CACHE简述

每个line frame(或叫CACHE Line长度是32字节)总是映射到内存同样的固定地址,例如,地址0000-0019h总是cache在line frame 0,3fe0-3fff总是被cache到帧511

读迷失:

假设CPU要取0020h单元的内容,且cache完全是无效的,也就是说所有的line frame均没有cache数据,那么每个line frame的有效标志V为0,V = 0,表示对应的cache line frame无效,即不包含有效数据,当cpu请求读0020h时,cache控制器将其地址分成三部分:如下图

Set 部分(bit13-5)表示cpu的地址映射到cache的哪个集(set)上,这里,一个set等价于一个line frame。那么对于0020h这个地址,set是1,控制器然后检查tag(bit31-14)和有效位V。我们开始假设所有的V都是0,所以,cache控制器认为cache出现了迷失,也就是请求的数据不包含在cache里。

那么cache控制器就会从外部内存中一下把(0020-0039)渠道line frame 1里,地址的tage部分存储在tag RAM里,有效位设为1,表示这个set包含了有效数据,取到数据也送给cpu,这样一次因迷失的外部存取就完成了。

读命中:

Cache控制器降低至拆分成三部分,set部分决定set位置,存储的tag部分同请求的地址相比较,这个比较是必要的,因为许多内存中的多个line都映射到同一个set上,,如果我们存取地址是4020h,那么同一个set的tag不一样,也是一次迷失,如果地址0020被存取,那么tag比较正确,V也是1,那么cpu的这次存取被cache命中,并将cpu所要的数据送给cpu,完成一次命中存取。

  1. Cache迷失的类型

造成迷失有多种好几种情况:冲突(conflict)和容量(capacity)迷失、强制(compulsory)迷失。

4.2 集相关(Set-Associative)Caches

同direct-mapped cache不一样,图中的2-way cache里,每个set包含两个line frame(cache line 长度是64byte),一个line frame在way 0,另一个才way 1,内存的一个line依然映射到一个set,但是现在就有可能存到两个line里的某一个了。

读命中:

哪个way被读命中,哪个way里的line frame被读取。

读迷失:

如果2个way都迷失,那么数据需要从内存中取进cache,到底存放在哪个way的line里,由LRU位来确定。每个set有一个LRU,如果LRU = 0,那么把取到内容放到way 0的line frame,如果LRU = 1,那么放到way 1里的line frame。每当对line frame进行存取时,LRU的状态都会改变,也就是说当一个way被存取后,LRU总是切换到另外一个way,这样了防止最近使用的line被覆盖。注意,LRU仅在迷失时才查询,但是它的状态在每次line frame被存取时都会被更新,不管是否被命中或迷失,也不管是读还是写。

写迷失:

L1D是读定位的cache,这意味着,只有发生读迷失的时候,才会导入易的一行,当写迷失发送时,数据通过写缓冲写到较低级内存,这样旁路了L1D cache。

写命中:

当发生写命中的时候,数据写入到擦车,当并不立刻送到低一级内存,这种类型的cache我们脚write-back cache,因为cpu写入的数据并不立刻回写到内存。为了回写被修改的数据,你必须知道cpu写的是哪个行,由于这个原因,每个cache line有个D标志,初始化时D = 0,当cpu修改了相关行的内容时,这个cache line的D置为1,当由于读迷失需要重新加载这个cache line时,如果D = 1,则会把这个脏line回写到内存中,如果内容没有被修改(干净的line),则直接废弃。

CACHE简述CACHE简述

4.3 L2级Cache

L2 cache的操作与L1 cache是一样的。

5. 存取流程图

CACHE简述CACHE简述

6. Cache带来的内存一致性问题