【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。

相关推荐
OH_TPC7 小时前
【鸿蒙优选三方库】@react-native-ohos/react-native-fast-image:高性能图片加载与缓存组件
缓存·华为·harmonyos·鸿蒙
liangshanbo12157 小时前
手写 Event Emitter(事件发射器)
缓存
数智启示录8 小时前
Apache Kafka Consumer 扩到 40 个仍不提速:Partition 上限锁死有效并行度 【Kafka合集】
数据库·经验分享·分布式·缓存·面试·kafka·apache
2601_962297259 小时前
python自带缓存lru_cache用法及扩展的使用_python
python·缓存·装饰器·lru_cache·my_cache
xixingzhe210 小时前
SpringBoot 接口缓存实现
spring boot·后端·缓存
莫得感情 o21 小时前
Redis 05 · 持久化:RDB 与 AOF 怎么保证数据不丢
redis·缓存
curd_boy1 天前
【Redis】Redis从缓存到AI向量平台
人工智能·redis·缓存
kiracrimson1 天前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
2601_962301011 天前
深入理解缓存(Cache):原理、应用与优化
缓存·计算机原理·优化策略·数据访问·系统性能
数智启示录1 天前
PostgreSQL 计划缓存实战(第 10 篇):预编译 SQL 前五次都快,第六次为什么可能变慢
经验分享·sql·缓存·postgresql·面试