MESI 缓存一致性协议

MESI 缓存一致性协议

多核场景下,仅仅依靠CAS这一类硬件原语并不能实现同步,因为原子指令底层实现也可能包含多条微指令,而原子指令的原子性是相对于一个核而言的,多条原子指令在各自的CPU核上都是原子执行的。所以要解决这个问题就要先将总线锁住。例如在Go中Mutex的实现,在执行CMPXCHGL指令直线先LOCK总线。锁住总线就导致程序由并行变为串行,这必然会影响性能,现代CPU都拥有高速缓存,不再通过锁总线的方式实现多核间的同步,为了保证多核间高速缓存的一致性,引入了高速缓存一致性协议(MESI协议)。

单核CPU的cache中每个cache line有2个标志:dirty、valid标识,表示cache中的数据是否被修改、是否有效。而在多个核中每个CPU都有自己对应的cache,多个核共享内存中的数据,MESI协议就描述了数据的共享状态,分别是:

状态描述
M(Modified)该行数据有效、被修改,和内存中的数据不一致,该数据只存在于本Cache中。
E(Exclusive)该行数据有效、和内存中的数据一致,该数据只存在于本Cache中。
S(Shared)该行数据有效,和内存中的数据一致,该数据存在于多个Cache中。
I(Invalid)该行数据无效。

M与E的共同点是:都是本Cache所独有的;不同点是:M表示Cache中的数据与内存中的数据不一致。

在MESI协议中,每个Cache的Cache控制器不仅要知道自己的读写操作,还要监听其他Cache的读写操作(监听总线)。

状态变化如下,其中Local Read/Write表示对本CPU Cache的读写操作,Remote Read/Write表示其他CPU对自己Cache的读写操作。

当前状态事件行为下一个状态
I(Invalid)Local Read如果其它Cache没有这份数据,本Cache从内存中取数据,Cache line状态变成E; 如果其它Cache有这份数据,且状态为M,则将数据更新到内存,本Cache再从内存中取数据,2个Cache 的Cache line状态都变成S; 如果其它Cache有这份数据,且状态为S或者E,本Cache从内存中取数据,这些Cache 的Cache line状态都变成SE/S
I(Invalid)Local Write如果其它Cache没有这份数据,本Cache从内存中取数据并修改,Cache line状态变成M;如果其它Cache有这份数据,且状态为M,则要先将数据更新到内存,读取并修改,其他Cache的Cache line状态变为I;M/I
I(Invalid)Remote Read既然是Invalid,别的核的操作与它无关I
I(Invalid)Remote Write既然是Invalid,别的核的操作与它无关I
E(Exclusive)Local Read从Cache中取数据,状态不变E
E(Exclusive)Local Write写入Cache,状态变为MM
E(Exclusive)Remote Read数据和其它核共用,状态变成了SS
E(Exclusive)Remote Write数据被修改,本Cache line不能再使用,状态变成II
S(Shared)Local Read从Cache中取数据,状态不变S
S(Shared)Local Write修改Cache中的数据,状态变成M,其它核共享的Cache line状态变成IM
S(Shared)Remote Read状态不变S
S(Shared)Remote Write数据被修改,本Cache line不能再使用,状态变为II
M(Modified)Local Read从Cache中取数据,状态不变M
M(Modified)Local Write修改Cache中的数据,状态不变M
M(Modified)Remote Read写会内存,使其它核能使用到最新的数据,状态变为SS
M(Modified)Remote Write写会内存,使其它核能使用到最新的数据,数据被修改,本Cache line不能再使用,状态变为II

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

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

相关文章

15分钟从零开始搭建支持10w+用户的生产环境(一)

前言这是一个基于中小型企业或团队的架构设计。不考虑大厂。有充分的理由相信,大厂有绝对的实力来搭建一个相当复杂的环境。中小型企业或团队是个什么样子?开发团队人员配置不全,部分人员身兼开发过程上下游的数个职责;没有专职的…

Sum of Consecutive Prime Numbers POJ - 2739(线性欧拉筛+尺取法)

题意: 一些正整数可以由一个或多个连续质数的总和表示。给定一个的正整数n,问满足条件的有多少种情况? 题目: Some positive integers can be represented by a sum of one or more consecutive prime numbers. How many such representat…

高性能IO——Reactor模式

高性能IO——Reactor模式 参考:https://cloud.tencent.com/developer/article/1513447 目前的IO线程处理模型一般可以分为以下三类: 单线程阻塞I/O服务模型; while(true) {socket accept();handle(socket) }多线程阻塞I/O服务模型&#xf…

X-lab 开放实验室开源创新的故事

本报告为“开源软件供应链点亮计划暑期2020活动”中的“大咖说开源”第二期的特邀嘉宾视频,正好借此机会给大家介绍下 X-lab 实验室目前在开源方面开展的一些事情,欢迎大家关注,也欢迎更多热爱开源的朋友们加入!摘要:2…

Circle and Points POJ - 1981(单位圆覆盖最多点)

题意: 给你n个点和点的位置,问单位圆最多能覆盖多少个点。 题目: You are given N points in the xy-plane. You have a circle of radius one and move it on the xy-plane, so as to enclose as many of the points as possible. Find h…

Golang 匿名函数、闭包

参考:https://blog.csdn.net/qq_35976351/article/details/81986496 Golang 闭包 匿名函数 Golang支持匿名函数,即在需要使用函数时,再定义函数,匿名函数没有函数名,只有函数体。 匿名函数经常被用于实现回调函数、闭…

ASP.NET Core分布式项目实战(Consent 确认逻辑实现)--学习笔记

任务22:Consent 确认逻辑实现接下来,我们会在上一节的基础上添加两个按钮,同意和不同意,点击之后会把请求 post 到 ConsentController 处理,如果同意会通过 return url 跳转到客户端,如果不同意就会取消&am…

The Last Non-zero Digit POJ - 1150(n!mod p)

题意: 要求你求出n!(n−m)!)\frac{n!}{(n-m)!)}(n−m)!)n!​中最后一个非0的数字. 题目: In this problem you will be given two decimal integer numberN,M. You will have to find the last non-zero digit of the NPM^{N}P_{M}NPM​.This means n…

Istio 1.6——迈向极简主义

从 1.2 版本开始,Istio 进入季度发布的节奏。5 月 21 日发布的 1.6 版本可以说是最准时的一次。我们是否可以理解 Istio 架构简化后的开发工作已经步入了正轨?这次的更新是否会带给我们惊喜?亦或是还有遗憾?让我们一一道来。&…

[Java基础]获取Class类的对象

代码如下: package ClassObjectPack;public class Student {private String name;int age;public String address;public Student(String name, int age, String address) {this.name name;this.age age;this.address address;}public Student() {}private Student(String …

使用PInvoke互操作,让C#和C++愉快的交互优势互补

一:背景1. 讲故事如果你常翻看FCL的源码,你会发现这里面有不少方法借助了C/C的力量让C#更快更强悍,如下所示:[DllImport("QCall", CharSet CharSet.Unicode)][SecurityCritical][SuppressUnmanagedCodeSecurity]private static ex…

蓝桥杯2014届试题9题 小朋友排队(树状数组+类逆序对)

题目: 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。开始的时候,所有…

[Java基础]反射获取构造方法并使用

代码如下: package ClassObjectPack;import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException;public class ReflectDemo01 {public static void main(String[] args) throws ClassNotFoundExcep…

Dotnet core使用JWT认证授权最佳实践(二)

最近,团队的小伙伴们在做项目时,需要用到JWT认证。遂根据自己的经验,整理成了这篇文章,用来帮助理清JWT认证的原理和代码编写操作。第一部分:Dotnet core使用JWT认证授权最佳实践(一)(接上文)测…

题目 1886: [蓝桥杯][2017年第八届真题]包子凑数(欧几里得+完全背包)

题目: 时间限制: 1Sec 内存限制: 128MB 提交: 1049 解决: 365 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。 每当有顾客想买X…

[Java基础]反射获取构造方法并使用练习

Student类代码如下: package ClassObjectPack;public class Student {private String name;int age;public String address;public Student(String name, int age, String address) {this.name name;this.age age;this.address address;}public Student() {}private Studen…

Dotnet core使用JWT认证授权最佳实践(一)

最近,团队的小伙伴们在做项目时,需要用到JWT认证。遂根据自己的经验,整理成了这篇文章,用来帮助理清JWT认证的原理和代码编写操作。一、JWTJSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的…

[Java基础]反射获取成员变量并使用

代码如下: package ClassObjectPack;public class Student {private String name;int age;public String address;public Student(String name, int age, String address) {this.name name;this.age age;this.address address;}public Student() {}private Student(String …