缓存一致性(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.mzph.cn/news/90838.shtml

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

相关文章

Go语言strconv包

strconv包 参考资料 常用函数 函数功能备注Atoi(s string) (int, error)string转为intItoa(i int) stringint转为stringIsPrint(r rune) bool查询是否可以打印 了解函数 函数功能备注ParseBool(str string) (value bool, err error)返回字符串表示的bool值。它接受1、0、t…

最新影视视频微信小程序源码-带支付和采集功能/微信小程序影视源码PHP(更新)

源码简介: 这个影视视频微信小程序源码,新更新的,它还带支付和采集功能,作为微信小程序影视源码,它可以为用户 提供丰富的影视资源,包括电影、电视剧、综艺节目等。 这个小程序影视源码,还带有…

Vue之ElementUI实现登陆及注册

目录 ​编辑 前言 一、ElementUI简介 1. 什么是ElementUI 2. 使用ElementUI的优势 3. ElementUI的应用场景 二、登陆注册前端界面开发 1. 修改端口号 2. 下载ElementUI所需的js依赖 2.1 添加Element-UI模块 2.2 导入Element-UI模块 2.3 测试Element-UI是否能用 3.编…

APScheduler包——python tornado框架中实现定时任务

介绍: APScheduler的全称是Advanced Python Scheduler。它是一个轻量级的 Python 定时任务调度框架。APScheduler 支持三种调度任务:固定时间间隔,固定时间点(日期),Linux 下的 Crontab 命令。同时&#xf…

IOTE 2023盛况回顾,美格智能聚连接之力促数字新生长

9月20~22日,IOTE国际物联网展深圳站在深圳国际会展中心正式召开。本届展会以“IoT构建数字经济底座”为主题,聚焦物联网技术助推数字经济发展的核心动力。美格智能携前沿技术成果亮相展会,与参展观众深入交流。 展会上,美格智能带…

TCP/IP网络江湖——数据链路层的防御招式(数据链路层下篇:数据链路层的安全问题)

目录 引言 一、 数据链路层的隐私与保密 二、数据链路层的安全协议与加密

SpringCloud Gateway--Predicate/断言(详细介绍)中

😀前言 本篇博文是关于SpringCloud Gateway–Predicate/断言(详细介绍)中,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以…

人工智能AI知多少?

摘要 人工智能(Artificial Intelligence,简称AI)是一项前沿技术,正在快速发展并渗透到各个领域。然而,对于大多数人来说,人工智能仍然是一个陌生而复杂的概念。本文旨在对人工智能进行扫盲,介绍其基本概念、应用领域以及当前热门的人工智能模型。通过具体的例子,读者将…

electron之快速上手

前一篇文章已经介绍了如何创建一个electron项目,没有看过的小伙伴可以去实操一下。 接下来给大家介绍一下electron项目的架构是什么样的。 electron之快速上手 electron项目一般有两个进程:主进程和渲染进程。 主进程:整个项目的唯一入口&…

大数据flink篇之一-基础知识

一、起源 2010至2014年间,由柏林工业大学、柏林洪堡大学和哈索普拉特纳研究所联合发起名Stratosphere的研究项目。2014年4月,项目贡献给Apache基金会,成为孵化项目。更名为Flink2014年12月,成为基金会顶级项目2015年9月&#xff…

分析一段js加密代码

源代码 (function(){var KBP,EbW482-471;function wHY(r){var y2043987;var lr.length;var a[];for(var g0;g<l;g){a[g]r.charAt(g)};for(var g0;g<l;g){var vy*(g289)(y%39401);var ty*(g287)(y%31258);var xv%l;var pt%l;var ma[x];a[x]a[p];a[p]m;y(vt)%2251814;};re…

搭建自己的搜索引擎之五

一、前言 接上文 搭建自己的搜索引擎之四&#xff0c;下面继续介绍茴香豆茴字的另外两种写法。 二、Jest Jest是ES的Java Http Rest客户端&#xff0c;它主要是为了弥补以前ES自有API缺少HttpRest接口客户端的不足&#xff0c;但因为现在ES官方已经提供了RestClient ,该项目已…

JIT介绍

JIT全称&#xff1a;Just in time。中文译为&#xff1a;即时的、实时的。 JVM中的这项技术名为&#xff1a;实时编译技术&#xff0c;也叫即时编译技术。就是在java程序运行的过程中&#xff0c;将字节码编译为机器码运行在本地&#xff0c;而不是通过JVM解释运行&#xff08;…

C++ -- 特殊类设计

目录 设计一个类&#xff0c;不能被拷贝 C98的做法 C11的做法 设计一个类&#xff0c;只能在堆上创建对象 实现方式1 实现方式2 设计一个类&#xff0c;只能在栈上创建对象 实现方式1 方式1的优化 实现方式2 设计一个类&#xff0c;不能被继承 设计模式 什么是设计…

正则表达式在java里的运用

文章目录 前言一、什么是正则表达式&#xff1f;二、使用步骤1.判断数字2.判断包含某个字符串 总结 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容…

计算机竞赛 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

Linux 安全 - Capabilities机制

文章目录 前言一、简介二、Capabilities list2.1 POSIX-draft defined capabilities2.2 Linux-specific capabilities 三、 Past and current implementation四、Thread capability sets五、File capabilities六、Transformation of capabilities during execve()七、Capabilit…

mmpretrain学习笔记

深度学习模型的训练涉及几个方面 1、模型结构&#xff1a;模型有几层、每层多少通道数等 2、数据&#xff1a;数据集划分、数据文件路径、批大小、数据增强策略等 3、训练优化 &#xff1a;梯度下降算法、学习率参数、训练总轮次、学习率变化策略等 4、运行时&#xff1a;GPU、…

【数据集】1985-2022年CLCD逐年土地利用分类数据

1985-2022年CLCD逐年土地利用分类数据 目前,CLCD 1985-2022年土地覆被数据集是较少的目前可公开获取的30m分辨率长时序逐年土地覆被数据。CLCD 反映了中国快速的城市化进程和一系列生态工程,揭示了气候变化条件下人为对土地覆盖的影响,其在全球变化研究中具有潜在应用价值。…

【多线程】线程安全的集合类

文章目录 1. 多线程环境使用ArrayList1.1 自己使用同步机制1.2 Collections.synchronizedList(new ArrayList);1.3 使用 CopyOnWriteArrayList 2. 多线程使用队列3. 多线程环境使用哈希表3.1 HashTable3.2 ConcurrentHashMap3.3 Hashtable和HashMap、ConcurrentHashMap 之间的区…