高速缓存存储器(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行的表示: 

 

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

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

相关文章

Geopandas函数大全

GeoSeries函数和方法解析 GeoSeries.plot(self, *args, **kwargs) 几何图形空间可视化GeoSeries.area 返回几何图形的面积GeoSeries.bounds 返回几何图形x、y的最大最小值GeoSeries.length 返回几何图形的长度GeoSeries.geom_type 返回几何类型GeoSeries.distance(self, other…

嵌入式系统固件升级方案设计

文章目录 0. 概要1. 存储布局2. 升级文件格式配置文件格式 3. UML图组件图状态图活动图 4. C代码示例异常处理模块化代码示例实用工具函数 5. 其它故障处理方案性能优化安全性分析版本控制策略 6. 总结 0. 概要 在嵌入式系统中,固件升级是一个至关重要的功能。为了…

小白指南:前端使用javascript如何判断集合是不是空集合?

背景 最近在开发一个Web应用时,我遇到了一个关于集合处理的问题。具体来说,我需要判断一个集合是否为空。集合可以是数组、对象、Map或Set等不同的数据结构。就简单的整理了一下如何在JavaScript中有效地判断一个集合是否为空呢? 解决方案 …

鸿枫网盘,文件夹面包屑跳转实现功能

新增功能&#xff0c;磁盘格式化&#xff0c;层级面包屑跳转&#xff0c;视频预览优化 主要记录一下面包屑的实现思路 2.1 面包屑渲染 <el-breadcrumb separator-class"el-icon-arrow-right"> <el-breadcrumb-item> <el-link :under…

Pytorch(5)-----梯度计算

一、问题 如何使用Pytorch计算样本张量的基本梯度呢&#xff1f;考虑一个样本数据集&#xff0c;且有两个展示变量&#xff0c;在给定初始权重的基础上&#xff0c;如何在每次迭代中计算梯度呢&#xff1f; 二、如何运行 假设有x_data 和 y_data 列表&#xff0c;计算两个列表需…

树莓派4B设置AP热点步骤

树莓派4B设置AP热点步骤&#xff1a;先进入root模式 预先进行apt-get update 第1步&#xff1a;安装network-manager ​sudo apt-get install network-manager第2步&#xff1a;安装git apt-get install git apt-get install util-linux procps hostapd iproute2 iw haveged …

Chrome插件: Octotree让你GitHub代码浏览速度飙升

在GitHub上浏览和管理项目代码时&#xff0c;您是否曾为复杂的目录结构感到困惑&#xff1f;如果有一种工具能够让您轻松浏览项目的文件和目录&#xff0c;会不会大大提升您的工作效率&#xff1f;这正是Octotree浏览器插件所能做到的。 不过说实话&#xff0c;GitHub自带的代码…

HMI 的 UI 风格,超凡脱俗

HMI 的 UI 风格&#xff0c;超凡脱俗

代码随想录算法训练营day62 | 42. 接雨水、84.柱状图中最大的矩形

42. 接雨水 暴力解法 遍历每根柱子(第一个和最后一个不需要遍历&#xff0c;因为不可能存住水)&#xff0c;找到当前柱子的左边最高柱子lHeight&#xff0c;右边最高柱子rHeight&#xff0c;当前柱子能存的水为min(min(lHeight, rHeight) - 当前柱子的高度, 0) class Soluti…

mediasoup专栏介绍

mediasoup专栏介绍 mediasoup基础概览网络编程-libuv介绍mediasoup源码分析-v2和v3版本差异mediasoup日志模块mediasoup源码分析(一)编译及部署mediasoup源码分析(二)--worker启动golang实现mediasoup的tcp服务及channel通道mediasoup源码分析(三)channel创建及信令交互mediaso…

ARM功耗管理软件之WFIWFE

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理软件栈及示例&#xff1f;WFI&WFE&#xff1f;时钟&电源树&#xff1f;DVFS&AVS&#xff1f; ARM功耗管理精讲与实战汇总参见&#xff1a;Arm功耗管理精讲与实战

java中Object和json相互转换的方式

1.org中jackson转换json,springboot中内置jackson ObjectMapper onew ObjectMapper(); List<>listnew ArrayList(); String jonso.writeAsValueString(list); 2.alibaba中fastjson转换成json GetMapping("/test")public TbUser testHttpClient(){String url…

Day11 —— 大数据技术之Spark

Spark快速入门系列 Spark的概述什么是Spark&#xff1f;Spark的主要特点Spark的主要组件 Spark安装Spark三种运行模式Spark Standalone架构Spark Standalone的两种提交方式Spark On YARN架构 RDD算子转化算子行动算子 Spark RDDRDD的创建从对象集合创建RDD从外部存储创建RDD Sp…

[C/C++][VsCode]使用VsCode在Linux上开发和Vscode在线调试

目录 0. 前言1. win10上搭建环境Linux环境2.编写makefile3.怎么在线调试结语 0. 前言 在开发中&#xff0c;可以一边开发一边调试&#xff0c;这样可以大大的减少bug&#xff1b;但是正常来说一个大点的项目&#xff0c;是不太可能单步调试的&#xff0c;因为一般都是用make或…

java打印金字塔paremid和空心金字塔

java打印金字塔 首先确定每行打印几个空格&#xff0c;在确定每行打印几个* 设总层数为layers&#xff0c;当前层数为i。 则每行打印空格数layers-i&#xff0c;每行打印星号数2*i-1 import java.util.Scanner;public class Paremid{public static void main(String[] args) …

基于Pico和MicroPython点亮ws2812彩色灯带

基于Pico和MicroPython点亮ws2812彩色灯带 文章目录 基于Pico和MicroPython点亮ws2812彩色灯带IntroductionPracticeConclusion Introduction 点亮发光的LED灯是简单有趣的实验&#xff0c;点亮多个ws2812小灯串联起来的灯带&#xff0c;可对多个彩色小灯进行编程&#xff0c;…

夏季城市内涝防治:视频汇聚系统智能AI技术助力城市自然灾害应急管理

据新闻报道&#xff0c;6月19日至20日&#xff0c;受强降雨影响&#xff0c;广西桂林城区及周边等地出现今年入汛以来持续时间最长、累计降水量最大、影响范围最广、致灾风险最高的暴雨天气过程&#xff0c;导致桂林市区多处发生洪水内涝&#xff0c;房屋被淹、道路受阻、人员被…

ES全文检索支持繁简和IK分词检索

ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…

【pytorch04】创建Tensor

numpy中的数据创建tensor 数据已经在numpy中了&#xff0c;将numpy中的数据转到tensor中来&#xff0c;因为我们将使用tensor在GPU上进行加速运算 从NUMPY导入的FLOAT其实是DOUBLE类型 list中的数据创建tensor FloatTensor()和大写的Tensor()接收的是shape&#xff08;即数据的…

Python-算法编程100例-前缀和双指针(入门级)-最长的指定瑕疵度的元音子串

题目描述&#xff1a; 元音字符为“aeiouAEIOU” 给定一个字符串&#xff0c;求字符串中满足指定瑕疵度的最长元音子串的长度。元音子串为字符串中开头和结尾都是元音字符的字符串&#xff0c;瑕疵度为子串中非元音字符的个数。 题目分析&#xff1a; 1、直接使用双指针&am…