第六章 存储器层次结构 第四节 高速缓存存储器
最早的计算机存储器层次结构只有三层:CPU寄存器、DRAM主存储器和磁盘存储。由于CPU和主存之间的速度差距过大,设计者们在这两者之间加入了一个SRAM高速缓存存储器,也就是L1高速缓存。后面又加入了L2、L3高速缓存,本节就是用来研究高速缓存存储器的。
1、通用的高速缓存存储器组织结构
高速缓存被组织成如下的情形:
- 整个高速缓存被分成了若干个组
- 每个组包含若干个高速缓存行
- 每个行包含一个一定数量字节的数据块,以及一个有效位和t个标记位
细节我们后面再说
当CPU要从主存中独取一个字的时候,它将地址A发送至高速缓存。高速缓存需要判断自己是否存储着这个地址的那个字的副本。如何找到一个副本取决于高速缓存是如何存储的。下面介绍高速缓存如何具体存储一个内容。
前面所说的地址A被拆分成三个部分。
- 中间的s位做了组索引,也就是可以通过这s位知道该地址的字所在的组
- 前面的t位作为标记,用来寻找组内哪个行包含该地址的字。只有当行设置了有效位,并且标记匹配的行,才是真正存储字的位置
- 后面的b位代表块偏移,也就是从该行中从第b个字节开始取一个字,就是你想要的内容
上面是相关的参数描述
2、直接映射高速缓存
根据每个组的高速缓存行数E, 高速缓存被分为不同的类。每个组只有一行(E = 1)的高速缓存称为直接映射高速缓存。
1.例子
这里书中举了一个例子我们直接搬过来看:
假设我们有一个直接映射高速缓存, 描述如下(S,E,B,m) = (4,1 ,2,4)。也就是高速缓存有四个组,每个组一行,每行的高速缓存块有两个字节, 地址是4位的,每个字都是单字节的。
第一列表明该行所属的组,但是请记住提供这个位只是为了方便,实际上它并不真是高速缓存的一部分。后面四列代表每个高速缓存行的实际的位。
2.冲突不命中
就是上面例子中读取地址0和地址8的时候发生的情况。术语抖动描述的是这样一种情况, 即高速缓存反复地加载和驱逐相同的高速缓存块的组。
简要来说就是, 即使程序有良好的空间局部性, 而且我们的高速缓存中也有足够的空间,来存放抖动中的块,但每次引用还是会导致冲突不命中, 这是因为这些块被映射到了同一个高速缓存组。
3.为什么用中间的位做索引
如果高位用做索引,那么一些连续的内存块就会映射到相同的高速缓存块。
如果一个程序有良好的空间局部性,顺序扫描一个数组的元素,那么在任何时刻,高速缓存都只保存着一个块大小的数组内容。
3、组相联高速缓存
可以看到,直接映射高速缓存很容易出现冲突不命中的情况,因为每个组只有一行。组相联高速缓存(set associative cache)放松了这条限制,所以每个组都保存有多于一个的高速缓存行。一个1<E<C/B的高速缓存通常称为E路组相联高速缓存。
1.组相联高速缓存中的组选择
2.组相联高速缓存中的行匹配和字选择
传统的内存是一个值的数组, 以地址作为输入, 并返回存储在那个地址的值。另一方面, 相联存储器是一个(key, value)对的数组, 以key为输入, 返回与输入的key相匹配的(key, value)对中的value值。因此,我们可以把组相联高速缓存中的每个组都看成一个小的相联存储器, key是标记和有效位, 而value就是块的内容。
组相联高速缓存必须搜索组中的每一行,寻找一个有效的行, 其标记与地址中的标记相匹配。如果高速缓存找到了这样一行, 那么我们就命中, 块偏移从这个块中选择一个字, 和前面一样。
3. 组相联高速缓存中不命中时的行替换
如果组内有空的行就放空的行,否则有各种策略:例如, 最不常使用(Least-Frequently-Used,
LFU)策略会替换在过去某个时间窗口内引用次数最少的那一行。最近最少使用(LeastRecently-Used, LRU)策略会替换最后一次访问时间最久远的那一行。
4、全相联高速缓存
全相联高速缓存是由一个包含所有高速缓存行的组组成的。
1. 全相联高速缓存中的组选择
全相联高速缓存中的组选择非常简单,因为只有一个组,如图。注意地址中没有组索引位,地址只被划分成了一个标记和一个块偏移。
2. 全相联高速缓存中的行匹配和字选择
全相联高速缓存中的行匹配和字选择与组相联高速缓存中的是一样的,如图6-37所示。它们之间的区别主要是规模大小的问题。
因为高速缓存电路必须并行地搜索许多相匹配的标记,构造一个又大又快的相联高速缓存很困难,而且很昂贵。因此,全相联高速缓存只适合做小的高速缓存,例如虚拟内存系统中的翻译备用缓冲器(TLB),它缓存页表项 。
5、有关写的问题
写的情况就要复杂一些了。
1.写命中
假设我们要写一个已经缓存了的字w(写命中, write hit)。在高速缓存更新了它的w的副本之后, 怎么更新w在层次结构中紧接着低一层中的副本呢?
1.直写
就是立即将w的高速缓存块写回到紧接着的低一层中。虽然简单, 但是直写的缺点是每次写都会引起总线流量。
2.写回
尽可能地推迟更新, 只有当替换算法要驱逐这个更新过的块时, 才把它写到紧接着的低一层中。由于局部性, 写回能显著地减少总线流扯, 但是它的缺点是增加了复杂性。高速缓存必须为每个高速缓存行维护一个额外的修改位(dirty bit), 表明这个高速缓存块是否被修改过。
2. 写不命中
1.写分配
加载相应的低一层中的块到高速缓存中, 然后更新这个高速缓存块。写分配试图利用写的空间局部性,但是缺点是每次不命中都会导致一个块从低一层传送到高速缓存。写回高速缓存通常是写分配的。
2.非写分配
非写分配(not-write-allocate), 避开高速缓存, 直接把这个字写到低一层中。直写高速缓存通常是非写分配的。
6、一个真实的高速缓存层次结构解剖
高速缓存既保存数据, 也保存指令。只保存指令的高速缓存称为i-cache。只保存程序数据的高速缓存称为d-cache。既保存指令又包括数据的高速缓存称为统一的高速缓存(unified cache)
这个层次结构的一个有趣的特性是所有的SRAM高速缓存存储器都在CPU芯片上。
7、高速缓存参数的性能影响
第六章 存储器层次结构 第四节 高速缓存存储器相关推荐
- 深入理解操作系统(16)第六章:存储器层次结构(2)高速缓存存储器+对程序性能的影响(包括:L1/L2高速缓存历史/缓存写:直写和写回/暂无L4级缓存/缓存命中率/存储器山/高速缓存友好的代码/)
深入理解操作系统(16)第六章:存储器层次结构(2)高速缓存存储器+对程序性能的影响(包括:L1/L2高速缓存历史/缓存写:直写和写回/暂无L4级缓存/缓存命中率/存储器山/高速缓存友好的代码/) 1 ...
- 【重识云原生】第六章容器6.3.5节——Controller Manager概述
<重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...
- 【重识云原生】第六章容器6.1.8节——Docker核心技术UnionFS
<重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...
- 【重识云原生】第六章容器6.3.7节——命令行工具kubectl
<重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...
- Web前端开发笔记——第三章 CSS语言 第四节 CSS列表、表格样式
目录 一.CSS列表样式 (一)设计列表项前标志类型 (二)设计列表项前标志位置 (三)设计列表项图片 (四)设计整体列表属性 二.CSS表格样式 (一)设计表格大小 (二)设计表格边框 (三)奇偶选 ...
- (数据库系统概论|王珊)第六章关系数据理论-第一节:为什么要研究关系数据理论
文章目录 一:概念回顾:关系模式 二:数据依赖 三:一个例子:不遵循关系数据理论导致的问题 一句话,研究关系数据库理论就是为了设计出合适的关系模式,也即合适.高效的表 一:概念回顾:关系模式 相关文章 ...
- (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第四节:数据查询
文章目录 ★★★★★SELECT语句格式★★★★★ 一:单表查询(查询时只涉及一张表) (1)选择表中的若干列 A:查询指定列 B:查询全部列 C:查询经过计算的值 ①:算数表达式 ②:字符串常量及函 ...
- c语言两点间距离_数字图像处理|P5第二章 数字图像基础第四节像素间的基本关系...
第四节 像素间的基本关系 图像由像素组成,像素在图像空间上按规律排列,相互之间有一定的联系. 一.像素的邻域与邻接 1.邻域 在一定意义下,与某一像素相邻的像素的集合. 反映像素间的空间关系. ...
- Web前端开发笔记——第二章 HTML语言 第四节 超链接标签
目录 前言 一.超链接标签 (一)链接其它子网页 (二)链接其它站点 (三)虚拟超链接 二.从当前页面链接到指定位置 三.链接的访问情况 四.在新窗口中打开链接 例题 结语 前言 本节介绍超链接标签即 ...
最新文章
- ui设计怎样做出有效果的视觉层级?
- 漫画:最长公共子序列
- Java中时间戳和Date类型以及字符串日期的相互转换
- LoadRunner SQL 2008
- 分区表自动维护 mysql_Oracle 10g分区表的自动维护
- 【c++】4.std::shared_ptr、std::make_shared、 .get() 、.data()、void *p 的用法、裸指针
- Caffe代码导读(2):LMDB简介
- 在vs2012下编译出现Msvcp120d.dll 丢失的问题
- 写给大数据开发初学者的话 | 附教程
- php 判断不是文件类型,php 判断文件类型
- 微软IIS6漏洞:服务器敏感信息易被窃
- python selenium自动化框架_一文讲透!实现一个Python+Selenium的自动化测试框架如此简单!...
- vue项目element-ui中el-select回车键隐藏下拉框,实现按回车键查询
- dwz jui 修改html元素,js框架 dwz jui 的日历组件 添加自定义事件
- [ubuntu14.04]linux 开发装机必备
- [Nodejs]基于Nodejs构建属于自己的微信公众号
- sqlserver查看历史死锁信息
- Win10系统彻底关闭自动更新方法——亲测有效
- 现在seo还好做吗(SEO越来越好做了吗)
- 电路基础_模拟电路_问答_2023
热门文章
- 自闭症是什么吗?新手家长必读
- jieba.analyse的使用:提取关键字/词频制作词云
- 如何利用空余时间,慢慢提升
- MATLAB/Simulink永磁直驱风力发电系统仿真模型 本模型针对定桨距角的永磁直驱风机系统,包含风力机传动部分,整流器控制部分,逆变器控制部分,mppt(爬山搜索法)四大部分
- provider android简书,Android 7.0 provider属性说明
- IIS下利用ISAPI_Rewrite防图片盗链
- 顾家家居荣获“工业产品绿色设计示范企业”
- 对于首页等每天有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪。那如何解决呢?
- 【快速上手系列】五分钟即可学会的easyUI的简单使用教程
- codeforces D. Boboniu Chats with Du