【Cache缓存】分配策略

Cache分配策略(Cache allocation policy)

cache的分配策略是指什么情况下为数据分配cache line(是否需要将数据从主存中分配到cache中)。cache分配策略分为读和写两种情况。

读分配(read allocation)

当CPU读数据时,发生cache miss,这种情况下都会分配一个cache line,缓存从主存读取的数据。默认情况下,cache都支持读分配。

写分配(write allocation)

当CPU写数据发生cache miss时,才会考虑写分配策略。

1、当不支持写分配(No-write allocate)的情况下,写指令只会更新主存数据,然后就结束了。

2、当支持写分配(Write allocate)的时候,我们首先从主存中加载数据到cache line中(相当于先做个读分配动作),然后更新cache line中的数据。

Cache更新策略(Cache update policy)

cache更新策略是指当发生cache hit时,写操作如何更新数据(如是否先写到cache中,等到实在有必要时再写入到主存中)。cache更新策略分成两种:写直通和回写。

写直通(write through)

当CPU执行store指令并在cache hit时,我们更新cache中的数据并且更新主存中的数据。cache和主存的数据始终保持一致。

写回(write back)

当CPU执行store指令并在cache hit时,我们只更新cache中的数据。并且每个cache line中会有一个bit位记录数据是否被修改过,称之为dirty bit(翻翻前面的图片,cache line旁边有一个D就是dirty bit)。我们会将dirty bit置位。主存中的数据只会在cache line被替换或者显示的clean操作时更新。因此,主存中的数据可能是未修改的数据,而修改的数据躺在cache中。cache和主存的数据可能不一致。

同时思考个问题,为什么cache line大小是cache控制器和主存之间数据传输的最小单位呢?这也是因为每个cache line只有一个dirty bit。这一个dirty bit代表着整个cache line是否被修改的状态。

Post write

CPU更新cache数据时,把更新的数据写入到一个更新缓冲器,在合适的时候才对memory(后端存储)进行更新。这样可以提高cache访问速度,但是,在数据连续被更新两次以上的时候,缓冲区将不够使用,被迫同时更新memory(后端存储)。

实例

假设有一个64 Bytes大小直接映射缓存,cache line大小是8 Bytes,采用写分配和写回机制。当CPU从地址0x2a读取一个字节,cache中的数据将会如何变化呢?假设当前cache状态如下图所示(tag旁边valid一栏的数字1代表合法。0代表非法。后面Dirty的1代表dirty,0代表没有写过数据,即非dirty)。

如上图,根据index找到对应的cache line,对应的tag部分valid bit是合法的,但是tag的值不相等,发生缺失。此时需要从地址0x28地址加载8字节数据到该cache line中。但是,我们发现当前cache line的dirty bit置位。因此,cache line里面的数据不能被简单的丢弃,由于采用写回机制,所以我们需要将cache中的数据0x11223344写到地址0x0128地址(这个地址根据tag中的值及所处的cache line行计算得到)。这个过程如下图所示。

当写回操作完成,我们将主存中0x28地址开始的8个字节加载到该cache line中,并清除dirty bit。然后根据offset找到0x52返回给CPU。

相关推荐
许彰午2 小时前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
Lyyaoo.2 小时前
Session粘滞性问题->Redis实现session共享
数据库·redis·缓存
倚楼盼风雨3 小时前
Redis 为什么快
数据库·redis·缓存
6Hzlia3 小时前
Hot 100 刷题计划】 LeetCode 146. LRU 缓存 | C++ 哈希表+双向链表
c++·leetcode·缓存
Controller-Inversion3 小时前
146. LRU 缓存
缓存
yuzhiboyouye3 小时前
java redis(缓存)
java·redis·缓存
TechWayfarer20 小时前
IP归属地运营商生产落地进阶:缓存+降级+灰度对账全解析
网络·python·网络协议·tcp/ip·缓存
田梓燊1 天前
力扣:146.LRU 缓存
算法·leetcode·缓存
空中海1 天前
第四篇:进阶篇 — 缓存、消息队列、安全与常用中间件
安全·缓存·中间件
人道领域1 天前
【黑马点评日记】Redis分布式锁终极方案:Redisson全面解析(含源码解析)
java·数据库·redis·分布式·缓存