精华内容
下载资源
问答
  • 首先看什么是缓存 cpu缓存 多核CPU存在三级缓存 一级缓存: 二级缓存:核心级别 ...MESI原则 首先看每个字母代表什么: M(modifield)修改的: E(exclusive)独占的: S(shared)共享的: I(invalid)失效的: ...

    cpu缓存

    一级缓存:每刻cpu核心有两个一级缓存,分别是L1P(progame程序)和L1D(data数据),分别用作程序的缓存和数据的缓存
    二级缓存:核心级别的缓存,每颗核心独占的缓存
    三级缓存:cpu级别的缓存,cpu中各个核心共用的缓存


    缓存结构图:
    在这里插入图片描述

    缓存读取顺序

    首先,cpu需要数据会先去一级缓存里找,找不到就去二级缓存,在不找到就去三级缓存,三级缓存再没有的话,就通过内存读取。

    缓存不一致性问题

    因为是多核心CPU,所以现在出现一个问题,因为cpu不仅读数据,还会写数据。
    如果L3中存在一个变量variableA,此时variableA的值是0,core1要对variableA进行计算,但是此期间core2对variableA进行了+1操作,这就会导致core1的计算结果不准确。
    甚至如果variableA对core2没有用了,core2删除了variableA这个变量,但是core1需要这个变量,那么程序就会出错。

    MESI协议就可以解决上面出现的问题。


    MESI协议

    首先看每个字母代表的意思:

    • M(modifield)修改的:表示这个数据被某个核心修改了。
    • E(exclusive)独占的:表示此数据被单个核心独占,其他cpu要用则拷贝一份。
    • S(shared)共享的:表示这个数据是多个核心共享的。
    • I(invalid)失效的:表示此数据不可用,如果要用,则创建或者去其他核心的缓存位置找。


    缓存的作用:

    核心中的缓存,不仅要知道自己核心的操作,还要监听其他核心的操作。


    当core1需要变量variableA,variableA在不同状态下的情况:

    • (modifield)修改:当核心缓存监听到其他核心修改了variableA,则variableA变成失效态。
    • (exclusive)独占的:自己核心的缓存–>直接用;其他核心的缓存–>拷贝一份到自己核心的缓存再用。
    • (shared)共享:多核心共用的,直接读写即可。
    • (invalid)失效:variableA失效了,不可用。
    展开全文
  • 简述缓存一致性 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的缓存一致性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并发编程的基础,跟着我一起来学习吧。下面是我在百度平台的百家号,关注送面试宝典哦
    在这里插入图片描述

    展开全文
  • 文章目录一、前言二、为何需要CPU Cache三、L1、L2 、L3 Cache 三级缓存结构四、Cache Line:与内存数据交换的最小单位五、MEIS:缓存一致性5.1 底层操作5.2 MESI 协议参考 一、前言 原打算重新学习一下 volatile 的...
  • 一 CPU以及缓存和高速缓存结构 1.1 CPU结构 我们知道CPU主要功能,一是控制,一是运算。主要包括寄存器、控制单元、运算单元和中断系统,主要架构如下: 控制单元:主要负责分析和解释指令 算数逻辑单元:也就是CPU...
  • 下图是最简单的高速缓存的配置 CPU和缓存以及主存都连在总线上高速缓存出现后不久,主存和高速缓存之间的速度差异越来越大,因此现在一些系统可能采用的二级缓存,甚至三级缓存,脑海有这个概念就行了。1、为什么需要CPU...
  • 多核CPU多级缓存一致性协议MESI 多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESIMESI协议缓存状态 MESI 是指4中状态的首字母。每个Cache line...
  • CPU缓存一致性协议MESI

    2021-10-01 09:45:16
    CPU缓存一致性协议MESI1、MESI1.1、什么是缓存一致性协议MESI1.2、MESI的缓存行1.3、volatile对MESI的应用2、MESI优化和他们引入的问题10、辅助知识10.1、当加上CPU时Java代码的执行过程10.2、总线锁10.3、缓存行伪...
  • 本节将介绍一下计算机的多级缓存(L1、L2、L3)架构、多级缓存与主存怎么进行数据交互的,另外会对MESI缓存一致性协议)做下介绍,为后面的JMM模型、volatile关键字的学习打下基础。 一,现代计算机硬件基本结构 ...
  • 最近用到了很多多线程的问题,发现对于并发的理论只是还有些欠缺,在学习的时候也会慢慢积累...缓存一致性 MESI 开始详细说一下cpu、内存、缓存之间的关系 如果只是读缓存的情况 如果考虑写缓存的情况 一致性...
  • 带你了解缓存一致性协议 MESI
  • 缓存一致性协议MESI,cpu cache

    万次阅读 2018-05-15 10:08:08
    不论是cpu中cache缓存还是项目开发中的缓存,缓存的好处是提高运行...缓存一致性协议(MESImesi 四种独占状态缩写,表示cpu中一个缓存行的四个状态 Modified (被修改,等待写回内存,已不可用【脏数据】) ...
  • 缓存一致性协议MESI

    2021-04-15 11:14:51
    缓存一致性协议发展背景: 现在的CPU基本都是多核CPU,服务器更是提供了多CPU的支持,而每个核心也都有自己独立的缓存,当多个核心同时操作多个线程对同一个数据进行更新时,如果核心2在核心1还未将更新的数据刷回...
  • 多核CPU多级缓存一致性协议MESI MESI协议缓存状态 MESI状态转换 多核缓存协同操作 单核读取 双核读取 修改数据 同步数据 缓存行伪共享 MESI优化和他们引入的问题 CPU切换状态阻塞解决-存储缓存(Store ...
  • 缓存一致性4. MESI协议 1. CPU缓存 进行服务器端开发的时候,我们会想到添加redis或memcache缓存,来减轻数据库的压力。对于CPU来说,内存实在是太慢了,每次读取数据都要进行长时间的等待,浪费了CPU资源。引入CPU...
  • 为什么产生有线程安全问题? CPU的高速缓存 线程是CPU最小的调度单元,当CPU去调度线程执行一些操作的时候,计算机的处理器需要与内存做交互的,比如...这就产生了缓存一致性问题。 以我们熟悉的i++举个例子,i...
  • MESI 协议解决了缓存一致性问题, 但是其自身也存在一个性能弱点——处理器执行写内存操作时,必须等待其他所有处理器将其高速缓存中的相应副本数据删除并接收到这些处理器所回复的 Invalidate Acknowledge/Read ...
  • 缓存一致性MESI

    千次阅读 2018-05-31 17:24:00
    所以就出现了缓存一致性协议。最出名的就是Intel 的MESI协议,MESI协议保证了每个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的...
  • 缓存一致性协议:MESI

    2020-10-22 18:41:47
    目录缓存一致性问题缓存一致性协议四种状态缓存一致性协议(MESI)流程缓存一致性协议失效总线风暴问题 缓存一致性问题 在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存 (MainMemory)。...
  • CPU缓存一致性协议MESI - 笔记

    万次阅读 2020-04-08 19:49:19
    CPU缓存一致性协议MESI CPU高速缓存(Cache Memory) CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其...
  • MESI协议 在MP系统中,每个CPU都有自己独立的cache,缓存之间的一致性很很容易受到破坏的,所以缓存一致性协议就应运而生了。MESI是一种使用非常广泛的缓存一致性协议。 MESI存在”modified”,”exclusive”,”...
  • 文章目录引语读策略简单介绍写策略写命中(Hit)write-through(直写/写穿透)write-back(写回)写不命中(Miss)write-allocate(写分配)no-write-allocate(非写分配)缓存一致性MESI例子读取数据写入数据后记 ...
  • 传送门:CPU缓存一致性协议MESI 1.首先cpu的处理速度已经远大于I/O的速度,所以需要对cpu增加高速缓存,以减少对内存的依赖,但是这会导致各个cpu中的高速缓存数据不一致 2.为了解决不一致的状态,我们就规定了MESI...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,893
精华内容 2,757
关键字:

缓存一致性mesi