Linux内核空间用来设置内存映射区域的缓存属性的pgprot_* 系列函数的详细介绍【CPU核心、Cache(高速缓存)、写缓冲器、主存之间的关系;Cache和写缓冲器的详细介绍】

原理示意图

Cache 和 写缓冲器 是 CPU 的核心组成部分,属于 CPU 微架构设计的一部分。

下图是CPU核心、Cache(高速缓存)、写缓冲器、主存之间的关系。

Cache(高速缓存) 相当于是一块高速内存;写缓冲器相当于一个 FIFO,可以把多个写操作集合起来一次写入内存。
在这里插入图片描述

Cache(高速缓存)的详细介绍

Cache(高速缓存)的概要介绍

Cache 是 CPU 内部(或者在某些情况下,靠近 CPU 的芯片上)的一种高速存储器,用来存储近期访问的数据或指令的副本。

  • 特性
    • Cache 通常分为多级(L1、L2、L3),L1 最靠近 CPU,速度最快,但容量最小。
    • Cache 数据通常以缓存行(Cache Line)为单位存储和管理。
    • 通过保持数据的局部性(时间局部性和空间局部性)来提高性能。

Cache(高速缓存)的读操作原理和流程

  • 当 CPU 需要访问内存中的某块数据时,会首先检查 Cache 中是否有该数据(称为 Cache 命中)。
  • 如果数据命中,则直接从 Cache 中读取,速度远高于从主内存读取。
  • 如果数据未命中(Cache Miss),则需要从主存(RAM)中加载数据,同时可能更新 Cache。

Cache(高速缓存)的写操作原理和流程

在启用了 Cache 的情况下,写数据通常会遵循以下流程:数据优先写入 Cache,然后根据 Cache 的策略再写入主存(内存)。以下是主要的写策略策的工作原理。


1. Write-Through(写直达)

  • 工作原理
    • 数据被写入 Cache 的同时,立即写入主存(内存)。
    • Cache 和主存始终保持同步。
  • 优点
    • 数据一致性较高,主存始终是最新的数据。
    • 如果发生 Cache Miss,主存的数据仍然是有效的。
  • 缺点
    • 写操作速度较慢,因为每次写入都需要同时更新主存,无法充分利用 Cache 的性能。
  • 适用场景
    • 对数据一致性要求较高的场景。

2. Write-Back(写回)

  • 工作原理
    • 数据只写入 Cache,并标记该 Cache Line 为“已修改”(Dirty)。
    • 数据不会立即写入主存,只有在以下情况之一时才会写回主存:
      1. 该 Cache Line 被替换(即被新的数据占用时)。
      2. 主动使用指令或操作(如 flush)将数据刷新到主存。
  • 优点
    • 写操作效率更高,因为减少了对主存的直接写入次数。
    • 对多个连续写操作,可以在 Cache 中合并,从而提高性能。
  • 缺点
    • 数据一致性较难维护,主存中的数据可能是旧的。
    • 如果系统崩溃或电源中断,可能会导致 Cache 中的数据丢失。
  • 适用场景
    • 对性能要求高且能容忍一定数据一致性延迟的场景。

3. Write Combining(写合并)

  • 工作原理
    • 对多个连续的写操作进行合并,在写缓冲器中批量写入主存。
    • 通常用于图像处理、DMA 传输等场景。
  • 优点
    • 减少主存写操作次数,提高总的写性能。
  • 缺点
    • 数据一致性依赖于合并策略,可能会引入延迟。
  • 适用场景
    • 高吞吐量、低数据一致性要求的场景,如硬件设备缓冲区。

写数据的典型流程(以 Write-Back 为例)

  1. 写入 Cache

    • CPU 通过 Cache Controller 将数据存储到 Cache 中。
    • 如果目标地址的 Cache Line 已存在(命中),更新对应的数据。
    • 如果未命中,先从主存加载目标地址的 Cache Line,再写入新的数据。
  2. 标记 Dirty

    • 更新 Cache Line 的标志位,标记为“已修改”(Dirty)。
  3. 延迟写回

    • 数据不会立即写入主存。
    • 当 Cache Line 被替换或需要刷新的时候,Cache Controller 会将 Dirty 数据写回主存。

数据一致性问题

由于数据在 Cache 和主存之间可能存在延迟写入,所以可能会导致以下问题:

  • 数据一致性问题

    • 如果 CPU 或设备访问的是主存而不是 Cache,可能读取到旧数据。
    • 多核 CPU 或其他硬件设备共享同一内存区域时,需要特别处理一致性。
  • 解决方法

    1. 内存屏障(Memory Barrier)
      • 强制确保在屏障之前的所有操作完成后,才执行屏障之后的操作。
    2. Cache 刷新(Cache Flush)
      • 使用指令(如 clflush)将 Cache 数据强制写回主存。
    3. 禁止 Cache
      • 对某些关键内存区域(如设备寄存器),可以禁用 Cache 或使用 Non-Cached 模式。

总结

启用 Cache 后,写数据是先写入 Cache,然后再根据策略写入主存。具体的写行为取决于 Cache 策略(Write-Through、Write-Back 或 Write Combining):

  • Write-Through:实时同步到主存,数据一致性高,但效率较低。
  • Write-Back:延迟写回主存,性能更高,但需要注意一致性问题。
  • Write Combining:合并写入,适用于连续写操作,但一致性较弱。

写缓冲器的介绍

其实在看了上面的关于Cache(高速缓存)“写合并”策略,就知道了写缓冲器是怎么回事儿了。

重要概念:主存(内存)中的数据除了可以被 CPU 修改,也可能被其他硬件或设备修改

主存中的数据不仅可以被 CPU 修改,还可能通过以下途径被其他设备修改:

  1. DMA 设备(如硬盘、网卡、GPU 等)。
  2. 外设映射内存(Memory-Mapped I/O)。
  3. 多核 CPU
  4. GPU
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值