现在的处理器都是多核处理器,并且每个核都带有多个缓存(指令缓存和数据缓存,见下图)。为什么需要缓存呢,这是因为CPU访问内存的速度比较慢,所以在CPU和内存之间加了个缓存以提高访问速度。既然每个核都有缓存,那么假设两个核或者多个核同时访问同一个变量时这些缓存是如何进行同步的呢(缓存细分为一个个缓存行),这就有了MESI协议。

缓存行的四个状态:

MESI中每个缓存行都有四个状态,分别是E(exclusive)、M(modified)、S(shared)、I(invalid)。下面我们介绍一下这四个状态分别代表什么意思。

M:代表该缓存行中的内容被修改了,并且该缓存行只被缓存在该CPU中。这个状态的缓存行中的数据和内存中的不一样,在未来的某个时刻它会被写入到内存中(当其他CPU要读取该缓存行的内容时。或者其他CPU要修改该缓存对应的内存中的内容时(个人理解CPU要修改该内存时先要读取到缓存中再进行修改),这样的话和读取缓存中的内容其实是一个道理)。

E:E代表该缓存行对应内存中的内容只被该CPU缓存,其他CPU没有缓存该缓存对应内存行中的内容。这个状态的缓存行中的内容和内存中的内容一致。该缓存可以在任何其他CPU读取该缓存对应内存中的内容时变成S状态。或者本地处理器写该缓存就会变成M状态。

S:该状态意味着数据不止存在本地CPU缓存中,还存在别的CPU的缓存中。这个状态的数据和内存中的数据是一致的。当有一个CPU修改该缓存行对应的内存的内容时会使该缓存行变成 I 状态。

I:代表该缓存行中的内容时无效的。

EMSI状态转移图:

local read和local write分别代表本地CPU读写。remote read和remote write分别代表其他CPU读写。建议首次看EMSI内容的可以自己把下面这个表格写下来(我自己就是这么做的),这样理解会深一点。

   当前状态             事件                                                     行为 下一个状态
I(invalid)    local  read

1.如果其他处理器中没有这份数据,本缓存从内存中取该数据,状态变为E

2.如果其他处理器中有这份数据,且缓存行状态为M,则先把缓存行中的内容写回到内存。本地cache再从内存读取数据,这时两个cache的状态都变为S

3.如果其他缓存行中有这份数据,并且其他缓存行的状态为S或E,则本地cache从内存中取数据,并且这些缓存行的状态变为S

     E或S
    local  write

1.先从内存中取数据,如果其他缓存中有这份数据,且状态为M,则先将数据更新到内存再读取(个人认为顺序是这样的,其他CPU的缓存内容更新到内存中并且被本地cache读取时,两个cache状态都变为S,然后再写时把其他CPU的状态变为I,自己的变为M)

2.如果其他缓存中有这份数据,且状态为E或S,那么其他缓存行的状态变为I

      M 
 remote  read remote read不影响本地cache的状态       I
 remote  write remote read不影响本地cache的状态       I
E(exclusive)  local  read 状态不变      E
   local  write 状态变为M      M
remote  read 数据和其他核共享,状态变为S      S
remote  write 其他CPU修改了数据,状态变为I       I
S(shared)  local  read 不影响状态      S
   local  write 其他CPU的cache状态变为I,本地cache状态变为M      M
remote  read 不影响状态      S
remote  write 本地cache状态变为I,修改内容的CPU的cache状态变为M       I
M(modified)  local  read 状态不变      M
   local  write 状态不变      M
remote  read 先把cache中的数据写到内存中,其他CPU的cache再读取,状态都变为S      S
remote  write 先把cache中的数据写到内存中,其他CPU的cache再读取并修改后,本地cache状态变为I。修改的那个cache状态变为M      I

MESI(缓存一致性协议)相关推荐

  1. 4.什么是MESI缓存一致性协议?怎么解决并发的可见性问题?

    MESI一致性协议 小陈:老王,上一章你让我看看MESI一致性协议,我大概了解了一下. 老王:哦,来说说你对MESI一致性协议的理解 小陈:MESI协议也叫做缓存一致性协议,主要是用来进行协调多核CP ...

  2. MESI 缓存一致性协议

    本文目录 场景再现 1.总线锁 2.MESI 缓存一致性协议 1.MESI 协议概念 2.通过例子来介绍 MESI 协议 1.MESI 场景 2.MESI 协议下,执行步骤 3.MESI协议失效问题 ...

  3. MESI缓存一致性协议详解

    MESI缓存一致性协议详解 1.CPU为何要有高速缓存 CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题. 带有高速缓存的CPU执行计算的流程 程序以及数据被加载到主内存 ...

  4. 并发编程实战-MESI缓存一致性协议

    大家好,最近呢我对并发编程展现出了兴趣(没办法,别人都会你不会说不过去啊),然后我就要奋发图强学好并发编程,那么接下来让我们一起进入学习吧.我们在学习并发编程实战之前,应该先要了解一下我们的cpu缓存 ...

  5. MESI缓存一致性协议

    每个处理器,在自己的高速缓存中都有变量副本,这就有了缓存不一致问题,因此有了MESI协议. MESI协议将缓存行状态flag分为4种: invalid:无效的,标记为I,当前cache entry无效 ...

  6. 简述Intel的MESI缓存一致性协议

    ①M:modified--与主存的内容相比,有改动就标记为M.我改过,那么对于别人来说就是i了. ②E:exclusive--内容为我锁独占,标记为E. ③S:shared--与此同时别人也在读,标记 ...

  7. 两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排

    1. 并发编程的可见性问题 2. 并发编程的有序性问题 3. 使用volatile关键字解决可见性问题 4. 可见性问题的本质--缓存不一致 因为cpu执行速度很快,但是内存执行速度相对于CPU很慢, ...

  8. “了解高并发底层原理”,面试官:讲一下MESI(缓存一致性协议)吧

    目录 前言: 1.什么是(Who): 2.为何来(How): 2.1缓存不一致带来的后果 2.2解决方法: 3.是什么(What) 3.1数据在缓存中的四种状态: 3.2MESI的六种消息(请求消息和 ...

  9. 同时存多个变量缓存 微信小程序_CPU缓存一致性协议MESI,memory barrier和java volatile...

    MESI协议 MESI协议是一个被广泛使用的CPU缓存一致性协议.我们都知道在CPU中存在着多级缓存,缓存级别越低,容量就越小,速度也越快.有了缓存,CPU就不需要每次都向主存读写数据,这提高了CPU ...

  10. CPU缓存一致性协议MESI - 笔记

    CPU缓存一致性协议MESI CPU高速缓存(Cache Memory) CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU.这就造 ...

最新文章

  1. Greenplum 2000亿 近似度查询 性能 以及注意事项
  2. 【项目实战】汽车金融评分卡
  3. java中将date插入mysql中date_JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法[转]...
  4. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告
  5. mysql 定时任务实例_mysql定时任务与存储过程实例
  6. 好用到哭!你需要立刻学会的20个Python代码段,你get到了吗?
  7. 帝国cms模板仿后台登录界面
  8. html5硬件接口,HTML5通用接口详解
  9. oracle入门很简单豆瓣,Oracle入门经典
  10. 摄像头驱动0V7725学习笔记连载(三):0V7725 SCCB时序的实现
  11. AtCoder Beginner Contest 043题解(ABCD)
  12. AtCoder Beginner Contest 233(A~D)题解
  13. Django学习笔记1 Web开发简介和Django安装运行
  14. 解析 embedded.mobileprovision 获取信息
  15. 西游记研究之五:巨人的角逐
  16. FFMPEG源码编译(Windows篇)
  17. 【CSS】记踩坑-图片3D旋转设置景深perspective
  18. FIN_WAIT_2的超时时间
  19. poi -- 上传、自定义模板导出excel文件插入到数据库
  20. snpEff : 突变位点注释的又一利器

热门文章

  1. FreeRTOS堆分配大小对任务数的影响
  2. 全网首份Nas-tool详细入门教程(包含一些问题的处理方法)
  3. 远程自动抄表解决方案
  4. mysql federated 优缺点_MySQL FEDERATED 存储引擎
  5. java能像python弄字典吗_python字典和结构化数据
  6. 内网ADSL 端口映射 提高BT下载速度
  7. oracle 12519,Oracle出现TNS-12520 TNS-12519连接错误处理
  8. iOS 动态化的故事
  9. 【进阶必看】代码整洁之道
  10. cisco 认证 linux,誉天 Cisco Linux 认证社区.PDF