当前位置: 首页 > ai >正文

计算机组成与体系结构:缓存设计概述(Cache Design Overview)

目录

Block Placement(块放置)

 Block Identification(块识别)

Block Replacement(块替换)

Write Strategy(写策略)

总结:


高速缓存设计包括四个基础核心概念,它们分别是:Block Placement(块放置)、Block Identification(块识别)、Block Replacement(块替换)以及Write Strategy(写策略)。这四者共同构成了高速缓存的基本工作机制,理解它们是深入学习缓存设计 的前提。

Block Placement(块放置)

这是指主存中的数据块应该被放置到 Cache 的哪个位置。

核心问题:

一个主存块可以放在 Cache 的哪些位置? 

📚 三种主要的映射方式:

直接映射(Direct-Mapped)

  • 每个主存块只能映射到 Cache 中的一个特定位置。

  • 优点:实现简单,访问速度快

  • 缺点:冲突率高,多个主存块可能争用同一个位置

全相联映射(Fully Associative)

  • 主存中的任意数据块都可以放入 Cache 的任意位置。

  • 优点:冲突最小化

  • 缺点:硬件复杂,查找开销大

组相联映射(Set-Associative)

  • Cache 分成多个集合(Set),每个集合中有多个行(Way)。

  • 每个主存块映射到一个集合,再在集合中任意位置放置。

  • 常见形式如:2-way, 4-way 等

  • 折中方案:在冲突率和复杂度之间取得平衡

 Block Identification(块识别)

当我们访问某个内存地址时,Cache 必须判断这个地址是否在 Cache 中。

核心问题:

如何在 Cache 中识别这个块是否存在?如果存在,是哪一块?

🧱 Cache 的地址划分:

  • Tag(标记位):用于识别主存块是否和 Cache 中的块匹配

  • Index(索引位):用于定位块应该在哪个集合或位置

  • Block Offset:用于在块内部定位具体的字节

 匹配流程:

对于一个内存访问,系统会从地址中提取出:

  1. Index:找到对应的 Set(或直接映射的位置)

  2. Tag:与 Set 中每个块的 Tag 比较(比较命中即是命中)

  3. 若命中,使用 Offset 访问数据;否则触发缺失(Miss)

直接映射 

组相联映射

全相联映射

Block Replacement(块替换)

当 Cache 中的目标位置已经被占用,而新的主存块又必须装入 Cache 时,我们需要替换掉某个已经存在的块。

核心问题:

如果缓存满了,哪一个块应该被替换掉?

⚙️ 替换动作的标准流程:

  1. 判断是否命中(如果命中则直接访问);

  2. 如果不命中,判断 Cache 是否有空位(组或全相联中);

  3. 若无空位 → 触发 Block Replacement 策略:

    • 找到最“合适”被淘汰的块;

    • 若该块为“脏块” → 写回到主存;

    • 装载新的主存块进入该位置。

🤖 替换策略:

  1. LRU(Least Recently Used):替换最近最少使用的数据块(常用)

  2. FIFO(First-In First-Out):替换最早进入缓存的块(简单但可能非最优)

  3. Random Replacement:随机选择一个块替换(实现简单)

  4. Pseudo-LRU:近似 LRU,用于减少硬件实现的复杂性

 策略选择的影响:

  • 替换策略直接影响 命中率(Hit Rate) 和 系统性能

  • LRU 在局部性较强的访问模式中表现良好,但实现开销高

Write Strategy(写策略)

Cache 设计中必须明确:当数据被写入时,主存和 Cache 的一致性如何保证。

核心问题:

写操作是直接修改主存,还是只修改 Cache?是否需要同步?

📝 两大类策略:

✅ 写命中策略(Write Hit Policy):

  1. Write-Through(直写)

    • 同时写 Cache 和主存

    • 简单但会产生大量主存写操作

  2. Write-Back(回写)

    • 只写 Cache,并标记为“脏块”

    • 仅在块被替换时才写回主存

    • 减少主存访问次数,但需要写回控制逻辑

❌ 写缺失策略(Write Miss Policy):

  1. Write Allocate(写分配)

    • 缺失时先将块读入 Cache,然后写入 Cache(常用于 Write-Back)

  2. No Write Allocate(非写分配)

    • 缺失时直接写主存,不将数据加载到 Cache(常用于 Write-Through)

总结:

这四部分实际上是一个闭环的机制:

  1. 块放置决定了一个主存块被映射到 Cache 的哪个位置;

  2. 块识别决定我们如何判断一个内存访问是否命中 Cache;

  3. 块替换决定当位置冲突时该替换谁;

  4. 写策略决定了写入数据时 Cache 和主存的一致性如何维护。

它们密切关联,共同定义了 Cache 的工作行为和性能表现。

 有了以上四个基础组成部分的理解,我们就可以正式迈入 Cache Design 的大门了。Cache

Design 是对这些策略的组合与优化,使得 Cache 在访问速度、能效、硬件成本和命中率之间达成

平衡。一个好的设计往往结合特定应用场景,对上述四大机制做出权衡和创新。

http://www.xdnf.cn/news/6099.html

相关文章:

  • spring中的@MapperScan注解详解
  • 【RabbitMq】无法打开 RabbitMq 管理插件的问题
  • Python基础入门
  • 文件名是 ‪E:\20250512_191204.mp4, EV软件录屏,未保存直接关机损坏, 如何修复?
  • 机器学习入门案例:鸢尾花分类与AI辅助
  • 机器人示教操作
  • 微型PCB打样厂家选型指南
  • 全局优化搜索高次方程的解
  • C++学习之打车软件git版本控制
  • RabbitMQ 快速上手:安装配置与 HelloWorld 实践(二)
  • 【SSL证书系列】客户端如何验证https网站服务器发的证书是否由受信任的根证书签发机构签发
  • 【原创】使用阿里云存放一个临时共享的文件
  • FunASR:语音识别与合成一体化,企业级开发实战详解
  • 论MCU如何在Fatfs中使用Flash接口的方法
  • 前端面试每日三题 - Day 34
  • 白盒测试——基本路径测试法
  • copy_paste
  • 如何实现一个运动会计分系统?(C语言版)
  • 高速系统设计实例设计分析二
  • Java—类与对象(一)
  • LLM(大语言模型)部署加速方法——PagedAttention
  • c# 倒序方法
  • 【Java】 volatile 和 synchronized 的比较及使用场景
  • 【RabbitMQ】路由模式和通配符模式的具体实现
  • 嵌入式培训之数据结构学习(三)gdb调试
  • dify 连接不上ollama An error occurred during credentials validation:
  • gitlab提交测试分支的命令和流程
  • HCIP(BFD)
  • Linux——CMake的快速入门上手和保姆级使用介绍、一键执行shell脚本
  • 硬盘序列号(SN码)4种常用查询方法分享