总线锁、缓存锁、MESI

总线锁、缓存锁、MESI随着多核时代的到来 并发操作已经成了很正常的现象 操作系统必须要有一些机制和原语 以保证某些基本操作的原子性 比如处理器需要保证读一个字节或写一个字节是原子的 那么它是如何实现的呢 有两种机制 总线锁定和缓存一致性 我们知道 CPU 和物理内存之间的通信速度远慢于 CPU 的处理速度 所以 CPU 有自己的内部缓存 根据一些规则将内存中的数据读取到内部缓存中来 以加快频繁读取

       随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性,比如处理器需要保证读一个字节或写一个字节是原子的,那么它是如何实现的呢?有两种机制:总线锁定和缓存一致性

       我们知道,CPU和物理内存之间的通信速度远慢于CPU的处理速度,所以CPU有自己的内部缓存,根据一些规则将内存中的数据读取到内部缓存中来,以加快频繁读取的速度。我们假设在一台PC上只有一个CPU和一份内部缓存,那么所有进程和线程看到的数都是缓存里的数,不会存在问题;但现在服务器通常是多 CPU,更普遍的是,每块CPU里有多个内核,而每个内核都维护了自己的缓存,那么这时候多线程并发就会存在缓存不一致性,这会导致严重问题。

       以 i++为例,i的初始值是0.那么在开始每块缓存都存储了i的值0,当第一块内核做i++的时候,其缓存中的值变成了1,即使马上回写到主内存,那么在回写之后第二块内核缓存中的i值依然是0,其执行i++,回写到内存就会覆盖第一块内核的操作,使得最终的结果是1,而不是预期中的2.

       那么怎么解决整个问题呢?操作系统提供了总线锁定的机制。前端总线(也叫CPU总线)是所有CPU与芯片组连接的主干道,负责CPU与外界所有部件的通信,包括高速缓存、内存、北桥,其控制总线向各个部件发送控制信号、通过地址总线发送地址信号指定其要访问的部件、通过数据总线双向传输。在CPU1要做 i++操作的时候,其在总线上发出一个LOCK#信号,其他处理器就不能操作缓存了该共享变量内存地址的缓存,也就是阻塞了其他CPU,使该处理器可以独享此共享内存。

        但我们只需要对此共享变量的操作是原子就可以了,而总线锁定把CPU和内存的通信给锁住了,使得在锁定期间,其他处理器不能操作其他内存地址的数据,从而开销较大,所以后来的CPU都提供了缓存一致性机制,Intel的奔腾486之后就提供了这种优化。

缓存一致性缓存一致性机制就整体来说,是当某块CPU对缓存中的数据进行操作了之后,就通知其他CPU放弃储存在它们内部的缓存,或者从主内存中重新读取,用MESI阐述原理如下:

MESI协议是以缓存行(缓存的基本数据单位,在Intel的CPU上一般是64字节)的几个状态来命名的(全名是Modified、Exclusive、 Share or Invalid)。该协议要求在每个缓存行上维护两个状态位,使得每个数据单位可能处于M、E、S和I这四种状态之一,各种状态含义如下:

       M:被修改的。处于这一状态的数据,只在本CPU中有缓存数据,而其他CPU中没有。同时其状态相对于内存中的值来说,是已经被修改的,且没有更新到内存中。
        E:独占的。处于这一状态的数据,只有在本CPU中有缓存,且其数据没有修改,即与内存中一致。
        S:共享的。处于这一状态的数据在多个CPU中都有缓存,且与内存一致。
        I:无效的。本CPU中的这份缓存已经无效。


       当CPU需要读取数据时,如果其缓存行的状态是I的,则需要从内存中读取,并把自己状态变成S,如果不是I,则可以直接读取缓存中的值,但在此之前,必须要等待其他CPU的监听结果,如其他CPU也有该数据的缓存且状态是M,则需要等待其把缓存更新到内存之后,再读取。

       当CPU需要写数据时,只有在其缓存行是M或者E的时候才能执行,否则需要发出特殊的RFO指令(Read Or Ownership,这是一种总线事务),通知其他CPU置缓存无效(I),这种情况下性能开销是相对较大的。在写入完成后,修改其缓存状态为M。

       所以如果一个变量在某段时间只被一个线程频繁地修改,则使用其内部缓存就完全可以办到,不涉及到总线事务,如果缓存一会被这个CPU独占、一会被那个CPU 独占,这时才会不断产生RFO指令影响到并发性能。这里说的缓存频繁被独占并不是指线程越多越容易触发,而是这里的CPU协调机制,这有点类似于有时多线程并不一定提高效率,原因是线程挂起、调度的开销比执行任务的开销还要大,这里的多CPU也是一样,如果在CPU间调度不合理,也会形成RFO指令的开销比任务开销还要大。当然,这不是编程者需要考虑的事,操作系统会有相应的内存地址的相关判断

       并非所有情况都会使用缓存一致性的,如被操作的数据不能被缓存在CPU内部或操作数据跨越多个缓存行(状态无法标识),则处理器会调用总线锁定;另外当CPU不支持缓存锁定时,自然也只能用总线锁定了,比如说奔腾486以及更老的CPU。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207891.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午12:51
下一篇 2026年3月19日 下午12:51


相关推荐

  • Oracle Instanc Client安装命令工具

    Oracle Instanc Client安装命令工具

    2022年1月2日
    48
  • 以智能卡平台为硬件的嵌入式加密IC的优势

    以智能卡平台为硬件的嵌入式加密IC的优势目前嵌入式加密领域内,加密IC成为了不可或缺的保护利器,可以保护mcu中的程序,免于被激活成功教程的危险。当然,你必须选择真正有效的加密芯片,才可以起到防止抄板的作用。MCU可以有多种,例如51单片机、ARM 、AVR 、DSP等,主要都是为了实现强大的处理功能,对自身的保密防护虽然都有处理,但是不足以做到有效防护。从目前嵌入式解密芯片来看,基本上都是可以激活成功教程的。所以,嵌入式加密IC,在中国这个特定的环境

    2022年6月25日
    28
  • Activity有四种加载模式(转)

    Activity有四种加载模式(转)

    2021年9月10日
    44
  • Java的System.getProperty详解

    Java的System.getProperty详解packagejavax org lang Date 2013 6 18 Author jilongliang Description System getProperty 详解 SuppressWarn all publicclassS publicstatic

    2026年3月17日
    1
  • pandas外连接

    pandas外连接dd pd merge df df2 how outer 外连接是两个表连接的一种方式 给人的印象是外连接的话 连接后的表会变大 he 上面是表 1 下面是表 2he 这两个表有

    2026年3月26日
    1
  • 孟小峰:大数据管理与数据思维

    孟小峰:大数据管理与数据思维孟小峰:大数据管理与数据思维大数据的规模效应给数据存储、管理以及数据分析带来了极大的挑战,数据管理方式上的变革正在酝酿和发生。本文对大数据的基本概念进行剖析,归纳大数据时代所面临的新挑战,并对大数据的主要应用做简单对比。在此基础上,阐述大数据处理的基本框架,并就云计算技术对于大数据时代数据管理所产生的作用进阅读全文和小伙伴们一起来吐槽

    2022年6月7日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号