高速缓存存储器(Chche)

为了解决CPU和主存之间速度不匹配的问题,计算机系统中引入了高速缓存(Chche)的概念。

基本想法:使用速度更快但容量更小、价格更高的SRAM制作一个缓冲存储器,用来存放经常用到的信息;这样一来,CPU就可以直接与Chche交换数据,而不用访问主存了。

这种方案有效的原因:对大量典型的程序分析后,发现在一定时间内,CPU要从主存取指令或数据,只会访问主存局部的地址区域。这是由于指令和数据在内存中是连续存放的,而且有些指令和数据会被多次调用;也就是说,指令和数据在主存中地址分布不是随机的,而是相对的簇聚。这使得CPU执行程序时,访问内存具有相对的局部性;这称为程序访问的局部性原理。

  • 时间局部性:如果一个数据现在被访问了,那么以后也很有可能被访问
  • 空间局部性:如果一个数据现在被访问了,那么它周围的数据在以后也可能会被访问。

局部性原理是Cache高效工作的理论基础。

1.Cache的基本工作原理

为了方便Cache与主存交换信息,Cache和主存都被划分为了相等的块Cache块又称Chche行,每块由若干字节组成,块的长度称为块长。由于Cache的容量远小于主存的容量,所以Cache中的块数要远少于主存中的块数,Chche中仅保存主存中最活跃的若干块的副本

1.Cache工作原理

假设主存按照字节编址,地址用n位二进制码表示,那么主存容量为2^nB;块的大小为16个字节,那么主存中块的个数为:2^{n-4}。如果我们对每个块也做一个编号,其实就对应着地址的前n-4位。

因此,我们将地址分为两部分:主存块号和块内地址。

 高n-4位表示主存中的“块地址”,低4位表示“块内地址”。

块内地址其实可以看做具体存储字在块内的“偏移量”。

类似,Cache中地址也可以分为这样的两部分。

由于Cache中块长和主存一致,高位是块号,低位是行内地址。

可以按照某种策略预测CPU在未来一段时间内要访问的数据,将其装入Cache。

当CPU要读取主存中的某个字时,可分为两种情况:

  • Cache命中:需要的字已经在缓存中,就将其地址转换为缓存地址,直接访问Cache
  • Cache未命中:需要的字不再缓存中,仍需访问主存,并将该字所在的块一次性地从主存调入Cache。

如果某个主存块已经调入了Cache,就称它们之间建立了对应关系。

由于Cache容量没有主存大,我们就需要某种替换算法。

将需要调入Cache的信息替换掉之前某个Cache块的信息。

因此,一个缓存块不会永远只对应一个主存块。

==================================================================

总结:CPU与Cache之间的数据交换通常以字为单位;而Cache与主存之间的数据交换则以块为单位。

2.命中率

Cache的效率通常用命中率来衡量。

命中率是指CPU要访问的信息已经在Cache中的比率。

Cache的容量和块长都是影响命中率的重要因素。

3.Cache的基本结构  

 

4.Cache的改进

Cache的改进,主要就是由一个缓存改为使用多个缓存

主要有两个方向:增加Cache级数、将统一的Cache改为分立的Cache。

(1)两级缓存

最初在CPU和主存之间只设一个缓存,称为单一缓存

随着集成电路密度的提高,这个缓存直接与CPU集成在一个芯片中了,所以又称为片内缓存(片载缓存)。

由于片内缓存容量无法做到很大,所以可以考虑在片内缓存和主存之间再加一级缓存,称为片外缓存,也由SRAM组成。

这种有两级缓存的Cache系统被称为“两级缓存”,片内缓存作为第一级(L1),片外缓存作为第二级(L2)。

(2)分立缓存

指令和数据都存放在同一缓存内的Cache被称为统一缓存

分立缓存则将其存放在两个缓存中一个叫指令Cache,另一个叫数据Cache。这两种缓存的选择考虑如下两个因素:

  • 主存结构:如果计算机主存中指令、数据是统一存储的,则相应的Cache采用统一缓存;如果主存指令、数据分开存储,则相应的Cache采用分立缓存。
  • 机器对指令执行的控制方式:如果采用了超前控制或者流水线控制方式,一般都采用分立缓存。

超前控制,是指在当前指令执行尚未结束时就提前把下一条准备执行的指令取出

流水线控制,就是多条指令同时分阶段执行。(类似于多体低位存储方式)

2.Chche和主存之间的映射

Cache块中的信息是主存中某个块的副本,地址映射是指主存地址空间映射到Cache地址空间,这相当于定义了一个函数:

                                     Cache地址=f(主存地址)

由于Cache块和主存块长一样,而块内地址只是字在当前块内的“偏移量”,所以映射转换之后块内地址是不变的。我们仅仅需要Cache块号和主存块号之间的函数关系。

                                     Cache地址=f(主存地址)

Cache块远少于主存块,所以Cache块不可能永远对应唯一的主存块,需要在Cache中为每一个块加一个标记,指明它是主存中哪一块的副本。这个标记的内容,应该能够唯一确定对应主存块的编号。

另外,为了说明Cache行中的信息是否有效,每个Cache行还需要一个有效位,该位为1时,表示Cache中该映射的主存块数据有效;为0则无效。

地址映射的方式有如下3种:

1.直接映射

直接映射的思路非常简单,就是“挨个对应”,主存中的每一块只能装入Cache中的唯一位置。

由于Cache容量很小,当主存中的块已经“遍历”完所有Cache地址后,下一个主存块的对应位置就又成了Cache中的第一行(第一个块)。

很明显,这跟“顺序存储”的思路是一样的,用主存块数对Cache的总行数取模,就可以得到对应的Cache的行号了:

                           Cache行号=主存行号  mod  Cache总行数

因此,直接映射方式下,主存地址结构为:

访问内存的过程: 

2.全相联映射

全相联映射方式下,主存的地址结构为:

全相联映射方式的优点是灵活,Cache行的冲突概率低,空间利用率高,命中率也高;缺点是标记的速度较慢(标记变长了),实现成本较高。

3.组相联映射

把直接映射和全相联映射两种方式结合起来,就是组相联映射方式。

组相联的思路就是将Cache行分为Q个大小相等的组,每个主存块可装入对应组的任意一行;

它所在的组则按照顺序依次排列得到。

也就是组间采用直接映射、而组内采用全相联映射的方式

当Q等1时,则是全相联映射

当Q等于Cache时,则是直接映射。

 访问过程以及三种映射方式的区别

 

3.Cache中主存块的替换算法

最不经常使用算法一者是可能二者都为0或者同一个不为0的数,从而导致随机替换

二者是不具备时间累计的性质,无法确定上次使用是什么时候。 

这里我们最常使用LRU算法: 

4.Cache写策略

我们的Cache写分为命中和未命中两种情况

(1)Cache写命中

(2)Cache写未命中 

Cache行的表示: 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Git】--Part4--多人协作

在之前的Git博客中,已经把Git本地相关的操作以及远程操作的介绍完了。如下: Git–Part1–基础操作 - 掘金 (juejin.cn)Git–Part2–分支管理 - 掘金 (juejin.cn)Git–Part3–远程操作 & 配置 & 标签管理 - 掘金 (juejin.cn) 这篇文章会介绍两种…

[FreeRTOS 基础知识] 互斥访问与回环队列 概念

文章目录 为什么需要互斥访问?使用队列实现互斥访问休眠和唤醒机制环形缓冲区 为什么需要互斥访问? 在裸机中,假设有两个函数(func_A, func_B)都要修改a的值(a),那么将a定义为全局变…

音视频的Buffer处理

最近在做安卓下UVC的一个案子。正好之前搞过ST方案的开机广告,这个也是我少数最后没搞成功的项目。当时也有点客观原因,当时ST要退出机顶盒市场,所以一切的支持都停了,当时啃他家播放器几十万行的代码,而且几乎没有文档…

C++ | Leetcode C++题解之第179题最大数

题目&#xff1a; 题解&#xff1a; class Solution { public:string largestNumber(vector<int> &nums) {sort(nums.begin(), nums.end(), [](const int &x, const int &y) {return to_string(x) to_string(y) > to_string(y) to_string(x);});if (nu…

Django框架数据库ORM查询操作

Django框架在生成数据库的models模型文件后&#xff0c;旧可以在应用中通过ORM来操作数据库了。今天抽空试了下查询语句。以下是常用的查询语句。 以下查询需要引入django的Sum&#xff0c;Count&#xff0c;Q模块 from django.db.models import Sum,Count,Q 导入生成的mode…

Python | Leetcode Python题解之第179题最大数

题目&#xff1a; 题解&#xff1a; class Solution:def largestNumber(self, nums: List[int]) -> str:def quick_sort(l , r):if l > r: returni, j l, rwhile i < j:while strs[j] strs[l] > strs[l] strs[j] and i < j: j - 1while strs[i] strs[l] &l…

C++系列-String(一)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” string是用于字符串&#xff0c;可以增删改查 首先&#xff0c;我们来看一下string的底层 接下来&#xff0c;我们来看一下string的常用接口有哪些&#xff1a; #define _CRT_S…

csrf+xss组合拳

csrfxss组合拳 一、环境搭建 靶场cms文章管理系统 二、流程开始 这是系统前端 系统管理后台 而我们要打到后台管理员的cookie&#xff0c;结合前端存储型的xss完全可以实现&#xff0c;那后端怎么被打到cookie呢&#xff0c;我们来从这里添加用户开始分析数据包来说明 看看…

Python15 理解Python迭代器

1.Python中的迭代器 在Python中&#xff0c;迭代器是一种允许程序员遍历一个容器&#xff08;特别是列表、元组、字典等集合类型&#xff09;的对象&#xff0c;而不需要了解容器的内部结构。迭代器提供了一个统一的方法来逐一访问容器中的元素&#xff0c;这种机制称为迭代。…

苹果手机safari浏览器的userAgent显示为电脑的userAgent问题解决

目录 1.问题背景 2.userAgent 3.解决 1.问题背景 开发了一个H5&#xff0c;是通过生成二维码&#xff0c;扫描这个二维码后就跳到这个H5&#xff0c;所以需要判断一下扫描的设备是否为手机&#xff0c;然后由于业务逻辑还需要判断一下手机是Android、iOS还是iPad。一般前端…

文件操作<C语言>

导言 平时我们在写程序时&#xff0c;在运行时申请内存空间&#xff0c;运行完时内存空间被收回&#xff0c;如果想要持久化的保存&#xff0c;我们就可以使用文件&#xff0c;所以下文将要介绍一些在程序中完成一些文件操作。 目录 导言 文件流 文件指针 文件的打开与关闭 …

Python 深入学习局部函数和闭包函数

目录 局部函数与闭包函数的关联 变量捕获与状态保留 应用场景的交集与差异 闭包的本质 局部函数示例 闭包函数示例 局部函数和闭包函数之间存在着密切的联系&#xff0c;同时也有一些本质的区别。 局部函数与闭包函数的关联 局部函数&#xff08;Nested Function&#…

【机器学习 复习】第9章 降维算法——PCA降维

一、概念 1.PCA &#xff08;1&#xff09;主成分分析&#xff08;Principal ComponentAnalysis&#xff0c;PCA&#xff09;一种经典的线性降维分析算法。 &#xff08;2&#xff09;原理&#xff0c;这里以二维转一维为例&#xff0c;原来的平面变成了一条直线 这是三维变二…

Java | Leetcode Java题解之第179题最大数

题目&#xff1a; 题解&#xff1a; class Solution {public String largestNumber(int[] nums) {int n nums.length;// 转换成包装类型&#xff0c;以便传入 Comparator 对象&#xff08;此处为 lambda 表达式&#xff09;Integer[] numsArr new Integer[n];for (int i 0;…

Windows 11 安装hp 1020 plus 打印机驱动 (Ubuntu 20.04.3 LTS 部署cups局域网共享打印服务器)

1 win11 下载HP laserjet 1020 plus驱动,可以官网下载哦 链接下载 2 手动添加hp laserjet 1020驱动: 控制面板-->查看设备和打印机-->打印机和扫描仪-->添加设备-->我需要的打印机不在列表中-->通过手动添加-->按名称选择共享打印机 如果找不到&#xff0…

【ajax基础04】form-serialize插件

目录 一&#xff1a;form-serialize插件 作用&#xff1a; 语法格式&#xff1a; 一&#xff1a;form-serialize插件 作用&#xff1a; 快速且大量的收集表单元素的值 例如上图对于多表单元素的情形&#xff0c;单靠通过”选择器获取节点.value”值的形式&#xff0c;获取…

Excel做简单的趋势预测

这种方法不能代替机器学习&#xff0c;时序分析等&#xff0c;只是为后面的时序预测提供一个经验认识。 step1 选中序号列&#xff08;或时间列&#xff09;与预测列如图1所示&#xff1a; 图1 step2 工具栏点击“数据”&#xff0c;然后再“数据”下点击“预测模型”&#x…

apache activeMq

https://blog.csdn.net/qq_29651203/article/details/108487924 游览器输入地址: http://127.0.0.1:8161/admin/ 访问activemq管理台 账号和密码默认为: admin/admin# yml配置的密码也是如下的密码 activemq:url: failover:(tcp://localhost:61616)username: adminpassword: ad…

水果销售系统

摘 要 随着电子商务的快速发展&#xff0c;传统的实体销售模式面临着越来越多的挑战。在这个数字化的时代&#xff0c;消费者的购物习惯发生了翻天覆地的变化&#xff0c;消费者更倾向于在家中通过网络平台浏览并购买商品&#xff0c;这无疑给传统水果销售带来了极大的挑战。为…

高通安卓12-固件升级

下载步骤 第一步 格式化 「下载一次即可&#xff1b;能开机能下载的板子 忽略这一步&#xff0c;直接执行第二步即可」 QFIL工具配置为UFS类型&#xff0c;勾选Provision&#xff0c;如下图&#xff1a; Programmer选择prog_firehose_ddr.elf&#xff0c;Provision Xml选择prov…