CPU缓存鸟瞰

维基百科上是这样定义Cache的:In computing, a cache is a hardware or software component that stores data so future requests for that data can be served faster; the data stored in a cache might be the result of an earlier computation, or the duplicate of data stored elsewhere. 


缓存经常出现在需要计算的过程中,缓存是一种硬件或软件的部件,它提前存储了以后请求的数据,使请求更加快速的被响应。存储在缓存中的数据可能是之前计算的结果,也可能是其他存储器中数据的拷贝。


下面是CPU Cache的定义,也是我们今天学习的对象

CPU cache is a hardware cache used by the central processing unit (CPU) of a computer to reduce the average cost (time or energy) to access data from the main memory

CPU缓存属于硬件缓存,用于减少计算机CPU平均访问内存数据的时间。


Cache,是位于CPU和主存之间存在一种高速缓存存储器。今天我们就来了解了解它。

what is cache?

       Cache是什么?是由SRAM和相关控制逻辑硬件组成。(SRAM和DRAM都是随机存储器,SRAM是静态随机存储器,DRAM是动态随机存储器,两者都是半导体材料,这也是两者都是易失性的原因。相比于后者,SRAM速度更快,但是存储更小。)

why we need it?

       Cache的存在目的是什么呢?Cache之所以被设计出来,是为了解决CPU与主存之间速度不匹配,两者相差5~10倍的这个问题。

how it work?

       当CPU根据地址准备读取内存上的字时,CPU会先将字的内存地址发送到cache,cache利用控制逻辑判断cache中是否存储了这个地址的字,如果有立即返回给CPU,如果没有,就由主存读取所要求的地址,将地址对应的字分别送给CPU和cache,cache将该地址和字缓存起来。

         从上面的分析,可以看出,一个好的Cache,应该尽可能的让CPU直接读取缓存的值而不是主存。为了科学的评价缓存设计,我们引入了以下一些变量,定量的评价缓存。

 


       与内存相比,缓存容量小,因此cache保存的内容是主存的一个子集,主存与缓存之间以块(行)为单位进行数据交换。块或者行就是若干个字的集合,字是计算机传输处理数据的基本单位。块和行可以这样理解,假设主存和缓存是一个矩阵,那么矩阵的每一行就是块(行)。为了CPU能在缓存中找到主存中的块,缓存中的地址必须与主存的地址存在一定的映射关系,这样CPU就可以通过主存地址找到缓存地址找到对应的块,再在块中找到对应的字。

地址映射关系:

1、全相联映射,缓存中每一行可以任意存储主存的一个块,缓存在每一行的头部存放该行对应的主存地址。处理时遍历比较缓存表的每个主存地址。



2、直接映射关系,缓存中每一行只能存储主存的若干顺序排列的块(如B0,Bm,B2m,B3m等,缓存在每一行的头部存放主存地址的s-r,s为主存地址,r为主存对应的缓存行号。处理时,先由r行找到对应的缓存行,再比较s-r是否相等。


3、组相联映射关系,缓存中的一个组(包含连续的若干行),每个组只能存储主存中若干顺序排列的块(B0,Bj,B2j等,缓存在每一行的头部存放s-g,s为主存地址,g为主存对应的缓存组号。处理时,先由g找到对应的缓存组,再遍历缓存组查找s-g块。


三者比较,一可以充分利用缓存的每一行,但是难以设计和实现。二实现简单成本低,但是如果对应相同行的主存块存放就会发生冲突,可能会导致频繁的置换。

三是折中的方案。

讨论了缓存的结构设计后,我们来简单的学习一下缓存的替换策略和写操作策略。

Cache的替换策略。Cache为了为新的块腾出空间,有的时候必须清除已经存在的块,替换的关键是如何找到,已存在的块中之后不会再使用或者最不可能使用的块。

预测不确定的事情是很困难的,所以没有一个完美无瑕的方式去选择替换对象。一个比较常用的选择是使用近期最少使用算法(LRU)来挑选被替换的块。

还可以禁止缓存那些内存中一些几乎从来不访问的部分,来节约缓存空间。

常见的替换策略:

1、LFU最不经常使用算法,两次替换之间访问次数最少的行被替换。

2、LRU近期最少使用算法,每次命中,命中行计数清零,其余加1,替换时使用计数最大的行。

3、随机替换。



*Cache的写操作策略。常见的写策略有全回法,全写法和写一次法。

1、写回法:CPU写,命中Cache时只修改缓存内容。只有当缓存行被替换出去时,根据缓存行是否被CPU修改,如果是才写到主存上。如果Cache未命中时,

将主存的块拷贝到缓存行上,再由CPU进行修改,主存的写操作统一保留到置换出去前。当多核多缓存时,这种方法存在不一致的隐患。

这里的不一致就是缓存不一致的问题

2、全写法write-through:CPU写,当Cache命中时,缓存和主存同时修改。

*3、写一次法write-once:

首先,每个缓存中的行/块都有四个状态

Invalid: This block has an incoherent copy of the memory.无效态,相当于缓存中不存在该块,未命中。
Valid: This block has a coherent copy of the memory. The data may be possibly shared, but its content is not modified.有效态,缓存行的数据是有效的。
Reserved: The block is the only copy of the memory, but it is still coherent. No write-back is needed if the block is replaced.

预留态,有效态写数据同步后会变成预留态

Dirty: The block is the only copy of the memory and it is incoherent. This copy was written one or more times.

This is the only state that generates a write-back when the block is replaced in the cache.

脏态:预留态的块写入一次或多次数据后变成脏态,这个时候缓存中数据还未写到主存中。如果这个时候缓存发生替换,会写到主存中,

同时其他缓存中变成无效态


下面介绍“写一次”法在各种情况下的事件处理:

Read hit: The information is supplied by the current cache. No state change.

读取命中时,直接读取缓存中的内容,不发生状态转换

Read miss: The data is read from main memory.

The read is snooped by other caches; if any of them have the line in the Dirty state,

the read is interrupted long enough to write the data back to memory before it is allowed to continue.

Any copies in the Dirty or Reserved states are set to the Valid state.

读取未命中时,数据准备从内存中读取,同时,其他缓存区窥探到读取操作,如果其他缓存区中存在dirty状态,

则先将该缓存区的数据写入到主存(同时其他缓存区转换成Invalid状态),

再将数据拷贝到未命中的缓存区,最后将dirty缓存区置为valid。

Write hit: If the information in the cache is in Dirty or Reserved state, the cache line is updated in place and its state is set to Dirty without updating memory.

If the information is in Valid state, a write-through operation is executed updating the block and the memory and the block state is changed to Reserved. 

Other caches snoop the write and set their copies to Invalid.

写入命中时,如果当前缓存是dirty或者reserverd状态,缓存行被修改,同时状态置换成dirty,不操作主存。

如果当前缓存处于valid状态,修改缓存同时修改主存,并将状态置换成reserved。其他缓存区的行窥探到写入操作,状态置换成invalid。

Write miss: A partial cache line write is handled as a read miss (if necessary to fetch the unwrittenportion of the cache line) followed by a write hit.

This leaves all other caches in the Invalid state,and the current cache in the Reserved state.

写入未命中时,如果可以从主存获取未写入缓存行的数据,那么先触发read miss事件,再触发write hit事件。


参考:计算机组成与系统结构第五版 白中英 

     维基百科


下图是缓存一致性相关概念的示意图,如果有机会,后面我们再一起学习相关的其他知识


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值