精华内容
下载资源
问答
  • CPU的缓存一致性MESI 缓存一致性协议有很多不止MESI,主要是因为inter使用的是MESI,而大多数人使用的是inter。 什么是MESI? MESI 是指4中状态的首字母。每个Cache line有4个状态,可用2个bit表示 M:修改,就是此时...

    CPU的缓存一致性MESI

    缓存一致性协议有很多不止MESI,主要是因为inter使用的是MESI,而大多数人使用的是inter。

    什么是MESI?

    MESI 是指4中状态的首字母。每个Cache line有4个状态,可用2个bit表示
    M:修改,就是此时CPU从主存中拿到的值已经被该CPU修改过了
    E:独享,此时CPU从主存中拿到的值只在该CPU中
    S:共享,此时CPU拿到的值和主存中一致,且存在于多个CPU缓存中
    I:无效,此时CPU拿到的数据和主存中不一致,被其他CPU更改过了

    虽然硬件层次上使用了缓存一致性协议,但是有些数据过大或者不能放到缓存中也是一样要进行锁总线,来实现一致性。

    缓存数据的时候会把这个数值所在行都放到缓存中,这样做的原因是因为访问此值的相邻值的概率特别大,防止反复缓存。

    缓存行的话就会出现一个问题就是效率低
    原因:当CPU1访问缓存中的X值,CPU2访问缓存中的Y值,此时正好X,Y两个值在同一个缓存行上面,那么当CPU1对X值进行了修改那么就要同步到内存中,CPU2发现缓存行被更改了就要重新同步一份新的,这样CPU1和CPU2完全是没有关系的两个操作确导致了频繁更新缓存行,这样会导致效率变低。
    这种情况也被称之为:伪共享

    解决办法:让值不在同一个缓存行内,比较经典的一个使用方式如下:
    这时变量a不和任何变量处在同一缓存行这种方式叫缓存行对齐
    disruptor框架用的就是这种
    ps:JVM 要求Java的对象占用的内存大小必须是8bit的整数倍,所以后面有几个字节用于把对象的大小补齐值8bit 倍数。这样a不管是和前7bit组成8bit还是和后7bit组成8bit都是只有自己

    还有一种方式是java8之后提供的一个注解@Contended,可以将被注解的变量不和任何变量在同一缓存行中,但是如果只是用这个注解是没有效果的,还需要在jvm启动时设置-XX:-RestrictContended即可。

    ps:java基本数据类型和引用的字节数表

    展开全文
  • CPU通过缓存一致性MESI(修改、独占、共享、无效)协议,这个MESI协议实际上有很多种不同的实现,具体的实现机制要靠具体底层的系统如何实现。比如有一种实现,就是一个处理器将另外一个处理器的高速缓存中的更新后...

    上一篇文章,介绍了CPU的一些关键组件、高速缓存、写缓冲区和无效队列等,文章结尾留下了一个问题,就是CPU为了性能引入的写缓冲区和无效队列后可能会导致线程之间不可见问题。想了解硬件层面导致的可见性问题的朋友可以看下关于CPU几个不得不知的概念,文末有说明。

    底层解决方案

    CPU通过缓存一致性MESI(修改、独占、共享、无效)协议,这个MESI协议实际上有很多种不同的实现,具体的实现机制要靠具体底层的系统如何实现。比如有一种实现,就是一个处理器将另外一个处理器的高速缓存中的更新后的数据拿到自己高速缓存来更新一下,这样大家的缓存不就实现同步了,然后各个处理器的线程看到的数据就一样了。为了实现MESI协议,有两个配套的专业机制要给大家说一下:flush处理器缓存、refresh处理器缓存。
    flush处理器缓存:把自己更新的值刷新到高速缓存里去,因为必须要疏导高速缓里,才可能在后续通过一些特殊的机制让其他的处理器从自己的高速缓存(或者主内存)里读取到更新的值。

    refresh处理器缓存:处理器中的线程在读取一个变量的值的时候,如果发现其他处理器的线程更新了变量的值,必需从其他处理器的高速缓存(或者主内存)里,读取这个更新的值,然后更新到自己高速缓存中。

    总结:为了保证可见性,在底层通过MESI协议、flush处理器缓存和refresh处理器缓存,这一整套机制来保障的。

    Java中volatile关键字通过两条指令来实现可见性。

    • 一个是强制刷主内存
    • 一个是过期掉其他处理器的高速缓存中的数据。

    Java里对一个变量加了volatile关键字修饰后,对这个变量的写操作,会执行flush处理器缓存,把数据刷到高速缓存(或者主内存)中,然后对这个变量的读操作,会执行refresh处理器缓存,从其他处理器的高速缓存(或者主内存)中读取最新的值。然后读volatile变量的时候,会发现高速缓存中的值过期,然后强制从主内存加载最新值。本质都是让一个线程写了volatile变量之后,另外一个变量立马可以读到volatile变量的值。

    了解硬件相关知识是学习Java并发编程的基础,跟着我一起来学习吧。下面是我在百度平台的百家号,关注送面试宝典哦
    在这里插入图片描述

    展开全文
  • 简述缓存一致性 MESI

    2019-04-14 13:43:45
    缓存一致性:保证数据在高速缓存区与主内存中数据的一致性,保证不同处理的读和写的安全。 高速缓存的总结构 : 缓存条目的结构: tag 存放数据的内存地址 data 存放数据(副本) flag ...

    缓存一致性:保证数据在高速缓存区与主内存中数据的一致性,保证不同处理的读和写的安全。 

    高速缓存的总结构 :

    缓存条目的结构:

    tag 存放数据的内存地址
    data 存放数据(副本)
    flag 存放各个的状态

    缓存条目的 flag的 MESI 的 状态信息:

    M(修改)

    存在tag相同,但是flag 仅仅只有唯一的一个,数据与主内存不相同。(占据拥有权)从写中我们可以得知

    (M 状态的获得是在我们进行写操作之后就会有这个 状态,当其他的处理器一旦修改数据 就会导致 这个M状态被改变)

    E   (占据) 仅仅唯一存在一个tag,与主内存一致。(占据拥有权)
    S (共享)

    存在tag相同,与主内存一致。

    (在我们进行数据读的时候就会有这么一个状态)

    I  (无效) 数据与初始化状态相同

    处理器的读流程:

            读,会先去自己的高速缓存区中进行读取,若读取到的情况下,判断他的flag的状态,若状态喂 M,E,S 就直接读取自己缓存区的信息,否则发 Read 信息到总线中去读取我们想要信息的数据。然后其他处理器亦或是主内存收到这样的消息就会进行回复,待我们收到回复的时候,会将其数据存入缓存行中,并将其状态更新为 S。

    处理器的写流程:

            会根据我们想要写的内存地址,先去自己的高速缓存区中进行寻找。(情况一、二、三)                                                             

    (1)我们所找到的缓存条目的状态为E,M 就带表当前拥有它的操作权,我们就可以直接对他进行操作,待操作完毕把状态更改为 M   

    (2)我们找到的缓存条目不为 E,M 就会先送一个 invalid的信息出去总线,通知其他处理器,拥有此内存地址的直接更改为 无效。待主存,或处理器回复 Read Sponsor  就会更改为E,然后再将数据进行更新到缓存行中,把数据条目状态更改为 M。           

     (3)我们找到的缓存条目为 I 就会先送一个Read invalid的信息出去总线,通知其他处理器,拥有此内存地址的直接更改为 无效。待主存,或处理器回复 Read Sponsor  就会更改为E,然后再将数据进行更新到缓存行中,把数据条目状态更改为 M。

     

    虽然这些对于我们编写代码好像又没有起到什么作用,毕竟这些已经帮我们处理完毕了,但是了解清晰了,总还是好的。毕竟知其然,知其所以然,方为最佳。

     

     

     

    展开全文
  • 文章目录一、前言二、为何需要CPU Cache三、L1、L2 、L3 Cache 三级缓存结构四、Cache Line:与内存数据交换的最小单位五、MEIS:缓存一致性5.1 底层操作5.2 MESI 协议参考 一、前言 原打算重新学习一下 volatile 的...

    一、前言

    原打算重新学习一下 volatile 的实现原理,其中涉及到指令调度重排和数据可见性保证,这两者的理解离不开对 CPU Cache的掌握,因此,先重温一下CPU Cache,便有了本文。

    二、为何需要CPU Cache

    CPU的发展呈现出摩尔定律(近期越来越多的声音觉得结束了),发展速度迅猛,每18-24个月性能翻番。而内存的发展相较之下显得十分缓慢,与CPU的性能差距越来越大。为了缓冲两者的速度差,引入了采用SRAM做Cache的三级缓存(L1、L2、L3),以提高CPU的计算效率。当然了,其实内存并非无法提速,只是出于成本和容量的平衡。

    1965 年,英特尔联合创始人戈登·摩尔提出以自己名字命名的「摩尔定律」,意指集成电路上可容纳的元器件的数量每隔 18 至 24 个月就会增加一倍,性能也将提升一倍。

    在这里插入图片描述

    这就好像咱们去超市购物,所购买的东西经常就那么几样,真正购物的时间很短,但是交通耗时、买单排队耗时通常就已经占据了大部分的时间。出于成本考虑,一个小区配备一个超市显然不太可能。于是引入了住宅楼下的自动售卖机、社区的便利店等。如此一来,购物效率自然提高了。

    三、L1、L2 、L3 Cache 三级缓存结构

    三级缓存集成在CPU中,组成如下,每个CPU核都拥有自己的L1 Cache、L2 Cache,而L3 Cache为所有核心共享。其中,L1距离Execution Units计算单元距离最近,计算速度通常十分接近;L2 、L3分别次之。另外,L1 Cache 一般分为 L1d 数据缓存 和 L1i 指令集缓存,用以减少CPU多核心/多线程竞抢缓存引起的冲突。

    读取数据时,逐级访问,即执行单元访问L1,若不存在该数据,则L1访问L2,L2若同样没有则访问L3,最后L3访问内存。

    在这里插入图片描述

    三级缓存的大小通常不大,以本机i5-8259u为例:

    i5-8259u:

    L1 Data Cache :32.0 KB x 4

    L1 Instruction Cache :32.0 KB x 4

    L2 Cache :246 KB x 4

    L3 Cache :6.00 MB

    L4 Cache :0.00 B

    Memory :16.0 GB 2133MHz LPDDR3

    四、Cache Line:与内存数据交换的最小单位

    一个Cache分为N个Cache Line, 一般大小为32byte或64byte,是和内存进行数据交换的最小单位。一个Cache Line 至少有valid、tag、block三个部分,其中block用以存储数据,tag用于指示内存地址,valid则用于表示该数据的有效性。

    在这里插入图片描述

    CPU内核访问数据时,发现该数据处于某个Cache Line中,且valid状态为有效,则成为cache hit,否则,成为cache miss。通常,缓存命中和未命中对于内核的效率影响相差几百个时钟。因此,为了缓存命中率,采用合理有效的缓存数据设置和替换策略对于CPU的计算效率至关重要。就好比社区便利店根据居民的购物习惯,提供高频消费的商品,并且,根据客户喜好的演变进行调整。

    CPU的缓存数据设置主要根据空间局部性、时间局部性。

    空间局部性:若一个存储位置的数据被访问,那么它附近位置的数据很大可能也会被访问。

    时间局部性:若一个存储位置的数据被访问,那么它在将来的时间很大可能被重复访问。

    而缓存置换策略一般有三种,FIFO 先进先出,LRU 最近最少使用,和 LFU 最不常使用:

    FIFO:First In First Out,根据进入缓存时间,淘汰最早的。

    LRU:Least Recently Used,对缓存数据进行使用量统计,淘汰最少使用的。该算法使用最多。

    LFU:Least Frequently Used,一段时间内,根据使用量,淘汰最少使用的。

    (LUR和LFU算法练习:Leetcode-LRULeetcode-LFU

    五、MEIS:缓存一致性

    引入多级缓存后,结合行之有效的数据设置和替换策略,大大提高了CPU的计算效率,但是同时也带来了缓存一致性问题。

    5.1 底层操作

    为了保证 Cache 一致性,CPU 底层提供了两种操作:Write invalidate 和 Write update。

    Write invalidate 操作指:当一个内核修改了一份数据,其它内核如果有这份数据,就把 valid 标识为无效。

    Write update 操作指:当一个内核修改了一份数据,其它内核如果有这份数据,就都更新为新值。

    Write invalidate 操作实现起来更为简单,加上其它内核后续并不需要使用到改数据。缺点在于一个valid标识对应个Cache Line,如此一来,其它原本有效的数据也被设置为无效。Write update 操作会产生大量的更新操作,不过只需要更新修改的数据,而非一个Cache Line。大多数处理器采用的操作都是 Write invalide。

    这两个操作也是我们码农常用的缓存操作,修改缓存数据后,将缓存置为无效,或者直接更新。当然,除此之外,对于实时性要求不高的缓存数据,我们还经常采用定期时间,自动过期的策略。

    5.2 MESI 协议

    Write invalidate 提供了缓存一致性的简单解决思路,具体的实施还需要一套完整的协议,其中比较经典,常作为教材的就是MESI协议,后续许多协议都是基于MESI进行扩展。

    与前文讲到的 Cache Line 普通结构不同的是,MESI 协议中,Cache Line 用头两个 bit 来表示 MESI 的四个状态:

    在这里插入图片描述

    这四个状态分别为:

    M(Modified):数据被修改了,属于有效状态,但是数据只处于本Cache,和内存不一致。

    E(Exclusive):数据独占,属于有效状态,数据仅在本Cache,和内存一致。

    S(Shared):数据非独占,属于有效状态,数据存于多个Cache,和内存一致。

    I(Invalid):数据无效。

    下面用画图示意四个状态,便于理解,图片取自《大话处理器》:

    在这里插入图片描述

    需要注意的是:当状态为E/S时,数据才与缓存一致。而修改某内核Cache的数据后,并不会立即写回内存,而是将该Cache Line标示为M,其它内核的该份数据表示为I,此时的数据是不一致的。

    下面为四个状态的转化示意图:

    在这里插入图片描述

    从状态转化图中,可以注意到的是:无论当前Cache Line处于什么状态,对于两个修改操作——Local Write 将本Cache Line 状态变更为 Modified,并将其它Cache Line统一设置为 Invalid(若其它核处于S),等待触发写回内存;而 Remote Write 则将所有存有该份数据的 Cache Line 状态统一变更为 Invalid 失效,相当于重新构建该数据的缓存。

    下面分别对四种状态的转化进行具体说明:

    当状态为 Invalid 时:

    当前状态 事件 下个状态 说明
    Invalid Local Read Exclusive 在其它Cache中找不到该数据
    Invalid Local Write Shared (1)若存有该数据的Cache Line处于M,则将该数据更新至内存;(2)若存有该数据的Cache Line处于E,则读取数据,并将该两个Cache Line都设置为S;(3)若存有该数据的Cache Line处于S,则读取该数据,将本Cache Line设置为S
    Invalid Remote Read Invalid 其它核不读该数据
    Invalid Remote Write Invalid 其它核不写该数据

    当状态为 Exclusive 时:

    当前状态 事件 下个状态 说明
    Exclusive Local Read Exclusive 读自己独占的数据,状态自然不变
    Exclusive Local Write Modified 设置为M,因为与内存数据不一致,等触发回写
    Exclusive Remote Read Shared 其它核不读该数据
    Exclusive Remote Write Invalid 其它核不写该数据

    当状态为 Shared 时:

    当前状态 事件 下个状态 说明
    Shared Local Read Shared 读共享数据,无变更数据,状态自然不变
    Shared Local Write Modified 设置为M,因为与内存数据不一致,等触发回写
    Shared Remote Read Shared 读共享数据,无变更数据,状态自然不变
    Shared Remote Write Invalid 其它核修改不属于自己的Cache,采用统一失效策略

    当状态为 Modified 时:

    当前状态 事件 下个状态 说明
    Modified Local Read Modified 读自己独有的数据,状态自然不变
    Modified Local Write Modified 写自己独有的数据,状态同样不变
    Modified Remote Read Shared 读共享数据,无变更数据,状态自然不变
    Modified Remote Write Invalid 其它核修改不属于自己的Cache,采用统一失效策略

    参考

    1. 《大话处理器》Cache一致性协议之MESI —— 木兮清扬
    展开全文
  • 下图是最简单的高速缓存的配置 CPU和缓存以及主存都连在总线上高速缓存出现后不久,主存和高速缓存之间的速度差异越来越大,因此现在一些系统可能采用的二级缓存,甚至三级缓存,脑海有这个概念就行了。1、为什么需要CPU...
  • 多核CPU多级缓存一致性协议MESI 多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESIMESI协议缓存状态 MESI 是指4中状态的首字母。每个Cache line...
  • CPU缓存一致性协议MESI

    2020-12-13 09:53:59
    CPU缓存一致性协议MESI转载文章地址 转载文章地址 CPU缓存一致性协议MESI
  • 本节将介绍一下计算机的多级缓存(L1、L2、L3)架构、多级缓存与主存怎么进行数据交互的,另外会对MESI缓存一致性协议)做下介绍,为后面的JMM模型、volatile关键字的学习打下基础。 一,现代计算机硬件基本结构 ...
  • 缓存一致性协议MESI

    2020-07-08 14:36:20
    Cache一致性协议之MESI           处理器上有一套完整的协议,来保证Cache一致性。比较经典的Cache一致性协议当属MESI协议,奔腾处理器有使用它,很多其他的处理器都...
  • MESI 协议解决了缓存一致性问题, 但是其自身也存在一个性能弱点——处理器执行写内存操作时,必须等待其他所有处理器将其高速缓存中的相应副本数据删除并接收到这些处理器所回复的 Invalidate Acknowledge/Read ...
  • 传送门:CPU缓存一致性协议MESI 1.首先cpu的处理速度已经远大于I/O的速度,所以需要对cpu增加高速缓存,以减少对内存的依赖,但是这会导致各个cpu中的高速缓存数据不一致 2.为了解决不一致的状态,我们就规定了MESI...
  • 最近用到了很多多线程的问题,发现对于并发的理论只是还有些欠缺,在学习的时候也会慢慢积累...缓存一致性 MESI 开始详细说一下cpu、内存、缓存之间的关系 如果只是读缓存的情况 如果考虑写缓存的情况 一致性...
  • 缓存一致性MESI

    千次阅读 2018-05-31 17:24:00
    所以就出现了缓存一致性协议。最出名的就是Intel 的MESI协议,MESI协议保证了每个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的...
  • MESI缓存一致性协议一、CPU高速缓存(Cache Memory)1、CPU为何高速缓存带高速缓存的CPU执行流程目前流行的多级缓存结构2、多核CPU缓存一致性协议MESI缓存行为分享3、MESI引入的问题1、CPU切换状态阻塞解决-存储缓存...
  • 缓存一致性协议MESI,cpu cache

    万次阅读 2018-05-15 10:08:08
    不论是cpu中cache缓存还是项目开发中的缓存,缓存的好处是提高运行...缓存一致性协议(MESImesi 四种独占状态缩写,表示cpu中一个缓存行的四个状态 Modified (被修改,等待写回内存,已不可用【脏数据】) ...
  • MESI 协议解决了缓存一致性问题, 但是其自身也存在一个性能弱点——处理器执行写内存操作时,必须等待其他所有处理器将其高速缓存中的相应副本数据删除并接收到这些处理器所回复的 Invalidate Acknowledge/Read ...
  • 缓存一致性协议:MESI

    2020-10-22 18:41:47
    目录缓存一致性问题缓存一致性协议四种状态缓存一致性协议(MESI)流程缓存一致性协议失效总线风暴问题 缓存一致性问题 在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存 (MainMemory)。...
  • MESI(Modified Exclusive Shared or Invalid)(也成为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议。 3、MESI协议中的状态 CPU中每个缓存行(cache line)使
  • CPU缓存一致性协议MESI - 笔记

    千次阅读 2020-04-08 19:49:19
    CPU缓存一致性协议MESI CPU高速缓存(Cache Memory) CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其...
  • 先来梳理下关于高速缓存的一些知识 高速缓存是一种存取速率远比主内存大而容量远比主内存小的存储部件,每个处理器都有其高速缓存。引入高速缓存之后, 处理器在执行内存读、 写操作的时候并不直接与主内存打交道, ...
  • 缓存一致性协议 mesi

    2018-01-05 20:59:00
    m : modified e : exlusive s : shared i : invalid 四种状态的转换略过,现在讨论为...A 读入i ,缓存行状态为 e B读入i , 发现A有,那么设置为s,A里面也设置为s A cpu处理,i值加一等于一,但是只是在寄存...
  • CPU 高速缓存(Cache Memory) CPU 为何要有高速缓存 CPU 在摩尔定律的指导下以每 18 个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及 CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而 CPU 的...
  • CPU缓存一致性协议MESI 的理解 关于CPU缓存一致性协议MESI,已经有很多文章详细的介绍,如下 https://www.cnblogs.com/yanlong300/p/8986041.html 以下是我个人对这个协议的理解。 首先,CPU与缓存及内存及总线...
  • 缓存一致性4. MESI协议 1. CPU缓存 进行服务器端开发的时候,我们会想到添加redis或memcache缓存,来减轻数据库的压力。对于CPU来说,内存实在是太慢了,每次读取数据都要进行长时间的等待,浪费了CPU资源。引入CPU...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 460
精华内容 184
关键字:

缓存一致性mesi