CACHE一些基本概念

系列文章目录

` 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近在学习cache相关的内容,看了些资料,这里当作学习笔记,重点去记录cache的一些基本概念,cache的结构组成,cache一致性相关内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、CACHE 的一些基本概念

1,组组相连的cache结构
什么是set/way/line/index/tag/offset ?
4路组相连

① cache line:cache按行来组织,它是访问cache的最小单位,通常为16、32、64或128字节,cache line的大小通常在架构设计阶段确定;
② 64-bit address:CPU访问cache的地址编码,分成三部分:Tag、Index、Offset;
③ Index:地址编码中的index域,用于索引cache line;
④ Offset:地址编码中的offset域,cache line中的偏移量,可按word和byte来寻址;
⑤ Tag:Tag在cache中占用实际的物理空间,用于存储缓存地址的高位部分,通过与地址编码中的Tag域进行比较来确定是否cache hit;
⑥ Way:cache分成大小相同的子块,每个子块以相同的方式进行索引;
⑦ Set:所有Way中相同的索引对应的cache line组成的集合;

举例说明:
比如一般说4way就是指4块cache块,4路
1,每块cache块(这里称为way),由多条cacheline组成
2,比如下图所示有256条cacheline,那么每个块(way)有256条cacheline
3,这些cacheline通过index,索引找到,比如我们通过地址的index找到256条中的对应某一条,假设为第2条
4,但是由于有4路,那么第2条会对应4路中的不同cacheline(每个way 均有一个2号cacheline)
5,所有的2号cacheline构成一个set,同一个set对应4条cacheline

二、ARM cache的查询过程举例

举例:L1-dcache :一个大小64KB的cache,4路256组相连,cache line为64bytes

在L1-dcache中的查询过程: cpu发起一个虚拟地址,经过MMU转换为物理地址,根据index去查找cache line(因为是四路相连的cache,所以可以查询到4个cache line),然后对比TAG(先看invalid位,再对比TAG值),然后再根据offset找到具体的bytes取出数据

在这里插入图片描述
步骤1,首先通过index找到对应的set(256中的某个cacheline),1个set中有4个cacheline
步骤2,比较valid及tag值,确定是set中的那条cacheline(4条中的1条)
步骤3,根据偏移地址,确定cacheline上的数据(cacheline上有多条偏移地址数据)

说明:

*****1. 4路4个way,4个cache块
2. 每4条cacheline索引相同,对应一个set
,1个set是4条相同索引的cacheline集合

3. 256组,每个cache中有256条cacheline
4. 全部的cache中共有256个set,共有cacheline总数是:256set * 4=1024 *****

三、 cache的组成

一个典型的cache如下图所示:

在这里插入图片描述 一个cache有2^(bits of index) set,每个set包括n个(n-ways) cacheline,每个cacheline 由 tag,data和一些标记位组成。
一个cache 查找的过程使用地址中的index匹配set,在set中使用地址中的tag匹配cacheline,如果找到,称为cache hit,最后使用地址中的offset在cacheline中的相应偏移处取出数据

3.1利用hash表理解cache参数和行为

可以把cache理解成软件上的hash表:
在这里插入图片描述
1.s个slot, 使用链(set)解决冲突的hash结构,每个链有n个cacheline
2.利用hash_func定位hash slot:这里使用index来定位set
3.利用链表解决冲突:利用地址的中tag和set中每一个cacheline进行匹配
4.一般的,status bit 中比较重要的有V(valid)标识该cacheline是否有效,D(Dirty)标识该cacheline是否被修改过

说明:
1个set有几个cacheline,取决于有几个way
1个way有几个cacheline,对应就有多少个set

3.2 cache的分类

1,在3.1中,如果每个set只有一个cacheline,类比于hash冲突链最多允许有一个cacheline,称为直接相连(direct-mapped)cache;----------------(只有1个way,根据索引,就能找到对应的cacheline)
2,如果只有一个set,类比于只有一个hash slot,称为全相连(fully-associative)cache;-----(无需索引,直接根据tag找到cacheline)
3,最后一种情况如上面图中显示的那样,称为n路组相连(n-way set-associative)cache;
如我们有如下cpu 的缓存规格:
L1 Data cache = 32 KB, 64 B/line, 8-WAY.
那么可以知道整个L1 data cache的大小:32K,每个set 8个cacheline,每个cacheline储存64Bytes数据,那么set数目就是32K/8/64=64,从而知道地址中index和offset都是log2(64) = 8bit

四、cache一致性问题

4.1 cache跟mem的一致性

情况1:当写操作且cache hit时,会写到cache,这时cache与mem内容不一致,其他核或者dma读mem时,不是真实数据
处理方式:需要进行cache clean操作即把cache数据同步写到mem(WB)
情况2:外部dma直接写mem后,这时cache与mem内容不一致,核下次hit后读到的数据与最新数据不一致
处理方式:需要ivalid cache数据,下次核读时,就不会用cache的数据而直接从mem中取

注意:有时无法单独invalid,ivalid往往之前会伴随clean即先clean再invalid

4.2 cache与cache间的一致性

多核cache中,各核有自己独立cache。Cache一致性的保证就是让多核访问不出错
主要是多核系统中,假如core 0读了主存储的数据,写了数据。core 1也读了主从的数据。这个时候core 1并不知道数据已经被改动了,也就是说,core 1 Cache中的数据过时了,会产生错误。

4.2.1策略一:基于监听的一致性策略

这种策略是所有Cache均监听各Cache的写操作,如果一个Cache中的数据被写了,有两种处理办法。
写更新协议:某个Cache发生写了,就索性把所有Cache都给更新了。
写失效协议:某个Cache发生写了,就把其他Cache中的该数据块置为无效。
策略 1 由于监听起来成本比较大,所以只应用于极简单的系统中。

策略二:基于目录的一致性策略

这种策略是在主存处维护一张表。记录各数据块都被写到了哪些Cache, 从而更新相应的状态。一般来讲这种策略采用的比较多。又分为下面几个常用的策略。
SI: 对于一个数据块来讲,有share和invalid两种状态。如果是share状态,直接通知其他Cache, 将对应的块置为无效。
MSI:对于一个数据块来讲,有share和invalid,modified三种状态。其中modified状态表表示该数据只属于这个Cache, 被修改过了。当这个数据被逐出Cache时更新主存。这么做的好处是避免了大量的主从写入。同时,如果是invalid时写该数据,就要保证其他所有Cache里该数据的标志位不为M,负责要先写回主存储。
MESI:对于一个数据来讲,有4个状态。modified, invalid, shared, exclusive。其中exclusive状态用于标识该数据与其他Cache不依赖。要写的时候直接将该Cache状态改成M即可


总结

以上就是今天要讲的内容,本文仅仅简单介绍了cache基本概念,结构以及简单介绍一致性问题

参考文档

https://blog.csdn.net/weixin_42135087/article/details/107064291

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值