zoukankan      html  css  js  c++  java
  • 缓存一致性协议

    缓存一致性协议

    1. 为什么需要缓存一致性协议

      多个线程并发访问一个共享变量时,这些线程的执行处理器上的高速缓存各自都会保留一份共享变量的副本,这带来一个问题,一个处理器对共享变量进行修改,其他处理器如何察觉到该更新并做出适当反应,以确保后续处理器读取到这个共享变量时可以读取到这个更新.这就是缓存一致性问题,其本质就是防止读脏数据和读取到更新的数据

    1. 什么是缓存一致性协议

      MESI(Modified-Exclusive-Shared-Invalid)协议是一种广为使用的缓存一致性协议,类似读写锁 对于同一地址的读内存操作是并发的,针对同一地址的写操作是独占的,同一内存地址写操作同一时间只能由一个处理器来执行.

      为了保持数据的一致性,MESI将缓存条目的状态划分为Modified.Exclusive,Shared,Invalid

      MESI协议中一个缓存条目的状态Flag值分为以下4种

        1. Invalid(无效的,记为I) 相应缓存行中不包含任何内存地址对应的有效副本数据,是缓存条目的初始状态

        2. Shared(共享的,记为S)缓存行中包含相应内存地址数据的副本,其他处理器高速缓存中也可能包含相应地址内存的副本,缓存行中的数据与内存的一致

        3. Exclusive(独占的,记为E)缓存行独占相应内存地址数据的副本,其他处理器高速缓存不包含相同的副本或者副本失效,缓存行中的数据与主内存数据一致

        4. Modified(更改过,记为M)相应缓存行包含更新后的数据,其他处理器相同tag的缓存行只有唯一的M状态,与主内存的数据不一致

      MESI定义了一组message用于协调各个处理器的读写内存操作,处理器在执行内存的读写操作时,在必要的情况下会往bus中发送特定的请求消息,每个处理器拦截这些消息,在一定情况下往bus回复消息

        1. Read 通知其他处理器和主内存 准备读取某个内存地址的消息

        2. Read Response 返回被read请求读取的消息,可能是处理器返回的也可能是内存返回的

        3. Invalidate 通知其他处理器删除高速缓存中对应tag的数据副本

        4. Invalidate Acknowledge 回复已经删除了高速缓存上相应tag的副本

        5.Read Invalidate 通知其他处理器 准备更新一个数据,请求其他处理器删除其高速缓存中的数据副本,收到消息的处理器必须回复read Response,Invalidate Acknowledge

        6. Writeback 消息包含需要写入内存的数据和内存地址

    1. 缓存一致性协议能做什么

      对读操作的实现

      processor0会根据A的内存地址在高速缓存找到对应的缓存条目,如果缓存的flag为M E 或是S,那么处理器可以直接从缓存条目中拿取数据,不向总线发送消息,如果flag为I说明条目无效或者没有,需要向总线中发送read消息,其他处理器或者内存需要回复read response,processor0接收到read response消息会更新自己的缓存条目状态设置为S

      其他处理器高速缓存中的缓存条目如果不为I才回复消息,注意回复的是缓存行整块数据,如果flag为M会发message之前先往内存中写,然后flag的状态改为S,如果flag状态为I,read Response消息来自内存

      对写操作的实现

      processor0在往地址A写数据的时候,必须先拥有该数据的所有权,如果processor0高速缓存地址A的缓存条目flag为E 或 M,说明已经获取了所有权,可以直接将数据写入缓存行,flag为M,如果不为M E 则需要往消息总线发送Invalidate消息,接收到其他所有处理器回复的invalidate acknowledge消息后才获得了数据的所有权,才能更新数据到缓存行中

      processor0找到的缓存条目如果为S,需要往总线中发送invalidate消息,等收到其他所有处理器返回的invalidate acknowledge时将缓存条目设置为E,此时获得所有权,然后将数据写入缓存行,flag设为M

      processor0找到的缓存条目如果为I,需要往总线发送read invalidate,等接受到read response和其他所有处理器的invalidate acknowledge之后将相应缓存条目的状态改为E,代表已经获得相应数据的所有权,写入数据flag改为M

      mesi能保证多线程对共享变量的可见性,可见性问题就要从写缓冲器和无效化队列的角度来解释了

  • 相关阅读:
    boost编译中的细节问题
    geos编译问题
    安装pytorch的细节记录
    Qt学习-模仿Qt实现一个colorbutton
    BOOST内存管理-intrusive_ptr
    GEOS使用记录
    matlab添加永久路径
    关于浮点数的取值范围以及精度的问题
    vs2010中使用命令行参数
    sprintf fprintf EOF scanf 的返回值 深拷贝与浅拷贝
  • 原文地址:https://www.cnblogs.com/isnotnull/p/13849195.html
Copyright © 2011-2022 走看看