缓存一致性协议

缓存一致性协议

  1. 为何须要缓存一致性协议

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

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

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

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

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

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

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

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

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

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

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

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