0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍下cpu缓存一致性(MESI协议)

冬至子 来源:并发编程之美 作者:妙啊 2023-06-09 16:01 次阅读

介绍

之前介绍了java并发包的cas原理和java内存模型,这篇我们介绍下cpu缓存一致性原理,可以帮助我们更好的理解cas的底层原理。

一、cpu多级缓存结构

图片

  • 计算机在寄存器上执行的速度是远大于在主内存上执行的速度。

  • 由于计算机的存储设备与处理器的运算速度之间存在几个数量级的差距,所以新的计算机系统都不得不加入一层读写速度都尽可能接近处理器运算速度的高级缓存来作为内存与处理器之间的缓冲,将运算使用到的数据复制到缓存中,让运算快速执行,当运算结束后,再将数据从缓存同步到内存中,这样处理器就无需等待缓慢的内存读写了。

  • 一个计算机还包含一个主存,所有的cpu都可以访问这个主存,主存通常比CPU中的缓存大得多。

  • 多核cpu运作原理:

    通常情况下,当一个CPU需要读取主存的时候,它会将主存的数据读取到CPU缓存中,甚至会将缓存中的部分内容读到它内部的寄存器里面,然后在寄存器中执行操作;当CPU需要将结果回写到主存的时候,它会将内部寄存器的值刷新到缓存中,然后在某个时间点将值刷新回主存。

二、MESI协议

图片

四种状态:

  • M:Modified(被修改)

    指的是该缓存行只被缓存在该CPU的缓存中,并且是被修改过的,因此它与主存中的数据是不一致的,该缓存行的内存需要在未来的某个时间点写回主存,这个时间点我们是允许其他CPU读取主存中相应的内存之前,当这里的值被写回主存之后,该缓存行的状态变成E。

  • E:Exclusive(独享)

    独享状态的缓存行只被缓存在该CPU的缓存中,它是未被修改过的,是与主存中的数据一致的,这个状态可以在任何时刻,当有其他CPU读取该内存时变成S。同样的,当COU修改该缓存行的数据时,该状态可以变成M。

  • S:Shared(共享)

    共享状态意味着,该缓存行可能被多个CPU进行缓存,并且各个缓存中的数据与主存中的数据是一致的,当有一个CPU修改该缓存行的时候,其他CPU中该缓存行是可以被作废的,变成I。

  • I:Invalid(无效的)

    无效状态代表这个缓存是无效的,可能是有其他CPU修改了该缓存行。

CPU的cache的四种操作可能产生不一致的状态,因此缓存控制器监听到本地操作和远程操作的时候,需要对地址一定的cache line做出一定的修改,从而保证数据在多个缓存之间的一致性。

四种操作:

  • local read

    代表的是读本地缓存行中的数据。

  • local write

    代表的是将数据写入到本地的缓存里面。

  • remote read

    代表的是将内存中的数据读取到本地。

  • remote write

    代表的是将数据写回到主存中。

三、MESI工作原理

在一个典型的多核系统中,每一个核都会有自己的缓存来共享主存总线,每一个相应的CPU都会发出读写请求,而缓存的目的是为了减少CPU读写共享主存的次数。

  • 一个缓存除了在Invalid状态之外,都可以满足CPU的读请求;
  • 一个写请求,只有在该缓存行是M状态或者E状态,才能被执行,如果当前状态是处于S状态,它必须先将这个缓存中的该缓存行变成无效的状态,这个操作一般采取广播的方式来完成,这个时候,它不允许不同的CPU同时修改同一个缓存行,主要是为了解决缓存一致性的问题;
  • 一个处于M状态的缓存行,它必须时刻监听所有试图读该缓存行的操作,这种操作必须将缓存写回到主内存,并将状态修改为S之前被延迟执行;
  • 一个处于S状态的缓存行,也必须监听其他缓存只被缓存行无效,或者独享该缓存行的请求,并将缓存行变成无效;
  • 而一个处于E状态的缓存行,它要监听其他缓存读缓存中该缓存行的操作,一旦有该缓存行的操作,它需要将E状态修改为S状态;

因此对于M和E,它的数据总是精确的,而S状态可能是非一致的,如果一个缓存将处于S状态的缓存行作废了,另一个缓存实际上可能已经独享了该缓存行,但是该缓存却不会将缓存行变更为E状态,这是因为其他缓存不会广播他们作废掉该缓存行的通知,同样,由于缓存并没有保存该缓存行的topic数量,因此也没有办法确认自己是否已经独享了该缓存行。

如果一个CPU想修改处于S状态的缓存行,总线事务需要将所有该缓存行topic的值变成Invalid状态才可以,而修改E状态的缓存不需要使用总线事务。

四、MESI在并发包中的应用

在cas原理分析中,我们讲到cas底层原理使用到了总线锁和缓存锁,其中缓存锁涉及到的就是MESI协议,缓存锁加锁条件就是缓存行处于M和E状态下。

下面结合volatile保证内存可见性为例,阐释下MESI的工作原理。代码示例:

public class VolatileCanSeeTest {


    private static boolean initFlag = false;


    public static void main(String[] args) throws InterruptedException {
        new Thread(() - > {
            log.info("init begin");
            while(!initFlag) {
            }


            // if(!initFlag) {while(true){}} // JIT
            log.info("===success===");
        }).start();


        Thread.sleep(1000);


        new Thread(() - > doSomething()).start();
    }


    public static void doSomething() {
        log.info("doSomething begin");
        initFlag = true;
        log.info("doSomething end");
    }
}

图片

  • 初始化共享变量initFlag = false。
  • 线程1通过read指令从主内存中读取出共享变量initFlag = false,通过load指令加载到线程1的工作内存中。
  • 在线程1的工作内存中,通过use指令将共享变量initFlag = false加载到cpu执行引擎进行!initFlag运算。
  • 在线程1的工作内存中,通过assign指令将cpu执行引擎计算后的共享变量initFlag = true赋值到线程1的工作内存中。
  • 线程1通过store指令将线程1中工作内存的共享变量同步到主内存中。
  • 在线程1通过store指令将线程1中工作内存的共享变量同步到主内存中的过程中,会经过总线,触发cpu缓存一致性协议。
  • 该协议会监听回写主内存的变量,然后将其他工作内存中含有该共享变量的缓存行状态置为失效状态,所以其他线程需要重新从主内存读取该共享变量的最新值。
  • 以上我们分析了MESI协议中关于S共享状态转为I失效状态的工作原理。

结语

上一篇我们分析了java内存模型的原理,这篇总结下cas涉及到的cpu缓存一致性协议,通过这两篇的介绍,我们就可以更深刻的理解cas是怎么保证原子性的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19259

    浏览量

    229655
  • 控制器
    +关注

    关注

    112

    文章

    16333

    浏览量

    177813
  • 寄存器
    +关注

    关注

    31

    文章

    5336

    浏览量

    120232
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27529
  • JAVA语言
    +关注

    关注

    0

    文章

    138

    浏览量

    20090
收藏 人收藏

    评论

    相关推荐

    如何解决数据库与缓存一致性

    缓存一致性 每次逢年过节的时候抢票非常艰难,放票的时候那么多人同时去抢票,如果所有人查询、购票等都去访问数据库,那数据库的压力得有多大,这时候很多都会引入缓存, 把车票信息放入缓存,这
    的头像 发表于 09-25 15:25 1100次阅读
    如何解决数据库与<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>

    小编科普CPU缓存一致性协议MESI

    什么是缓存一致性协议MESIMESI协议中的状态有哪几种?
    发表于 06-17 10:00

    请教大神在Arm AMBA协议集中,什么叫缓存一致性

    请教大神在Arm AMBA协议集中,什么叫缓存一致性
    发表于 09-29 14:51

    改进的基于目录的Cache一致性协议

    介绍几种典型目录一致性协议并分析它们的优缺点。在综合全映射目录和有限目录优点的基础上,通过在存储器层上增加个存储器高速缓存(Cache)层
    发表于 04-02 09:05 32次下载

    CMP中Cache一致性协议的验证

    CMP是处理器体系结构发展的个重要方向,其中Cache一致性问题的验证是CMP设计中的项重要课题。基于MESI一致性
    发表于 07-20 14:18 38次下载

    DMR空中接口协议一致性测试技术

    文章介绍了DMR的产生、发展以及DRM协议体系结构。基于协议一致性测试的基本概念,划分了DRM协议一致性
    发表于 12-22 15:13 35次下载
    DMR空中接口<b class='flag-5'>协议</b><b class='flag-5'>一致性</b>测试技术

    RFID协议一致性测试系统设计(三)

      在具体实现了RFID协议一致性测试系统之后,我们将可以应用于对RFID单元的实际测试之中,本节以EPC UHF Class 1 Gen 2(也被称为ISO 18000-6 Type C)标准的协议
    发表于 03-28 17:37 1294次阅读
    RFID<b class='flag-5'>协议</b><b class='flag-5'>一致性</b>测试系统设计(三)

    Cache一致性协议优化研究

    问题的由来.总结了多核时代高速缓存一致性协议设计的关键问题,综述了近年来学术界对一致性的研究.从程序访存行为模式、目录组织结构、一致性粒度、
    发表于 12-30 15:04 0次下载
    Cache<b class='flag-5'>一致性</b><b class='flag-5'>协议</b>优化研究

    自主驾驶系统将使用缓存一致性互连IP和非一致性互连IP

    代ASIL B(D)自主驾驶系统将使用符合ISO 26262标准的缓存一致性互连IP和非一致性互连IP来实现。 美国加利福尼亚州坎贝尔2019年4月26日消息—Arteris IP
    的头像 发表于 05-09 17:13 3221次阅读

    管理基于Cortex®-M7的MCU的高速缓存一致性

    本文档概述了不同场景的高速缓存一致性问题,并就如何管理或避免高速缓存一致性问题提供了些方法建
    发表于 04-01 10:12 5次下载
    管理基于Cortex®-M7的MCU的高速<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>

    CPU缓存一致性协议MESI详解

    CPU在摩尔定律的指导以每18个月翻番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CP
    的头像 发表于 05-12 17:36 4355次阅读
    <b class='flag-5'>CPU</b><b class='flag-5'>缓存</b><b class='flag-5'>一致性</b><b class='flag-5'>协议</b><b class='flag-5'>MESI</b>详解

    CPU缓存一致性协议MESI介绍

    CPU在摩尔定律的指导以每18个月翻番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。
    的头像 发表于 06-09 10:39 898次阅读
    <b class='flag-5'>CPU</b><b class='flag-5'>缓存</b><b class='flag-5'>一致性</b><b class='flag-5'>协议</b><b class='flag-5'>MESI</b><b class='flag-5'>介绍</b>

    CPU缓存一致性协议解析

    CPU运行效率高不高,定程度取决于缓存,这里就给大家分享一下CPU缓存相关的内容。
    的头像 发表于 07-12 10:07 814次阅读
    <b class='flag-5'>CPU</b><b class='flag-5'>缓存</b><b class='flag-5'>一致性</b><b class='flag-5'>协议</b>解析

    如何保证缓存一致性

    “ 本文的参考文章是2022年HOT 34上Intel Rob Blakenship关于CXL缓存一致性介绍。”
    的头像 发表于 10-19 17:42 1090次阅读
    如何保证<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>

    异构计算下缓存一致性的重要

    在众多回复中,李博杰同学的回答被认为质量最高。他首先将缓存一致性分为两个主要场景:是主机内CPU与设备间的一致性;二是跨主机的
    的头像 发表于 10-24 17:00 507次阅读
    异构计算下<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>的重要<b class='flag-5'>性</b>