• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Cache操作

武飞扬头像
辉生
帮助1

1.什么是Cache?

高速缓存(Cache)主要是为了解决CPU运算速度与内存(Memory)读写速度不匹配的矛盾而存在, 是CPU与内存之间的临时存贮器,容量小,但是交换速度比内存快。

百度百科是这样介绍缓存的:

CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入Cache中,可以使得以后对整块数据的读取都从Cache中进行,不必再调用内存。

正是这样的读取机制使CPU读取Cache的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在Cache中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先Cache后内存。

 2.Cache的分类?

Cache硬件实现通常有一级,二级,或者很多级Cache。这里说以二级cache为例。

对于一级Cache,又有 Instruction Cache(指令缓存,通常称为 I-Cache)和 Data Cache(数据缓存,通常称为 D-Cache)之分,二级Cache有Scache。二级cache一般都大于一级cache,一级cache是最靠近CPU的,然后是二级cache。

本文是本人学习什么时候需要写回缓存,什么时候无效缓存,什么时候写回并无效缓存的总结。

以D-Cache为例,指令缓存 I-Cache 原理一样。

3.Cache 数据访问原理

写入数据时:

  • 第一步,CPU 将数据写入 Cache;
  • 第二步,将 Cache 数据传送到 Memory 中相应的位置;

读取数据时:

  • 第一步,将 Memory 中的数据传送到 Cache 中;
  • 第二步,CPU 从 Cache 中读取数据;

具体硬件实现,Cache写操作有写直通和写回两种

(1)写直通(write through)

当执行store操作时,cache中的数据被修改,那么主存中的数据也会被同步更新,两者保持一致。

(2)写回(write back)

当执行store操作时,cache中的数据被修改,并不会立即同步数据到主存中,而是在tag中将dirty位置位。当cache中的数据被替换或者显式地写回时,才会将数据更新到主存中。

写直通的方式性能低于写回方式,现在的 CPU 设计基本上都是采用 Cache 回写方式。

4.Cache line

cache line
        cache被平均分成了多个cache line。
        cache line是cache和DDR之间数据传输的最小单位。
        什么意思呢?当CPU试图load一个字节数据的时候,如果cache miss,那么cache控制器会从主存中一次性的load cache line大小的数据到cache中。
        例如,cache line大小是64字节。CPU即使读取一个byte,在cache缺失后,cache会从主存中load 64字节填充整个cache line

        每条cache line 都有两个标志位

vaild bit:表示cache line中数据是否有效(例如:1代表有效;0代表无效)。当系统刚启动时,cache中的数据都应该是无效的.

读:
1. 缓存没有命中(cache miss或者cache line状态为invalid),直接从内存读取数据 写 入 到cache 标记cache line为valid
2. 缓存命中 && cache line状态为valid,直接从cache中读取数据
写:
1. 向所有cache发送写信号

2. 如果有cache中有这条数据 && cache line状态为valid,将这个cache line的状态改为invalid

3. 将新数据写入到内存与cache,并将相关的cache line标记为valid
优点:减少了从主存中读取数据的次数

缺点:每次写操作都要刷回主存

dirty bit:表示cache line里面的数据是否和下一级存储一致。=0非dirty,和下一级存储一致,=1 dirty,和下一级存储不一致。

cache的3种操作:
clean:
        检查对应内存cache line 的dirty bit。如果dirty bit为1,将cache line的内容写回下一级存储,并将dirty bit置为0.

invalid:
        检查对应内存cache line 的valid bit.如果valid bit 为1,置为0.

flush:
        每条cache line 先clean,再invalid.

6.因为Cache引起的数据不一致问题

在有设备进行 DMA 操作的情况下,设备读写数据不再通过 Cache,而是直接访问内存。在设备和 CPU 读写同一块内存时,所取得的数据可能会不一致,如图二。

学新通

设备和CPU读写同一块内存时数据不一致

图二、设备和CPU读写同一块内存时数据不一致

CPU 执行步骤1将数据 A 写入 Cache,但并不是每次都会执行步骤 2 将数据 A 同步到内存,导致 Cache 中的数据 A 和内存中的数据 A’不一致;步骤 3 中,外部设备通过 DMA 操作时直接从内存访问数据,从而取得的是A’而不是A

设备DMA操作完成后,通过步骤 4 将数据 B 写入内存;但是由于内存中的数据不会和 Cache 自动进行同步,步骤 5不会被执行,所以 CPU 执行步骤 3 读取时数据时,获取的可能是 Cache 中的数据 B’,而不是内存中的数据B;

在 CPU 和外设访问同一片内存区域的情况下,如何操作 Cache 以确保设备和 CPU 访问的数据一致就显得尤为重要,见图三。

学新通

Cache操作同步数据

图三、Cache操作同步数据

CPU 执行步骤 1 将数据 A 写入 Cache,由于设备也需要访问数据 A,因此执行步骤 2 将数据 A 通过 flush 操作同步到内存;步骤 3 中,外部设备通过 DMA 操作时直接从内存访问数据 A,最终 CPU 和设备访问的都是相同的数据。

设备 DMA 操作完成后,通过步骤 4 将数据 B 写入内存;由于 CPU 也需要访问数据 B,访问前通过 invalidate 操作作废 Cache 中的数据,从而通过 Cache 读取数据时 Cache 会从内存取数据,所以 CPU 执行步骤 6 读取数据时,获取到的是从内存更新后的数据;

参考链接:https://zhuanlan.zhihu.com/p/505025934

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfcajaj
系列文章
更多 icon
同类精品
更多 icon
继续加载