缓存一致性(cache coherency)解决方案:MESI 协议状态转换详解

MESI 协议

  • 一,MESI状态释义
  • 二,MESI状态转换
    • 1 Invalid after Reset
    • 2, Invalid => Exclusive
    • 3, Exclusive => Modified
    • 4 Modified => Shared, Invalid => Shared
    • 5 Shared => Invalid, Shared => Modified
  • 三,状态转换场景总结
    • Invalid to Shared/ Invalid to Exclusive
    • Invalid to Modified.
    • Shared to Modified.
    • Shared to Invalid.
    • Exclusive to Modified.
    • Exclusive to Invalid.
    • Modified to Shared.
    • Modified to Invalid.
  • 四,参考文档

一,MESI状态释义

ARMv8架构使用 MESI 协议来维护在多个core之间的数据一致性,MESI 协议描述了 L1 Data Cache中的一个共享的cache line的状态可以是:

  • M,Modified, Unique Dirty((UD), 只存在于当前cache中(unique),并且该cache line上的数据与下一级存储单元中的数据不同(dirty)。换言之,cache line中最新的数据位于当前cache,其他cache中没有备份 ,cache line中的内容与主存中的不一致。
  • E,Exclusive, Unique Clean(UC),数据只存在于当前cache line中,并且为clean的。cache中cache line中的数据于主存中的一致,并且其他core中的cache没有该地址的数据备份,只存在一个cache中。
  • S,Shared Clean (SC), Shared ,cache line中的data不一定与主存中的一致,但是shared cache line中的数据是最新的,且存在于多个core中。
  • I,Invalid,无效的数据,或者可以说当前cache line里没有数据。

Data Cache Unit (DCU)会将cache line的 MESI状态信息保存在tag RAM和 dirty RAM中,关于如何读取cache line中的MESI信息,将在下篇文章中讲解。本文主要探讨MESI的状态转换过程以及转换示例。

二,MESI状态转换

下图为MESI协议的状态转换图:在这里插入图片描述
接下来,本文将结合一个在多核场景下的状态转换用例,来解释具体的MESI状态转换:

1 Invalid after Reset

假设当前系统有四个core,每个core有自己独立的data cache,在系统上电后,所有core的cache line默认都为 invalid状态:
在这里插入图片描述

2, Invalid => Exclusive

然后core0 试图读取内存中地址为 0x44013F00上的数据,在core0 的data cache中会发生read miss以及linefill,与该地址相关的cache line的状态将由Invalid 转为 VE,其中V 为Valid,表明该cacheline中的数据有效。E为Exclusive,表明该数据只在core0中,并且是clean的。

在这里插入图片描述
上图中的 invalid状态到Exclusive的转换,也就是下图标红的部分:
在这里插入图片描述

3, Exclusive => Modified

之后,core0试图对该地址写入一个新值,该cache line的状态将由VE会变成VDM,其中V为,valid,D为Dirty,表示数据为脏,当前cache line中的数据与主存中的不一致。M 为Modified,表明该cache line中的数据是Unique且Dirty的。
在这里插入图片描述
也就是下图标红的部分:
在这里插入图片描述

4 Modified => Shared, Invalid => Shared

接下来,让core 1,core2,core3也对对该地址进行读取操作,core0的状态将会从VDM 转为 VS,其他三个core的cache line将由Invalid 转为 VS, S表示Shared。此外,从下图中,也可知,core1,core2,core3读取到的数据是core0 cache中的备份,而不是真正内存中的值。
在这里插入图片描述
下图红色部分即上述状态的转换过程:
在这里插入图片描述

5 Shared => Invalid, Shared => Modified

接4的步骤, 如果core1 试图对该地址写入一个新值,core0、core2和core3中该cache line的状态将会由Shared 变为 Invalid,而core1的状态将由Shared 变为 Modified(VDM)。此外,由于使用的是write back策略,所以当前的写入操作仅写入到了cache中,主存中的内容仍未改变。
在本示例中,出现了两个core先后对同一个内存地址进行读写操作, core0写入的值(蓝色)由于没有被写回到主存中,之后core1又对该地址写入一个新值(绿色),就把core0写入的值给覆盖了。

在这里插入图片描述
下图红色部分即上述状态的转换过程:
在这里插入图片描述

三,状态转换场景总结

Invalid to Shared/ Invalid to Exclusive

当一个core对某地址发生了read miss,需要进行linefill的时候,如果检查到其他core里保存着该地址的数据,则发生Invalid to Shared,否则就是Invalid to Exclusive。

Invalid to Modified.

当一个core对某地址发生Write miss,需要进行linefill的时候,会广播消息,通知其他core:如果也保存了该地址的数据(无论是E状态或者是S状态),对该地址上的数据进行invalidate操作。所以根据不同的架构实现,可能会发生dirty cache line的write back或者data corruption。

Shared to Modified.

当一个core对某地址发生Write hit(S状态或者M状态)时,会广播通知其他core将对应该地址的数据(如果其他core中存在,其状态只能是S)给invalidate掉。

Shared to Invalid.

检测到其他core对该地址进行了写操作。

Exclusive to Modified.

当一个core对某地址发生Write hit(E状态)时Write hit,无需发出任何广播消息。

Exclusive to Invalid.

检测到其他core对该地址进行了写操作。

Modified to Shared.

检测到其他core对该地址进行了读操作。 改dirt cache line将会分享给发起读操作的core(invalid to shared)。根据具体的实现架构,可能还会发生write back。

Modified to Invalid.

检测到其他core对该地址进行了写操作。根据具体的实现架构,可能还会发生write back。

四,参考文档

https://handwiki.org/wiki/MESI_protocol
https://community.cadence.com/cadence_blogs_8/b/breakfast-bytes/posts/what-39-s-the-difference-between-moesi-and-mesi-cache-coherence-for-poets
https://celery1124.github.io/MESI-protocol/
https://users.cs.utah.edu/~bojnordi/classes/7810/s20/slides/07-snooping.pdf
https://inst.eecs.berkeley.edu/~cs152/sp16/handouts/quiz5sol_s2016.pdf
https://inst.eecs.berkeley.edu/~cs61c/su18/disc/11/Disc11Sol.pdf
https://www.geeksforgeeks.org/cache-coherence-protocols-in-multiprocessor-system/

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

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

相关文章

Linux常见指令2

Linux常见指令[2] 一.Linux常见指令1.man补充知识:nano 2.cp3.mv4.cat补充知识:echo输出重定向追加重定向回到catcat其他用法 5.less和more补充内容回到less 6.head和tail补充知识:命令行管道 一.Linux常见指令 前言:为了方便我们在Linux中写指令 介绍一下: 1.clear指令: 清屏…

【每日一题】2769. 找出最大的可达成数字

2769. 找出最大的可达成数字 - 力扣(LeetCode) 给你两个整数 num 和 t 。 如果整数 x 可以在执行下述操作不超过 t 次的情况下变为与 num 相等,则称其为 可达成数字 : 每次操作将 x 的值增加或减少 1 ,同时可以选择将 …

红黑树是如何实现的?

文章目录 一、红黑树的概念二、红黑树的性质三、红黑树和AVL树对比四、红黑树的插入1. 红黑树的结点定义2. 父亲的颜色3. 叔叔的颜色为红色4. 叔叔不存在5. 叔叔存在且为黑6. 插入的抽象图 五、红黑树的验证1. 检查平衡2. 计算高度与旋转次数3. 验证 六、 红黑树与AVL树的比较 …

基于SSM+Vue的医院住院综合服务管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

ROS系统读取USB相机图像数据

ROS系统读取USB相机图像数据 前言usb_cam 功能包下载与编译摄像头选择连接摄像头可配置参数 前言 usb_cam功能包简介 为了丰富机器人与外界的交互方式,已经增加了与机器人的语音交互方式,不仅使机器人能够说话发声,还能听懂我们说的话&#…

Windows中实现将bat或exe文件作为服务_且实现命令行安装、配置、启动、删除服务

一、背景描述 在Windows环境下进行日常的项目开发过程中,有时候需要将bat文件或exe文件程序注册为Windows的服务实现开机自己运行(没有用户登陆,服务在开机后也可以照常运行)、且对于那些没有用户交互界面的exe程序来说只要在后台…

STL upper_bound和lower_bound函数

声明&#xff1a; 首先包含头文件#include<algorithm> 这里的两个函数所运用的对象必须是非递减的序列&#xff08;也就是数组&#xff0c;数组必须是非递减的&#xff09;&#xff0c;只有这样才可以使用upper_bound和lower_bound这两个函数。 还有一点&#xff0c;就…

Python入门教程48:Pycharm永久镜像源的pip配置方法

国内几个好用的Python镜像服务器地址&#xff1a; 清华大学镜像站&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/阿里云镜像站&#xff1a;https://mirrors.aliyun.com/pypi/simple/中科大镜像站&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple/中国科技大学镜…

HTML5福利篇--使用Canvas画图

目录 一.Canvas元素 1.Canvas元素定义 2.使用JavaScript获取页面中的Canvas对象 二.绘制图形 1.绘制直线 2.绘制矩形 &#xff08;1&#xff09;rect() &#xff08;2&#xff09;strokeRect() &#xff08;3&#xff09;fillRect()和clearRect()函数 3.绘制圆弧 4.…

ElementUI之首页导航+左侧菜单->mockjs,总线

mockjs总线 1.mockjs 什么是Mock.js 前后端分离开发开发过程当中&#xff0c;经常会遇到以下几个尴尬的场景&#xff1a; - 老大&#xff0c;接口文档还没输出&#xff0c;我的好多活干不下去啊&#xff01; - 后端小哥&#xff0c;接口写好了没&#xff0c;我要测试啊&#x…

opencv: 解决保存视频失败的问题

摘要&#xff1a;opencv能读取视频&#xff0c;但保存视频时报错。 一、首先要确保已经下载了openh264.dll文件&#xff0c;否则保存的视频无法打开&#xff0c;详细可以浏览这个&#xff1a;opencv&#xff1a;保存视频。 二、保存视频时出现一下问题&#xff1a; OpenCV:…

COCO 数据集 人体关键点格式

图片与标注数据在 COCO官网 均提供下载 标注格式 COCO 的标注中包含 4 个部分/字段&#xff0c;"info" 描述数据集&#xff0c;"licenses" 描述图片来源&#xff0c;"images" 和 "annotations" 是主体部分 "images" 部分…

一文带你全面解析postman工具的使用

写在前面&#xff1a;本文转自今日头条作者雨滴测试&#xff0c;感兴趣可点击下方链接查看原文 基础篇效率篇高级篇 一文带你全面解析postman工具的使用 文章目录 一文带你全面解析postman工具的使用基础篇一、postman安装说明1.下载与安装2.界面导航说明3.发送第一个请求 二、…

3 OpenCV两张图片实现稀疏点云的生成

前文&#xff1a; 1 基于SIFT图像特征识别的匹配方法比较与实现 2 OpenCV实现的F矩阵RANSAC原理与实践 1 E矩阵 1.1 由F到E E K T ∗ F ∗ K E K^T * F * K EKT∗F∗K E 矩阵可以直接通过之前算好的 F 矩阵与相机内参 K 矩阵获得 Mat E K.t() * F * K;相机内参获得的方式…

87、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->List相关命令

本次讲解要点&#xff1a; List相关命令&#xff1a;是指value中的数据类型 启动redis服务器&#xff1a; 打开小黑窗&#xff1a; C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe redi…

Java编码技巧:验证码

目录 1.1、EasyCaptcha&#xff08;优选&#xff0c;支持种类多&#xff0c;样式多&#xff0c;使用简单&#xff09;1.1.1、作用1.1.2、官方信息1.1.3、使用案例1.1.4、依赖1.1.5、代码1.1.6、效果1.1.7、拓展 1.2、kaptcha1.2.1、作用1.2.2、官方信息1.2.3、使用案例1.2.4、依…

DE0开发板交通灯十字路口红绿灯VHDL

名称&#xff1a;基于DE0开发板的交通灯十字路口红绿灯 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 设计一个十字路口交通信号灯的控制电路。分为两种情况&#xff0c;正常状态和报警状态。 1.正常状态&#xff1a;要求红、绿灯按一定的规律亮和灭&a…

触觉智能 PurPle Pi OH(OpenHarmony)开发板

资料汇总 内容预览 产品介绍 PurPle-Pi OH 规格书​​​​​​ 系统编译 Purple-Pi-OH Linux SDK编译 Purple-Pi-OH OHOS SDK编译 使用手册 Purple-Pi-OH Ubuntu系统使用手册 常见FAQ 常见问题 官网 官网地址 Purple Pi OH介绍 Purple Pi OH作为一款兼容树莓派的开…

多个pdf合并成一个文件,3个方法合并pdf

如何把多个pdf合并成一个文件&#xff1f;在我们日常的工作中&#xff0c;经常会遇到一些需要处理的文件&#xff0c;其中包括PDF文件。特别是当我们需要将多个PDF文件合并成一个PDF文件时&#xff0c;会面临一些困难。这样的情况下&#xff0c;我们的阅读能力会受到限制&#…

软件测试中的测试工具和自动化测试

1. 测试工具 测试工具也分为不同人员使用的 开发人员&#xff1a;测试框架&#xff0c;编写测试用例&#xff1b;各类线上dump分析工具如windgb&#xff1b;开发时的集成IDE工具如Visual Studio&#xff0c;idea等等 面向不同测试需求的测试工具 软件测试是软件开发生命周期…