写缓冲器与无效化队列

写缓冲器与无效化队列


为什么需要写缓冲器和无效化队列

MESI解决了数据一致性问题,但是性能有了瓶颈,处理器在写内存操作时,必须要等到接收到其他处理器的invalidate acknowledge/read response之后才能将数据写入高速缓存,为了避免这种情况,设计时引入了写缓冲器(store buffer/write buffer)

写缓冲器的特点

  1. 大小等于一级缓存的缓存行宽度
  2. 一个处理器不能读取另一个处理器的store buffer
    storebuffer invalidate queue

处理器在执行写操作时
如果相应的缓存条目为M或E处理器直接将数据写入缓存行,
如果为S会先将数据存入store buffer并发送invalidate消息,
如果为I相应的写未命中(write miss)处理器将数据存入store buffer并发送read invalidate,
如果其他处理器的高速缓存都没有存这个数据,那么只能从主内存读取数据,因此写未命中(write miss)的开销比较大

处理器将数据写入store buffer之后就认为写操作已完成,不等待其他处理器返回invalidate acknowledge/read response 继续执行其他指令,处理器接收到其他处理器返回的invalidate acknowledge消息的时候会将写缓冲器对应的条目写入缓存行中,不用等待回复消息提高了处理器的执行效率

引入无效化队列(invalidate Queue)
处理器接收到invalidate消息后不删除消息而是将消息存入invalidate queue之后就回复invalidate acknowledge减少写操作执行处理器的等待时间(并不是所有的处理器都有invalidate queue)

写缓冲器和无效队列带来了新的问题---内存重排序和可见性问题

原文地址:https://www.cnblogs.com/isnotnull/p/13849494.html