缓存一致性协议(MESI)

MESI

      • cpu执行计算的流程
      • 发展背景
      • MESI协议
      • MESI的执行原理

cpu执行计算的流程

在目前主流的计算机中,cpu执行计算的主要流程如图所示:
缓存一致性协议(MESI)_第1张图片
数据加载流程如下:

  1. 程序和数据从硬盘加载到内存中
  2. 再从内存加载到缓存中(目前大多是三级缓存,数据加载:L3->L2->L1)
  3. 然后再将缓存中的数据加载到寄存器中,并进行运算
  4. 最后将数据刷新回缓存,并在一定的时间周期之后刷新回内存

发展背景

现在的CPU基本都是多核CPU,服务器更是提供了多核CPU的支持,而每个核也都有自己独立的缓存,当多个核同时操作多个线程对同一个数据进行更新时,如果核2在核1还未将更新的数据刷回内存之前读取了数据,并进行操作,就会造成程序的执行结果造成随机性的影响,这对于我们来说是无法容忍的。

总线加锁是对整个内存进行加锁,在一个核对一个数据进行修改的过程中,其他的核无法修改内存中的数据,这会导致CPU处理性能严重下降。

缓存一致性协议提供了一种高效的内存数据管理方案,它只会对单个缓存行(缓存行是缓存中数据存储的基本单元)的数据进行加锁,不会影响到内存中其他数据的读写。

MESI协议

缓存一致性协议有MSI,MESI,MOSI,Synapse,Firefly及DragonProtocol等。

其中MESI分别代表缓存行数据所处的四种状态,通过这四种状态的切换,来管理缓存数据。

  • M修改(Modefiy):该缓存行有效, 数据被修改了,和内存中的数据不一样,数据只存在于本缓存行中
  • E独享(Exclusive):该缓存行有效,数据和内存中的数据一致,数据只存在本缓存行中
  • S共享(Shared):该缓存行有效,数据和内存中的数据一致,数据同时存在于其他缓存中
  • I无效(Invalid):该缓存行数据无效

MESI的执行原理

当一个处理器请求使用exclusive模式加载load一个缓存行时,其他的处理器会将所有它们自己关于该缓存行的副本都置为invalid。任何一个已修改过自己本地的该对应缓存行的处理器都需要首先将其写回到内存中,之后第一个处理器的load请求才可以被满足。

当一个处理器请求使用shared模式加载load一个缓存行时,任何一个以exclusive模式加载该line的处理器都必须将其状态置为shared,并且任何一个已经修改过自己本地对应缓存行的处理器都必须将该line写回主内存,之后第一个处理器的load请求才可以被满足。

如果缓存满了,则可能需要驱逐一个缓存行。如果该line是shared或exclusive状态,那么它可以直接简单的被丢弃。但是如果该line被修改过,那么它必须被首先写回内存之后再丢弃。

MESI协议只能保证并发编程中的可见性,并未解决原子性和有序性的问题,所以只靠MESI协议是无法完全解决多线程中的所有问题。

你可能感兴趣的:(并发编程,缓存,MESI,缓存一致性协议)