存储模块 --- Cache

news2025/7/17 12:17:15

在这里插入图片描述
在这里插入图片描述


Cache

高速缓冲存储器

内存一般采用SDRAM芯片,对内存的访问肯定是不及CPU的速度的,通常说内存访问要比CPU的速度慢的多。也就是说内存拖后腿了。
CPU访问内存并不是完全随机的。 在某个时间段内,CPU总是访问当前内存地址的相邻内存地址, 想象一下指令顺序执行和循环执行的情景, 这种情景就是著名的程序局部性原理。
基于程序局部性原理,CPU和内存之间可以放置一个小而快的中间存储器,它的速度和CPU的速度差不多,事实上要慢一丢丢,但比内存快得多,这就是高速缓冲存储器。

高速缓冲存储器可以是统一的也可以是分开的。
统一是指数据和指令放在同一个缓冲器中
分开是指数据和指令分别用不同的缓冲器存放

RAM分两种,一种是静态RAM,SRAM(Static RAM);一种是动态RAM,DRAM(Dynamic RAM)。前者的存储速率要比后者快得多
使用的内存一般都是动态RAM。为了增加系统的速率,把缓存扩大就行了,扩的越大,缓存的数据越多,系统就越快了,缓存通常都是静态RAM,速率是非常的快, 但是静态RAM集成度低(存储相同的数据,静态RAM的体积是动态RAM的6倍), 价格高(同容量的静态RAM是动态RAM的四倍), 由此可见,扩大静态RAM作为缓存是一个非常愚蠢的行为, 但是为了提高系统的性能和速率,必须要扩大缓存, 这样就有了一个折中的方法,不扩大原来的静态RAM缓存,而是增加一些高速动态RAM做为缓存, 这些高速动态RAM速率要比常规动态RAM快,但比原来的静态RAM缓存慢, 把原来的静态RAM缓存叫一级缓存,而把后来增加的动态RAM叫二级缓存。


工作机制

缓存只是内存中少部分数据的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),这时CPU还是会到内存中去找数据,这样系统的速率就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不要再到内存中去取。随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,刚才还是最频繁的数据,又不频繁了,所以说缓存中的数据要经常按照一定的算法来更换,这样才能保证缓存中的数据是被访问最频繁的。

CPU下一次要读取的数据90%都在CPU缓存中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先缓存后内存。

  • Cache收到CPU访问内存的地址
  • Cache的地址变换逻辑 —> 将CPU访问内存的地址分解为块号和块内偏移
  • 通过第二步中分解出的块号和块偏移去寻找Cache块
  • 如果能找到Cache块,则命中,同时去索引块中数据。如果是访问内存的操作则将数据返回给CPU如果是写内存操作,根据Cache类型的不同Cache的动作也不同
  • 如果第3步中没有找到对应的Cache块,则未命中
  • 如果Cache未命中, Cache首先查找Cache内部有没有空闲块。
  • 如果5中找到空闲块,则装入CPU访问内存地址对应的内存块。同时如果是读内存,则代替CPU访问内存后返回数据给CPU。如果是写内存,则根据Cache类型的不同Cache的动作也不同
  • 如果第6步中Cache没有找到一个空闲块, 就让Cache块替换逻辑, 找出Cache中最值得替换出去的块。 并且有相关的替换算法, 只是这种算法是硬件实现的。 如果CPU是读内存操作, 那么根据替换块的块号和状态, Cache会决定是否把这个块回写到内存中, 或者直接废除, 最后在该替换出去的块中装入CPU访问内存地址对应的内存块, 同时把这个地址对应的数据返回给CPU。 如果CPU是写内存操作, 根据Cache的类型不同Cache的动作也不同。
    在这里插入图片描述

Cache的类型

根据Cache的工作机制, 可以把Cache分成很多类型, 我们主要看看下面两种类型, 在ARM920T中知道这两种就够了。 当然了解这两种类型是为了要说明后面要注意的问题, “要注意的问题”才是重要的。

  • 回写式Cache。
  • 写通式Cache。

当CPU执行写数据操作时, 回写式Cache只把该数据写入其数据地址对应的Cache块中, 不直接写入内存。
当CPU执行写数据操作时, 写通式Cache必须同时把该数据写入其数据地址对应的Cache块和内存中。

一些Notice

采用Cache后可能出现的问题

1 一致性问题。

如果硬件系统中有多核心的CPU, 每个CPU核心内部都有独立的Cache。 这时如果内存中有个全局数据A且A=0。 如果两个CPU核都对其执行加1操作。 如果按照下面的执行顺序, 就会出现问题。 而事实上如果不加控制我们无法对这种硬件的执行顺序进行估计, 很有可能就发生

下面的执行顺序。
1) CPU0读取内存中A的数据到R0寄存器, 并且缓存A的数据到CPU0的Cache中。 CPU0的R0寄存器中为0, CPU0的Cache中A数据对应的Cache块中的单元为0。2) CPU0对它的R0寄存器执行加1操作, 并且把结果写入CPU0的Cache中, 假定这个Cache是回写式Cache, CPU0的Cache中A数据对应的Cache块中的单元为1。 CPU0接着执行下一条指令。
3) CPU1读取内存中A的数据到R1寄存器, 并且缓存A的数据到CPU1的Cache中。 由于第2) 步中CPU0的Cache中的A数据没有回写到内存中, 内存中A数据没有改变。 所以CPU1的R1寄存器中为0, CPU1的Cache中A数据对应的Cache块中的单元为0。
4) CPU1对它的R1寄存器执行加1操作, 并且把结果写入CPU1的Cache中, 假定这个Cache是回写式Cache, CPU1的Cache中A数据对应的Cache块中的单元为1。 CPU1接着执行下一条指令。这时不管哪个CPU的Cache中A数据对应的Cache块发生了替换, 内存中数据A为1。

2 写入实时性问题

在打开Cache的情况下, 如果读取RTC寄存器中的状态数据时, 很有可能读取的不是RTC寄存器的最新数据而是读取缓存在Cache中的数据。 这会使我们获取的数据不准确, 有时会产生致命的错误。 如果写入数据到RTC寄存器中对RTC设备进行控制。 这个数据会首先写入Cache中(如果是回写式Cache) 。 我们满心以为RTC设备已经得到了控制,然而我们错了, 这时控制数据也许还在Cache中, 还没有到RTC设备控制寄存器中去。 当然其他设备也是一样。 这种问题非常危险, 而且这种类型的错误根本就不是由程序代码本身的问题导致的, 查起来也不是一般的困难。

解决方式:
解决上述问题的最好方法是, 对映射设备寄存器的存储器地址空间, 不执行Cache缓存。 在MMU的章节中, 了解到每个页表条目中有C、 B两个位。 这两个位就是控制这个页表条目映射的地址空间, 是否被Cache部件(C位) 或者写缓冲部件(B位, 写缓冲也是一种小型的Cache, 但是不详细研究它) 缓存。 只要把设备寄存器所在的页面的页表条目中的C、 B位设置为0, 就解决上述问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数理统计笔记5:参数估计-区间估计

引言 数理统计笔记的第5篇先介绍了参数估计的区间估计。包括单总体均值、单总体比例、单总体方差以及两总体均值之差、两总体方差之比几种常见的情况。 引言总体均值的置信区间(σ2\sigma^2σ2已知)-Z法总体均值的置信区间(σ2\sigma^2σ2未知…

【Call for papers】SP-2023(CCF-A/网络与信息安全/2022年12月2日截稿)

文章目录1.会议信息2.时间节点Since 1980, the IEEE Symposium on Security and Privacy has been the premier forum for presenting developments in computer security and electronic privacy, and for bringing together researchers and practitioners in the field. The…

whylogs工具库的工业实践!机器学习模型流程与效果监控 ⛵

💡 作者:韩信子ShowMeAI 📘 机器学习实战系列:https://www.showmeai.tech/tutorials/41 📘 本文地址:https://www.showmeai.tech/article-detail/395 📢 声明:版权所有,转…

如何理解相位噪声与时间抖动的关系?

每当介绍相位噪声测试方案时,都会提到时间抖动,经常提到二者都是表征信号短期频率稳定度的参数,而且是频域和时域相对应的参数。正如题目所示,相位噪声与时间抖动有着一定的关系,那么相噪是与哪种类型的抖动相对应&…

葡萄糖-聚乙二醇-醛基/羟基 Glucose-PEG-CHO/OH

葡萄糖-聚乙二醇-醛基Glucose-PEG-CHO 羰基中的一个共价键跟氢原子相连而组成的一价原子团,叫做醛基,醛基结构简式是-CHO,醛基是亲水基团,因此有醛基的有机物(如乙醛等)有一定的水溶性。 葡萄糖-聚乙二醇…

ILRuntime热更的小技巧

文章目录前因后果前因 因为ILRuntime热更项目直接打包出来的DLL不能放置到AssetBundle里面打包所以我看网上的代码都是读取DLL的bytes然后放置到一个text文件里面后缀是bytes public class DefaultPath {public static string ProjectRootPath Environment.CurrentDirectory…

超市便利店微信小程序引流拉新_分享超市便利店微信小程序开发的作用

作为消费主力的年轻人,习惯用手机。习惯在手机下单,享受足不出户的方便快捷。 再加上疫情反复,线上购物,无接触配送显得更安全卫生。 再这样的市场环境下,做一个线上的超市小程序,就能解决很多问题&…

SpringCloud学习笔记(三)

文章目录SpringCloud学习笔记(一)1.Ribbon 概述2.负载均衡3.Ribbon 快速入门3.1 本次调用设计图3.2 项目搭建3.3 创建 provider-1和provider-23.4 编写 provider-1 和 provider-23.5 创建 consumer3.6 编写 consumer 的启动类3.7 编写 consumer 的 ConsumerController3.8 启动测…

83.Django项目中使用验证码

1. 概述 ​ 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止…

分布式节能聚类算法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

MySQL隔离级别的底层理解(MVCC+锁)

MySQL事务的隔离级别和并发的关系 mysql是一个C/S架构的软件, 也就意味着, 同一个mysql服务器可能同时存在很多的clients集合来访问. 此时最重要的是什么? 并发性. 并发时候的安全. 并发和数据库安全性本来就是相互矛盾的。要保证更好的安全性最好的方式是什么? 完全舍弃并…

云原生系列 四【轻松入门容器基础操作】

✅作者简介: CSDN内容合伙人,全栈领域新星创作者,阿里云专家博主,华为云云 享专家博主,掘金后端评审团成员 💕前言: 最近云原生领域热火朝天,那么云原生是什么?何为云原生…

最详细的Keycloak教程:Keycloak实现手机号、验证码登陆——(一)Keycloak的下载与使用

目录一、 简介二、Keycloak下载与启动三、配置国际化内容一、 简介 接触keycloak已经半个多月了,主要是为了用来集成现已有的项目,也是弄得头大,代码不负脱发人,也是有点小成果了,在这里把自己的这点小小经验分享给大…

CMOS IC功耗类型及其影响因素

目录 概述 开关功耗(Switch Power) 内部功耗(Internal Power) 漏电功耗(Leakage Power) 工艺库相关 开关功率相关信息 内部功耗相关信息 漏电功耗相关信息 例子 概述 该部分对IC功耗的类型进行介绍 先总体来…

安装黑苹果常见问题总结

黑苹果字体模糊? 由于macOS使用了HiDPi技术以达到更高的每英寸像素率,即缩放,因此普通显示器只要不是4k分辨率,安装黑苹果后一定会遇到字体模糊的问题,解决方法可以阅读我往期发布的文章。 为什么用iStat Menus无法检…

期末前端web大作业:用DIV+CSS技术设计的动漫网站——火影忍者6页 带报告

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 网页设计作业 | 动漫网页设计 | 动漫网页设计成品 | 动漫网页设计成品模板 | 简单漫画网页设计成品 | HTML期末大学生网页设计作业 HTML:结…

深度学习第四课——卷积神经网络(week 1)

目录 一、前言 1.1 卷积 1.2 其他滤波器 1.3 Padding 1.3.1 解释 1.3.2 填充多少像素的选择 1.4 卷积步长 1.5 三维卷积 1.6 单层卷积网络 1.7 深度卷积神经网络的一个示例 1.8 池化层 1.8.1 最大池化 1.8.2 平均池化 1.8.3 总结 1.9 卷积神经网络示例 1.10 为…

23种设计模式

1.创建型模式 ① 创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set 相关属性 ② 但是很多场景下,需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类,但…

leetcode:644. 子数组最大平均数 II【浮点数二分 + 子数组最大平均值技巧】

目录题目截图题目分析ac code总结题目截图 题目分析 枚举铁超时, 10 ** -5考虑二分平均值需要同时考虑总和和长度能否只考虑一个考虑每个数num’ num - avg这样可以忽略长度猜一个guess_avg是否可能达到num’ -> num - avg_guess区间sum(num’) > 0说明其真…

Linux 开机运行sh 脚本 三种方法

一、修改开机启动文件​​​​​​​ /etc/rc.local(或者/etc/rc.d/rc.local) 1、编辑rc.local文件(命令后面让得加&号,表示后台运行) 2、最后修改rc.local文件的执行权限: chmod x /etc/rc.local二…