热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

并发编程之CPU缓存一致性协议MESI

1、一致性问题的产生在多核CPU情况下,每个CPU都有自己的一、二级缓存,在多核处理的情况下,如果一方修改了CPU中已经缓存的东西,而又没有通知已经读取到该cacheline的另一

1、一致性问题的产生

在多核CPU情况下,每个CPU都有自己的一、二级缓存,在多核处理的情况下,如果一方修改了CPU中已经缓存的东西,而又没有通知已经读取到该cache line的另一方,就会导致两边信息不一致。

2、缓存一致性协议MESI

MESI(Modified Exclusive Shared or Invalid)(也成为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议。

3、MESI协议中的状态

CPU中每个缓存行(cache line)使用4种状态进行标记(cache line中使用额外的两位(bit)标识)

M:被修改(Modified)

该缓存行被缓存在该CPU中,并且是被修改过的(dirty)(此时其他CPU中该缓存行和主存中该缓存行的状态都是无效的(invalid)),与主存中的数据不一致,该缓存行中的数据需要在未来某个时间点(允许其他CPU读取主存中相应的内容之前)写回(write back)主存。

当被写回主存之后,该缓存行的状态会变成独享(exclusive)状态。

并发编程之CPU缓存一致性协议MESI

E:独享的(Exclusive)

该缓存行只被缓存在该CPU中,它是未被修改过的,与主存中数据一致。该状态可以在任何时候当有其他CPU读取主存中该缓存行时,变成共享状态(shared)。

并发编程之CPU缓存一致性协议MESI

S:共享的(Shared)

该状态意味着该缓存行可能被多个CPU缓存,并且各个缓存中的数据与主存数据一致,当有一个CPU修改对应缓存行后,其他CPU中对应的该缓存行被作废(变成无效状态invalid)。

并发编程之CPU缓存一致性协议MESI

I:无效的(Invalid)

该缓存行是无效的(可能有其他CPU修改了该缓存行),不能被其他CPU读取,并使用,需要修改该cache line对应的CPU写回数据后方可重新访问。

并发编程之CPU缓存一致性协议MESI

4、MESI状态流转

MESI状态之间的迁移过程如下:

并发编程之CPU缓存一致性协议MESI

并发编程之CPU缓存一致性协议MESI

说明:

Local Read:表示本内核读取本cache line的值;

Local Write:表示本内核写本cache line的值;

Remote Read:标识其他内核读取其他cache line的值;

Remote Write:标识其他内核写其他cache line的值。

下图示意了,当一个cache line的调整的状态的时候,另外一个cache line 需要调整的状态。

  M E S I
M × × ×
E × × ×
S × ×
I

举个例子来说:

假设在主存中有cache line,有一个变量m=1,如下图

并发编程之CPU缓存一致性协议MESI

CPU-A 发出了一条读取指令,从主存中读取m,从主存中通过bus读取到内核缓存,因为当前只有CPU-A拥有该缓存行,且数据状态一致,所以在CPU-A中,该缓存行状态是E,并且主存中的缓存行可以被其他内核读取。

并发编程之CPU缓存一致性协议MESI

此时CPU-B发出了一条读取指令,从主存中读取m,CPU-B从主存中读取m时,CPU-A监听到了这个操作,此时CPU-A和CPU-B中该缓存行的状态即为S(数据与主存中的状态一致)

并发编程之CPU缓存一致性协议MESI

假设此时CPU-A对m进行计算,此时CPU-A将缓存行设置成M(修改),并通知CPU-B,CPU-B中此时该缓存行的状态是I(无效状态),并且主存中该缓存行的状态也是无效状态,不能被读取和操作。

并发编程之CPU缓存一致性协议MESI

CPU-A修改完数据后,CPU-B需要使用最新的数据,CPU-B发出读取指令后,CPU-A在某个时刻将数据写回到主存,在CPU-A中该缓存行状态由M变为S,并且主存中该缓存行数据变为有效,此时CPU-B再去读取一遍,此时CPU-B中该缓存行数据变为S。

并发编程之CPU缓存一致性协议MESI

 


推荐阅读
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
author-avatar
montplus手工饼干
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有