计算机体系结构实验三-缓存一致性

news2024/12/28 4:50:06

最近在看CMU15-418,LECTURE10-11就是讲两个缓存一致性协议,刚好这部分内容在实验中学习过,在实验中监听式协议提到的是MSI协议(modified,shared,invalid),lecture中还讲了优化的版本MESI(应该是实际使用的协议),在MSI协议中,modified也被称为exclusive,因此在实验中我都写成独占态了,MESI协议则明确区分了独占态和修改状态。

一.实验目的

​ 熟悉cache一致性模拟器(监听法和目录法)的使用,并且理解监听法和目录法的基本思想,加深对多cache一致性的理解。

​ 做到给出指定的读写序列,可以模拟出读写过程中发生的替换、换出等操作,同时模拟出cache块的无效、共享和独占态的相互切换。

二.实验内容

1.缓存一致性问题

​ 多核处理器可能既有共享级别的缓存,又有专用级别的缓存。多个处理器如果共享存储器上的数据,就可能在自己专有的缓存上缓存共享数据,不同的处理器在自己的缓存中可能存有同一数据的不同值,这就是缓存一致性问题。

​ 如果存储器系统满足以下条件,则说它是一致的:

  • 处理器P读取X,此前P写入X,如果读写之间没有其他处理器对X操作,此读取操作总是返回P写入的值
  • 处理器P写入X,另一个处理器读取该位置,如果两个操作间隔够长,并且中间没有其他处理器写入X,则该读取操作返回写入值
  • 对同一位置执行的写入操作被串行化。任意两个处理器对同一位置写入的顺序,对于所有处理器来说看到的顺序都是相同的

​ 为多个处理器保持缓存一致性的协议被称为缓存一致性协议,协议的关键在于跟踪数据块的共享状态,目前使用的协议有两种:

  • 目录式:将物理存储器块的共享状态保存在一个称为目录的位置
  • 监听式:如果一个缓存有一个物理存储器块的副本,则跟踪该块的共享状态。所有缓存都可以通过某种广播介质访问,所有缓存控制器都监听这一介质。
监听一致性协议

​ 实现监听一致性协议有两种方法,一种是写入失效协议,处理器执行写入操作时使其他副本失效;另一种是写入更新协议,处理器执行写入时更新所有缓存副本,这种方法要占用相当多的带宽(写入操作要广播到共享缓存线),因此不常用,多处理器都选择实现写入失效协议

​ 监听一致性协议通常是通过有限状态控制器实施的,控制器可以改变所选缓存块的状态,并使用总线访问数据或使其失效。可以看作每一个块有一个关联的独立控制器。

​ 在协议中,规定每个CPU的每个块有三种状态:

  • 无效:所有缓存中都没有此块的有效副本
  • 已修改(独占):该块仅在该CPU缓存中有副本,并且被修改过
  • 共享:该块在一个或多个缓存中有副本且未修改过

​ 每个CPU都独立控制每个块的状态,通过监听总线转换块的状态,并进行读写操作。

​ 假设一个CPUA中产生了一个对一个缓存块的读写请求,根据读写是否命中,CPU会有不同的处理方式,并改变该块的状态。已修改状态直接称为独占。

  • 读命中:状态不需要发生改变。无效态不会产生读命中,而独占和共享态,读自己缓存中的块不会引起一致性的问题。
  • 读不命中:发生读不命中,则CPUA要从主存读取该块,但是主存中的块不一定是最新的,所以CPU还会向总线发送一个读不命中信号和当前块的地址,其他CPU的控制器监听到该信号,如果都没有这个块或者有共享态的该块,说明主存中是最新的,那么从主存中读取到该块,并将其设置为共享态;如果一个CPUB发现自己有独占的该块,则终止CPUA读取主存,因为自己的数据是最新的,CPUB将提供给A这个块,并将其写回内存,此时A和B都有块的最新版本,且主存中的也是最新版本,A和B中该块的状态设置为共享态。(注意,CPUB是独占该块的,A和B以外的CPU一定是没有这个块的,所以也不需要改变状态。)
  • 写命中:如果该块在CPUA上是共享态,那么要修改为独占态,且向总线发出写入失效信号,其他CPU中的该块都将无效;如果该块在CPUA是独占态,那么状态不变。
  • 写不命中:将该块设置为独占态,并向总线发出写入失效信号,使其他CPU的该块无效,如果其他CPU独占该块,则要写回内存(这保证了写入操作的串行化)。

​ 通过以上的分析,CPU改变一个块的信号的原因可能是读写事件,也可能是从总线监听到的其他CPU的读写事件。一个块在被写入后就会被修改为独占态,通过向总线发送信号使其他CPU的该块失效。在读取时,如果发生了不命中,则读不命中和地址被广播,独占块的CPU要给出该块,并将该块写回。这两个关键的工作保证了任何CPU总是能读取到最新的块,保证了一致性。

​ 最后,以上所有的操作都没有考虑缓存替换的问题,如果发生了缓存替换,被替换的块如果是独占态,则要写回主存,只有自己有被替换块的数据,不需要发出其他信号。

目录一致性协议

​ 总线式系统的带宽存在限制,采用分布式系统可以降低对存储器的带宽要求。在分布式系统中,采用分布式的存储器,多个节点可以同时读取或写入数据,提高了存储器的带宽,不受单一存储器总线的限制。分布式系统没有总线,通过网络互连,为了避免监听式一致性协议的广播,分布式存储器系统采用目录式协议替代监听式一致性协议。

​ 目录式一致性协议中,每个处理器都有一个目录,目录中保存了每个可缓存块的状态,信息包括哪些缓存拥有这个块的副本,是否需要更新等等。存储器的每一块都在目录中有对应的一项,每个目录项由访问状态和位向量组成,位向量记录了各个处理器是否有这个块的副本。在目录式一致性协议中,仍然使用三种状态,采用写失效策略。状态转换也和监听式是一样的,只是不再通过广播告知其他处理器一个块失效,而是根据位向量,通知相应的CPU该块失效或完成更新该块的工作。并且由块所在的存储器所属的CPU作为宿主与需要沟通的处理器沟通,完成写失效通知和写回的操作。

在这里插入图片描述

2.监听法模拟

​ 按照实验给出的操作序列,各个操作执行的状态如下表:

进行的访问是否发生替换是否发生写回监听协议进行的操作与块状态的改变事件
CPUA读块5CPUA的块5设置为共享态读不命中,发送读不命中信号,将块5从主存读入Cache A1
CPUB读块5CPUB的块5设置为共享态读不命中,发送读不命中信号,将块5从主存读入CacheB1
CPUC读块5CPUC的块5设置为共享态读不命中,发送读不命中信号,将块5从主存读入CacheC1
CPUB写块5CPUB的块5设置为独占态,发送写入失效信号,CPUA和CPUC的该块失效写命中,让其他CPU的块5失效
CPUD读块5CPUB中断CPUD访问主存,将块5写回并交给CPUD,CPUD和CPUB中的块5都转为共享态读不命中,发送读不命中信号,CPUB接收到该信号,发送给CPUD块5,CPUD将块5读入CacheD1
CPUB写块21CPUB的块21设置为独占态,块5失效写不命中,将块21写入CacheB1,替换块5,发送写失效信号
CPUA写块23CPUA的块23设置为独占态写不命中,将块23写入CacheA3,发送写失效信号
CPUC写块23CPUC的块23设置为独占态,发送写失效信号,CPUA的块失效写不命中,将块23写入CacheA3,发送写失效信号,CPUA将块写回主存
CPUB读块29CPUB的块23设置为共享态,块21失效读不命中,发送读不命中信号,将块29从主存读入CacheB1,替换掉块21
CPUB写块5CPUB的块5设置为独占态,发送写失效信号,CPUD的块5失效写不命中,发送写不命中信号,将块5写入CacheB1,替换掉块29,块29为独占,先将其写回。写入块5后发送写失效信号

​ 执行完以上操作后,Cache的状态为:

在这里插入图片描述

3.目录法模拟

访问操作监听协议进行的操作与块状态的改变
CPUA读块6读不命中,块6在A的存储器中,读取到缓存,共享态。在CPUA的目录进行记录。
CPUB读块6读不命中,块6在A的存储器中,读取到缓存,共享态,在CPUA的目录进行记录。
CPUD读块6读不命中,块6在A的存储器中,读取到缓存,共享态,在CPUA的目录进行记录。
CPUB写块6写命中,更新CPUA的目录的块6为CPUB独占,CPUA告知处理器A,D该块失效。
CPUC读块6读不命中,访问目录得知CPUB独占块6,CPUA从CPUB的缓存取回块6写回,将该块交给CPUC,并在目录中修改块6为CPUB和C共享。
CPUD写块20写不命中,块20在C的存储器上,读取到缓存并写入新块,更新CPUC的目录的块20为CPUD独占。
CPUA写块20写不命中,块20在C的存储器上,读取目录发现CPUD独占该块,CPUC先从CPUD取回块20写回,再设置为CPUA独占,新块写入CPUA的缓存。
CPUD写块6写不命中,块6在A的存储器上,读取目录发现B和C共享此块20,CPUA通知B和C该块写失效,设置为CPUD独占,新块写入CPUD的缓存。
CPUA读块12读不命中,将块20写回C的存储器并清除目录中对块20的独占态。读取B的存储器上的块12,并更新相应目录,以共享态拥有块12。

​ 执行完以上操作后,整个Cache系统的状态:

4.思考题

目录法和监听法分别是集中式和基于总线,两者优劣是什么?

​ 监听法基于总线,通过广播信号来实现写失效,优点是不需要额外的存储空间维护一致性信息,缺点是可扩展性差,处理器数量越多,总线通信的压力就越大。

​ 目录法采用集中式的目录维护一致性信息,增加了存储开销。一致性信息是集中式的存储在目录中,但目录结构本身是分布式的,因此具有可拓展性。目录法最大的优点是可以实现在分布式的系统中,不需要总线。

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

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

相关文章

pytorch 入门 (四)案例二:人脸表情识别-VGG16实现

实战教案二:人脸表情识别-VGG16实现 本文为🔗小白入门Pytorch内部限免文章 参考本文所写记录性文章,请在文章开头注明以下内容,复制粘贴即可 🍨 本文为🔗小白入门Pytorch中的学习记录博客🍦 参…

CSMM软件能力成熟度评估

CSMM认证,又称为“软件能力成熟度评估”,也有地方称为“CSMM软件能力成熟度模型评估国家标准认证”,也被民间喊作“中国版CMMI认证”。该标准于2021年6月8日发布,是我国自主标准,适合中国国情以及中国软件企业的特点。…

2023腾讯云服务器价格表(轻量/CVM/免费/GPU)

腾讯云服务器租用价格表,轻量应用服务器、云服务器CVM、免费云服务器申请和GPU云服务器配置报价,轻量2核2G4M价格108元一年、2核4G6M带宽159元一年、4核8G10M优惠价425元一年、8核16G14M优惠价1396元一年、16核32G20M价格2775.99元一年,云服务…

Cesium冷知识:API中显示私有方法

在Cesium.js源码中, 某些类或方法的注释中含有private这个“私有”标识 会导致不会在API文档中显示 (这是jsdoc的规范) 解决方法: Ceisum.js 1.110.0版本的解决方案: 在gulpfile.js中的buildDocs方法中&#xff0…

vscode Coder Runner 运行C++

1. 设置Code Runner 2. 防止输入读不到,把在终端运行勾上。 3. 设置minw/bin的环境变量 安装mingw教程:https://blog.csdn.net/fancy_male/article/details/133992000 4. 见图

ArGIS Engine专题(15)之GP模型在地图服务与地图服务之间实现叠置分析

前一篇文章已经介绍过导入要素范围与地图服务的叠加分析,相当于单要素与多要素之间的分析,这篇文章介绍地图服务与地图服务之间的叠加分析,即是多要素有多要素之间的相交分析,功能基本类似。 一、结果预览 二、需求简介 以下是一些常见的业务场景: (1)空间规划和土地…

淘宝商品详情API接口(H5端和APP端),淘宝详情页,商品属性接口,商品信息查询

一、接口参数说明:提取淘宝商品详情页各项数据,包含skuid、价格、收藏数、加购数、月销售量、主图、标题、详情页图片等页面上可以看奥的数据都可以拿到。 点击获取key和secret 二、使用场景 1、商品销售情况分析,根据销量调整活动方案&am…

【linux系统】如何在服务器上安装Anaconda

文章目录 1. 安装Anconda1.1. 下载Anaconda安装包1.2. 安装Anaconda1.2.1. 点击回车(Enter)1.2.2. 添加环境变量1.2.3. 激活环境变量 1.3. 检查是否安装成功 2. Anaconda安装pytorch2.1. 创建虚拟环境2.2. 激活(进入)虚拟环境2.3. 安装pytorch 1. 安装An…

51单片机实现换能器超声波测水深

一,超声波换能器定义: 定义1:可把电能、机械能或声能从一种形式转换为另一种形式的能的装置。 所属学科:测绘学下的测绘仪器。 定义2:能量转换的器件。在水声领域中常把声呐换能器、水声换能器、电声换能器统称换能器。…

电脑出现vcomp140.dll错误,五种解决办法分享

电脑出现由于找不到 vcomp140.dll 无法继续执行代码的问题,通常是因为系统缺失了 Microsoft Visual C 2015 Redistributable 导致的。为了解决这个问题,您可以尝试以下 5 个解决方案: 方案1:使用dll修复工具:下载vcomp…

【图灵诸葛】jvm笔记

2023年10月23日14:04:44 jvm 1.jdk体系结构图回顾(Av333129672,P1) jdk jre 底层是hotspot jvm 2.java虚拟机内部组成(Av333129672,P2) 堆 方法区 执行引擎 类加载 本地方法栈 线程栈(虚拟机栈) 3.java虚拟机栈讲解(Av333129672,P3) 程序计数器&#xf…

Python自动化测试框架之unittest使用详解!

这篇文章主要介绍了Python接口自动化浅析unittest单元测试原理,文中描述了单元测试,unittest模块特性、大致流程、源码及实战例子这几个模块,有需要的朋友可以借鉴参考下 以下主要介绍unittest特性、运行流程及实际案例。 一、单元测试三连问 1、什么是…

二叉树的各类实现判断二叉树的递归套路

如何判断一颗二叉树是否是搜索二叉树? 搜索二叉树 每个子树头节点的左孩子比它小,右孩子比它大 经典的搜索二叉树没有重复的数 判断 将二叉树按照中序遍历,判断是否为升序 1、先将整棵树中序遍历再判断是否升序 //中序遍历public stat…

如何获取ABAP的程序事件顺序的调用堆栈

难道有激情总结下之前做过的事情,话不多说直接上图 重点在于此函数 CALL FUNCTION SYSTEM_CALLSTACK IMPORTING ET_CALLSTACK L_CSTACK_TAB. " internal table

AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 (一)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 梳理 AD9371 时钟,理解采样率和各个时钟之间的关系 …

【WCA-KELM预测】基于水循环算法优化核极限学习机回归预测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

详解Windows系统下面如何查看CUDA、cuDNN、Python和各个软件包的版本

文章目录 简介查看CUDA版本查看cuDNN版本查看Python版本查看Python环境中已安装软件包的版本参考 简介 这个题目网络上有很多的讲解,但是查看CUDA、cuDNN版本和查看Python与自身各个软件包是分开的,且cuDNN版本的查看方式似乎已经过时【截止2023-10-23】…

测试面试必备:HTTP请求和响应详解!

一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端,HTTP的响应内容同…

Windows新电脑安装环境快速运行Springboot项目

文章目录 简要步骤说明1、配置java运行环境2、配置maven环境3、下载git4、运行IDES Eclipse STS4.1 安装 lombok插件4.2 配置 maven setting.xml 地址4.3 配置 Java版本 5、顺利运行 Springboot项目 简要步骤说明 1、配置java运行环境 安装java11 2、配置maven环境 配置 setti…

【c++】遍历容器,哪一种方法速度最快?

终于有一个简单的每日一题!写完的时候甚至代码还没有编译结束!刚好借今天的每日一题探究一下一直以来的一些疑惑:容器的遍历。 题目大概是这样的: 我们一眼就看到了容器的遍历!!那么众所周知,容…