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

Cache学习(2):Cache结构 命中与缺失 多级Cache结构 直接映射缓存

1 Cache名词解释

  • 命中(hit): CPU要访问的数据在Cache中有缓存
  • 缺失(miss): CPU要访问的数据在Cache中没有缓存
  • Cache Size:Cache的大小,代表Cache可以缓存最大数据的大小
  • Cache Line:Cache会被平均分成很多相等的块,每一个块大小称之为Cache Line Size;Cache Line是Cache和主存之间数据传输的最小单位。当CPU试图load一个字节数据的时候,如果Cache缺失,那么Cache控制器会从主存中一次性的load一个Cache Line大小的数据到Cache中。例如,Cache Line大小是8字节。CPU即使读取一个Byte,在Cache 出现miss后,Cache会从主存中load 8字节填充整个Cache Line。

Cache Size 为 64 Bytes的Cache举两个例子:

  • 将64 Bytes平均分成64块,那么Cache Line就是1字节,总共64行Cache Line
  • 将64 Bytes平均分成8块,那么Cache Line就是8字节,总共8行Cache Line

现在的硬件设计中,一般Cache Line的大小是4-128 Byts。会有如下两个问题:

  • Cache如何判断是否命中
  • 这个值为什么不是更低,低至1字节,这样就可以更加灵活的映射,从而没有刷新整个cache line的开销
  • 这个值为什么不是更高或者更低
  • 为什么一次要读取整个Cache Line

将在后文中进行解释说明。

2 多级Cache之间的配合工作

当CPU试图从某地址load数据时,下图为只有两级Cache的系统举例:

  • 从L1 Cache中查询是否命中,如果命中则把数据返回给CPU(蓝色实线)
  • L1 Cache缺失,则继续从L2 Cache中查找。当L2 Cache命中时,数据会返回给L1 Cache以及CPU(绿色实线&绿色虚线)
  • L2 Cache也缺失,需要从主存中load数据,将数据返回给L2 Cache、L1 Cache及CPU(红色实线&红色虚线)

image-20231123002418504

这种多级Cache的工作方式称之为inclusive Cache。某一地址的数据可能存在多级缓存中。与Inclusive Cache对应的是Exclusive Cache,这种Cache保证某一地址的数据缓存只会存在于多级Cache其中一级。也就是说,任意地址的数据不可能同时在L1和L2 Cache中缓存。

3 直接映射缓存(Direct Mapped Cache)

3.1 举例1

以一个Cache Size 为 128 Bytes 并且Cache Line是 16 Bytes的Cache为例。首先把这个Cache想象成一个数组,数组总共8个元素,每个元素大小是 16 Bytes,如下图:

image-20231123010312213

现在考虑一个问题,CPU从0x0654地址读取一个字节,由于Cache大小相对于主存来说,是非常小的。所以Cache只能缓存主存中极小一部分数据。如何根据地址在有限大小的Cache中查找数据呢?现在硬件采取的做法是对地址进行散列(可以理解成地址取模操作)。

3.2 命中与缺失

经过如下计算:

  • 假设地址总线是16位,目标地址为0x0654,转换为二进制为 0000,0110,0101,0100
  • Offset:由于每个Cache Line中有16 Byte,所以地址最低4位,即为每一个Cache Line中的偏移Offset,标记在这个Cache Line中的具体位置是哪个字节,举例中为0100,即为图中地址段的蓝色背景部分
  • Index:由于一共有8个Cache Line,所以地址除去最低4位的后3位,即为不同Cache Line的索引Index,标记具体在整个Cache 中的那一个Cache Line,举例中为101,即为图中地址段的绿色背景部分

image-20231124003425693

如果两个不同的地址,其地址的Index部分完全一样,这两个地址经过硬件散列之后都会找到同一个Cache Line。所以,根据地址确定到Cache Line之后,只代表所需要访问的目标地址中存储的对应数据可能存在这个Cache Line中,但是该Cache Line也有可能存储其他地址对应的数据。

所以,独立于Data Array,又引入Tag Array区域,Tag Array和Data Array中的每一个Cache Line都有着一一对应关系。每一个Cache Line都对应唯一一个tag,tag中保存的是整个地址位宽去除index和offset使用的bit剩余部分(如上图地址粉色背景部分)。tag、index和offset三者组合就可以唯一确定一个地址了。

因此,根据地址中index位找到Cache Line后,取出当前Cache Line对应的tag,然后和目标地址的tag进行比较,如果相等,这说明Cache命中。如果不相等,说明当前Cache Line存储的是其他地址的数据,这就是Cache缺失。

在上述图中,我们看到tag的值是0,0000,1100,和地址中的tag部分相等,因此在本次访问会命中。

我们可以从图中看到tag旁边还有一个valid bit,这个bit用来表示Cache Line中数据是否有效(例如:1代表有效;0代表无效)。当系统刚启动时,Cache中的数据都应该是无效的,因为还没有缓存任何数据。Cache控制器可以根据valid bit确认当前Cache Line数据是否有效。所以,上述比较tag确认Cache Line是否命中之前还会检查valid bit是否有效。只有在有效的情况下,比较tag才有意义。如果无效,直接判定Cache缺失。

此时回答,前文提出的第二个问题:这个值为什么不是更低,低至1字节,这样就可以更加灵活的映射,从而避免了因为部分所需要的数据而刷新整个Cache Line的开销

由于tag的引入。这样会导致硬件成本的上升,将两种情况进行对比:

  • 原本Cache Line 设置为16 Byte:每16 Byte对应一个tag,需要8个tag
  • 假设Cache Line设置为1 Byte:需要128个Tag同时每一个Tag的长度也会更长,因为Offest缩短了

因此可以发现这样做占用了很多内存。需要注意:tag也是Cache的一部分,但是谈到Cache size的时候并不考虑tag占用的内存部分。

上面的例子中,总结如下:Cache Size是128 Byte并且Cache Line size是16 Byte,共计8个Cache Line。

  • offset:4bit
  • index:3bit
  • tag:9bits(假设地址宽度是16 bit)

3.3 直接映射缓存的优缺点

  • 优点1:直接映射缓存在硬件设计上会更加简单
  • 优点2:因为优点1,所以成本上也会较低

根据直接映射缓存的工作方式,可以计算出不同主存地址段和对应的Cache

地址段Cahce Line Index
0x0000-0x000F,0x0080-0x008F,…0
0x0010-0x001F,0x0090-0x009F,…1
0x0020-0x002F,0x00A0-0x00AF,…2
0x0030-0x003F,0x00B0-0x00BF,…3
0x0040-0x004F,0x00C0-0x00CF,…4
0x0050-0x005F,0x00D0-0x00DF,…5
0x0060-0x006F,0x00E0-0x00EF,…6
0x0070-0x007F,0x00F0-0x00FF,…7

可以看到,地址0x0000-0x007F地址(0x0000-0x000F~0x0070-0x007F)处对应的数据可以覆盖整个Cache。0x0080-0x00FF地址的数据也同样是覆盖整个Cache。

现在思考一个问题,如果一个程序试图依次访问地址0x0000、0x0080、0x0100,Cache中的数据会发生什么呢?首先应该明白0x0000、0x0080、0x0100地址中index部分是一样的。因此,这3个地址对应的Cache Line是同一个。所以,当访问0x0000地址时,Cache会缺失,然后数据会从主存中加载到Cache中第0行Cache Line。当我们访问0x0080地址时,依然索引到Cache中第0行Cache Line,由于此时Cache Line中存储的是地址0x0000地址对应的数据,所以此时依然会Cache缺失。然后从主存中加载0x0080地址数据到第一行Cache Line中。同理,继续访问0x0100地址,依然会Cache缺失。这就相当于每次访问数据都要从主存中读取,所以Cache的存在并没有对性能有什么提升。访问0x0080地址时,就会把0x00地址缓存的数据替换。这种现象叫做Cache颠簸(Cache thrashing)。针对这个问题,在后面的文章中引入多路组相连缓存优化规避这一问题。

image-20231124012346869

相关文章:

Cache学习(2):Cache结构 命中与缺失 多级Cache结构 直接映射缓存

1 Cache名词解释 命中(hit): CPU要访问的数据在Cache中有缓存缺失(miss): CPU要访问的数据在Cache中没有缓存Cache Size:Cache的大小,代表Cache可以缓存最大数据的大小Cache Line&a…...

vue前端前端页面权限验证方式

在Vue应用中使用Vuex(Vue的状态管理库)来存储用户组(user group)和角色(roles)信息是一种合理的做法,特别是在涉及到权限管理和用户身份的情况下。Vuex提供了一个集中式的状态管理方案&#xff…...

jenkins springCloud项目优雅下线

文章目录 场景解决下线请求效果如图贴一个可用的部署脚本 场景 在 Spring Cloud 项目的微服务实例关闭时,需要首先从注册中心设置为下线,避免该服务的消费者继续请求该服务实例,导致请求失败如果我们在服务实例从注册中心取消注册后&#xff…...

indexOf

可以通過String的indexOf判斷是否包括某個字符。 SpringBootTest Slf4j class BaseApplicationTests {Testvoid contextLoads() {log.info("01".indexOf(".")"");log.info("0.1".indexOf(".")"");log.info("…...

STM32分区跳转问题

项目场景: 在OTA中,FLASH通常被划分为以下几种类型 bootloaderiapappbootloaderappapp保存区bootloaderapp1app2 不同的分区方式有不同的有点,但是共同点都是需要执行分区跳转 问题1描述 但在分区跳转过程中遇到过使用不同的编译器不能跳转…...

亿级流量架构服务降级

什么是服务降级 如果看过我前面对服务限流的分析,理解服务降级就很容易了,对于一个景区,平时随便进出,但是一到春节或者十一国庆这种情况客流量激增,那么景区会限制同时进去的人数,这叫限流,那么什么是服务降级呢? 简单来说就是,将一些不太重要的景区项目砍掉,平时就那么三五…...

【技术分享】RK3399 Ubuntu通过Python实现录音和播放功能

​本文基于IDO-SBC3968 Ubuntu 系统通过Python脚本实现录音和播放功能。 IDO-SBC3968采用RK3399国产六核64位CPU高性能处理器,支持4K HDMI2.0显示,接口丰富,拥有千兆以太网,全协议TypeC接口,USB3.0 ,eDP 和…...

关于vs code Debug调试时候出现“找不到任务C/C++: g++.exe build active file” 解决方法

vs code Debug调试时候出现“找不到任务C/C: g.exe build active file” ,出现报错,Debug失败 后来经过摸索和上网查找资料解决问题 方法如下 在Vs code的操作页面左侧有几个配置文件 红框里的是需要将要修改的文件 查看tasks.json和launch.json框选&…...

交叉导轨在光学工作台起什么重要作用?

光学工作台常常需要承载和移动各种光学元件和仪器,如望远镜、显微镜、光谱仪等,这些设备需要在空间中进行精确的定位和稳定支撑,而交叉导轨作为一种高精度、高刚度的直线传动元件,为光学工作台提供了重要的支撑和导向。 1>交叉…...

易点易动固定资产管理系统:实现固定资产与财务系统的高效对接

在企业的日常运营中,固定资产的管理和财务账目的记录是两项不可或缺的任务。然而,由于传统的管理方式存在数据孤岛和信息不一致等问题,往往导致工作效率低下和管理混乱。为了解决这一问题,易点易动固定资产管理系统应运而生。该系…...

做亚马逊多久可以赚钱?做亚马逊需要多少资金?——站斧浏览器

做亚马逊需要时间、资金和全面的市场策略。创业者需要有耐心和决心,同时也要灵活应对市场变化。那么做亚马逊多久可以赚钱,做亚马逊需要多少资金。 做亚马逊多久可以赚钱 首先,就像任何其他生意一样,做亚马逊需要时间和努力来建立起稳定的客…...

计算机应用基础_错题集_基础知识---网络教育统考工作笔记006

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、基础知识部分错题集总结前言 计算机应用基础统考,错题集总结 一、基础知识部分 基础知识部分 2、微处理器芯片的位数即指______。 A.速度 B.字长 C....

C#面试题3

1.请解释一下C#中的并发编程和线程安全性。 并发编程是指在多线程环境下编写代码以实现并发执行的能力。C#提供了一些机制来支持并发编程,如线程、任务和并行循环等。线程安全性是指在多线程环境下,代码能够正确地处理共享数据并保持一致性。线程安全的代…...

MariaDB(基础信息)

文章目录 一、MariaDB1、基本信息2、存储引擎3、兼容性》MySQL、Postgres、MongoDB 和 Oracle4、直接连接其他数据源5、等等等。。。。。。。。。。。。。。。。。。。。。 二、操作和mysql一样参考文章 --------------------机翻内容仅供参考------------------------- 一、…...

SpringBoot + 通义千问 + 自定义React组件,支持EventStream数据解析!

一、前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 最近ChatGPT非常受欢迎,尤其是…...

Redis中文结果查看方式

背景 当使用redis时我们存储到缓存中可能会包含一些中文,例如下面命令 set test 中国 当执行查看时,发现客户端显示的并不是中文而是乱码,例如下面结果 get test \xe4\xb8\xad\xe5\x9b\xbd 现对【\xe4\xb8\xad\xe5\x9b\xbd】的查看有如下几个方式 方式一:通过客户端直…...

计算机组成原理-磁盘存储器

文章目录 总览外存储器磁盘存储器磁盘的性能指标磁盘地址磁盘的工作过程磁盘阵列 总结 总览 外存储器 磁盘存储器 写是利用电流产生磁场从而写磁盘 读是利用载磁体移动时产生的电场从而得到数据 磁性材质易受外界磁场干扰 下图中 载磁体上N S的前后顺序代表对应存储二进制的比…...

连接docker swarm和凌鲨

docker swarm相比k8s而言,部署和使用都要简单很多,比较适合中小研发团队。 通过连接docker swarm和凌鲨,可以让研发过程中的常用操作更加方便。 更新容器镜像调整部署规模查看日志运行命令 使用步骤 部署swarm proxy 你可以通过linksaas…...

Qt实现画的图片移动

要实现左键点击鼠标时图片跟着鼠标移动,可以通过以下步骤来实现:1. 在QGraphicsView的构造函数中设置鼠标跟踪属性,以便能够捕获鼠标事件。cpp QGraphicsView::QGraphicsView(QWidget *parent) : QGraphicsView(parent) {setMouseTracking(tr…...

比较2个点的3种结构在不规则平面上的占比

2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 1 2 2 3 3 3 x 3 3 2 2 2 1 2 2 2 2 2 1 2 2 在平面上有一个点x,再增加一个点,11的操作把平面分成了3部分2a1,2a2,2a3,3部分的比值是 2a1 2a2 2a3 5 25 …...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...