zoukankan      html  css  js  c++  java
  • 并发基础知识

    CPU多级缓存

        

     

    缓存一致性(MESI)

        Cache的四种数据状态M(被修改)E(独享)S(共享)I(无效)

        M:与主存的数据不一致,在将来的某一个时间内需要写进主存,这个动作要在CPU读取内存之前完成,当这个数据放回主存后,就会进入E状态

        E:只被自己的CPU访问,当其他CPU访问时,变成S状态,当CPU修改它时变成M状态

        S:该缓存行被多个CPU缓存,缓存数据与主存数据一致,当有一个CPU修改缓存行时,对于其他CPU对该缓存变成I状态

        I:当其他CPU修改该缓存行,变成无效转态

     

        四种操作:

        Local read 读本地缓存数据

        Local write 将数据写到本地缓存

        Remote read 读取内存数据

        Remote write将数据写入内存

        每个核都有自己的缓存,来共享主存总线,每个相应的CPU会发送读写请求,而缓存的目的减少CPU读写共享主存的次数,一个缓存除了在I(无效)状态,都可满足CPU的读请求,如图,绿色的local read,除了I状态,其他状态都形成环,说明可以读取。

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

    一个缓存除在Invalid状态外都可以满足cpu的读请求,一个Invalid的缓存行必须从主存中读取(变成S或者 E状态)来满足该CPU的读请求。

    一个写请求只有在该缓存行是M或者E状态时才能被执行,如果缓存行处于S状态,必须先将其它缓存中该缓存行变成Invalid状态(也既是不允许不同CPU同时修改同一缓存行,即使修改该缓存行中不同位置的数据也不允许)。该操作经常作用广播的方式来完成,例如:RequestFor Ownership (RFO)。

    缓存可以随时将一个非M状态的缓存行作废,或者变成Invalid状态,而一个M状态的缓存行必须先被写回主存。

    一个处于M状态的缓存行必须时刻监听所有试图读该缓存行相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S状态之前被延迟执行。

    一个处于S状态的缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid)。

    一个处于E状态的缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S状态。

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

    从上面的意义看来E状态是一种投机性的优化:如果一个CPU想修改一个处于S状态的缓存行,总线事务需要将所有该缓存行的copy变成Invalid状态,而修改E状态的缓存不需要使用总线事务。

    原博文地址:

    https://www.cnblogs.com/shangxiaofei/p/5688296.html

  • 相关阅读:
    QFramework 使用指南 2020(二):下载与版本介绍
    QFramework 使用指南 2020 (一): 概述
    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践
    Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
    Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform
    Unity 游戏框架搭建 2017 (二十二) 简易引用计数器
    Unity 游戏框架搭建 2017 (二十一) 使用对象池时的一些细节
    你确定你会写 Dockerfile 吗?
    小白学 Python 爬虫(8):网页基础
    老司机大型车祸现场
  • 原文地址:https://www.cnblogs.com/figsprite/p/10779165.html
Copyright © 2011-2022 走看看