一、高速缓存存储器组织结构

假设一个计算机系统每个存储器地址有m位,形成M=2^m个不同的地址。这样一个机器的高速缓存被组织成一个有S=2^s个高速缓存组(cache set)。每个高速缓存组包含E个高速缓存行(cache line)。每个高速缓存行由一个B=2^b字节的高速缓存块(block)、一个有效位(valid bit:指明这个行是否包含有意义的信息),还有t=m-(b+s)个标记位(唯一的标识存储在这个高速缓存行中的高速缓存块)。

当一条加载指令指示CPU从主存地址A中读取一个字时,它将地址A发送到高速缓存。如果高速缓存正保存着地址A处字的副本,它立即将这个字发回给CPU。高速缓存的结构能够通过简单地检查地址位,找到所请求的字:

存储器地址如下所示:

地址A中s个组索引位是一个到S个高速缓存组的索引。组索引位被解释为一个无符号整数,它告诉我们这个字必须存储在哪个告诉缓存组中。地址A中的t个标记位告诉我们高速缓存组中的哪一个高速缓存行包含这个字。当且仅当设置了有效位并且该行的标记位与地址A中的标记位相匹配时,组中的这个高速缓存行才包含这个字。地址A中的b个偏移位给出了字在B个字节的缓存块中的字偏移。

二、直接映射高速缓存

根据每个高速缓存组中高速缓存行E的行数,高速缓存被分为不同的类。每个高速缓存组只有一行(E=1)高速缓存行的高速缓存被称为直接映射高速缓存(direct-mapped cache)。

高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,分为三步:1、组选择;2、行匹配;3、字抽取。

2.1 直接映射高速缓存中组选择

高速缓存从m个地址位中间抽取出s个组索引位。

2.2 直接映射高速缓存中行匹配

当且仅当高速缓存行设置了有效位,并且高速缓存行中的标记与地址中的标记相匹配时,这一高速缓存行包含这个字的一个副本。

2.3 直接映射高速缓存中的字选择

块偏移提供了所需要的字的第一个字节的偏移。本例中块偏移为100(二进制),它表明字的副本是从块中的字节4开始的(我们假设字长为4字节)。

2.4 运行中的直接映射高速缓存

假设我们有一个直接映射高速缓存,描述如下:(S,E,B,m)=(4,1,2,4)。即:高速缓存有4个高速缓存组,每个高速缓存组含有一行高速缓存行,每个高速缓存块有2个字节,存储器地址为4位。我们假设每个字都是单字节的。

我们模拟CPU执行一系列读的时候,高速缓存的执行情况,我们假设CPU读1字节的字。初始时,高速缓存是空的(即每个有效位都是0);

表中的每一行都代表一个高速缓存行。第一列表明该列所属的组,但是请记住提供这个位只是为了方便,实际上它并不是高速缓存的一部分。后面四列代表高速缓存行的实际位。

1、读地址0(0000)的字。因为组0的有效位是0,是缓存不命中。高速缓存从内存(或低一级的高速缓存)取出块0,并把这个块存储在组0中。然后,高速缓存返回新取出的高速缓存行的块[0]的m[0](内存位置0的内容)。

2、读地址1(0001)的字。这次会是高速缓存命中。高速缓存立即从高速缓存行的块[1]中返回m[1]。高速缓存的状态没有变化。

3、读地址13(1100)的字。由于组2中的高速缓存行不是有效的,所以缓存不命中。高速缓存把块6加载到组2中,然后从新的高速缓存行的块[1]中返回m[13]。

4、读地址8(1000)的字。这会发生缓存不命中。组0中的高速缓存行确实是有效的,但是标记不匹配。高速缓存将块4加载到组0中(替换读地址0时读入的高速缓存行),然后从新的高速缓存行的块[0]中返回m[8]。

5、读地址0(0000)的字。又会发生缓存不命中,因为前面引用地址8时,我们刚好替换了块0。这就是冲突不命中的例子。也就是我们有足够的高速缓存空间,但是却交替的引用映射到同一组的块。

三、组相联高速缓存

直接映射高速缓存中冲突不命中造成的问题源于每个组只有一行(E=1)这个限制。组相连高速缓存放松了这条限制,一个1<E<C/B的高速缓存成为E路组相连高速缓存。下图为2路组相联高速缓存的结构。

1、组相联高速缓存中组的选择

组索引位标识组

2、组相联高速缓存中行匹配和字选择

组中的任何一行都可以包含任何映射到这个组的内存块。所以高速缓存必须搜索组中的每一行,寻找一个有效行,其标记与地址中的标记相匹配。如果高速缓存找到了这样一行,那么我们就命中,块偏移从这个块中选择一个字。

3、组相联高速缓存中不命中时行替换

最简单的替换策略是随机选择替换。其他更复杂的策略利用了局部性原理,以使在比较近的将来引用被替换的行的概率最小。例如,最不长使用(LFU)策略会替换在过去某个时间窗口内引用次数最少的那一行。最近最少使用(LRU)策略会替换最后一次访问时间最久远的哪一行。

四、全相联高速缓存

全相联高速缓存是由一个包含所有高速缓存行的组(E=C/B)组成的。

1、全相联高速缓存中的组选择

全相联高速缓存中的组选择非常简单,因为只有一个组。地址中没有组索引,地址只被划分为一个标记和一个块偏移。

2、全相联高速缓存中的行匹配和字选择

全相联高速缓存中的行匹配与字选择与组相联高速缓存中的是一样的,它们的区别主要是规模大小的问题。

因为高速缓存电路必须并行地搜索许多相匹配的标记,构造一个又大又快的相联高速缓存很困难,而且价格昂贵。

五、高速缓存读与写

1、高速缓存读

首先,在高速缓存中查找所需字w的副本。如果命中,立即返回字w给CPU。如果不命中,从存储器层次结构中较低层中取出包含字w的块,将这个块存储到某个高速缓存行中,然后返回字w。

2、高速缓存写

写命中

直写(write-through),写一个已经缓存了的字w(写命中,write hit),立即将w的高速缓存块写回到紧接着的低一层中。

写回(write-back),尽可能的推迟更新,只有当替换算法要驱逐这个更新过的块时,才把写到紧接着的低一层中。高速缓存必须为每一个高速缓存行维护一个额外的修改位(dirty bit),表明这个高速缓存块是否被修改过。

写不命中

写分配(write-allocate),加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块。

非写分配(not-write-allocate),避开高速缓存,直接把这个字写到低一层中。

六、Intel Core i7处理器的高速缓存层次结构

只保存指令的高速缓存称为i-cahce,只保存程序数据的高速缓存称为d-cache。即保存指令又保存数据的高速缓存称为统一高速缓存。

Intel Core i7 处理器每个CPU芯片有四个核。每个核有自己私有的L1 i-cache、L1 d-cache和L2统一的高速缓存。所有的核共享片上的L3统一的高速缓存。


参考:

《深入理解计算机系统》是2016年机械工业出版社的图书,作者是(美)布赖恩特(Bryant,R.E.)。

《Computer Systems A Programmer's perspective》:CSAPP。

一个具有20位地址和32位字长的存储器_存储器层次结构(三):高速缓存相关推荐

  1. 一个具有20位地址和32位字长的存储器_step7编程之地址概念详解

    完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等).其中的操作数是指令要执行的目标,也就是指令要进行操作的地址. 我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区 ...

  2. 一个具有20位地址和32位字长的存储器_详解西门子间接寻址之存储器间接寻址...

    [地址的概念] 完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如 NOT 等).其中的操作数是指令要执行的目标,也就是指令要进行操作的地址. 我们知道,在 PLC 中划有各种用途的存 ...

  3. 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数

    给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数.            1.在文件中至少存在这样一个数?            2.如果有足够的内存,如何处理? ...

  4. 64位windows与32位windows的区别

    64位windows与32位windows的区别 2010-07-19 15:46 64位windows与32位windows的区别 http://www.zeroplace.cn/article.a ...

  5. 计算机组成原理---32位的CPU64位CPU与32位os64os的区别与联系

    基本概念 32位的CPU与64位CPU 以下内容摘自维基百科: 64 位 CPU 是指 CPU 内部的通用寄存器的宽度为 64 比特,支持整数的 64 比特宽度的算术与逻辑运算.那么 32 位 CPU ...

  6. 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考

    最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...

  7. linux 进程映射空间 libc,为什么不能在64位内核的32位Linux进程中映射(MAP_FIXED)最高虚拟页面?...

    尝试测试时是否允许访问跨越x86中零边界的内存?在Linux的用户空间中,我编写了一个32位测试程序,该程序试图映射32位虚拟地址空间的低和高页. 之后echo 0 | sudo tee /proc/ ...

  8. 8位十六进制转换32位十六进制_网络中的数制系统--二进制十六进制与十进制之间的相互转换...

    网络中计算机的32位IPv4地址以二进制显示,也会以点分十进制显示.而IPv6的地址是128位,是由数字和A-F组成的十六进制系统.因此,了解并且学会在其三者之间相互转换是非常重要的,让我们能够更好的 ...

  9. 64位进程调用32位DLL详解

    64位进程调用32位DLL------探索 相关资料: 微软公司的官方网站针对这个问题描述如下: 在64位的windows系统中,一个64位进程不能加载一个32位dll,同理一个32位进程也不能加载一 ...

最新文章

  1. C语言中(字符串)输入scanf()、gets()、fgets()以及getchar()、getc()函数的联系与区别
  2. QIIME 2用户文档. 4人体各部位微生物组分析实战Moving Pictures(2018.11)
  3. /etc/passwd文件小析
  4. ubuntu18.04下安装grafana6和简单使用
  5. linux vim打开乱码,linux下解决vim打开文件乱码现象
  6. 2020-2021年NLP有什么核心技术的更迭吗?或者有什么推动领域发展的paper吗?
  7. 运维是否有前(钱)途?
  8. pl/sql 存储过程实例
  9. 将mysql数据库批量导出为word三线表格形式
  10. java正则匹配_Java正则表达式详解
  11. 1、前端背景图自适应
  12. TapTap Android电话面经
  13. LATEX参考文献添加文章doi号并嵌入超链接+IEEE期刊缩写查询
  14. HTML5期末大作业:基于HTML+CSS+JavaScript仿蘑菇街购物商城设计毕业论文源码
  15. jsp中打开新的html网页,jsp中用window.open()打开新页面的相关设置
  16. docke 安装rap_RAP2:使用docker镜像进行构建,启动部署
  17. php 足迹,php实现网站浏览足迹功能
  18. 收藏几个百度网盘搜索资源引擎
  19. 台式电脑键盘错乱会出现计算机模式怎么办,​键盘按键错乱能修吗?台式电脑键盘按键错乱怎么修复?...
  20. 31.4k,这是我见过最强横的后台管理系统 !!

热门文章

  1. vs2010文件加载使用简体中文(GB2312)问题解决方案
  2. 【自动驾驶】25.激光雷达 标定 相机
  3. 《漫画算法》源码整理-5 排序算法
  4. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析
  5. 面向组合子程序设计方法 之 新约
  6. TeXworks使用教程指南
  7. Python入门笔记(17):错误、异常
  8. MIT自然语言处理第五讲:最大熵和对数线性模型
  9. 8个实用而有趣Bash命令提示行
  10. 你真的理解JS的继承了吗?