刚学完MESI协议,把自己的理解记录一下,方便以后复习。
我总结的有点乱,看这位大牛写得,讲的特别清楚:
传送门:CPU缓存一致性协议MESI
1.首先cpu的处理速度已经远大于I/O的速度,所以需要对cpu增加高速缓存,以减少对内存的依赖,但是这会导致各个cpu中的高速缓存数据不一致
2.为了解决不一致的状态,我们就规定了MESI协议,已解决各个CPU中的高速缓存数据不一致的问题。
3.MESI协议其实就是对高速缓存中的数据规定了四种状态,某一个缓存通过对同一个地址的数据进行本地读写、远程读写的时候通过各个高速缓存对该变量的状态进行更变以保证数据一致
4.但是这种状态更换是需要时间的,而且cpu对该缓存中的变量进行改变状态时需要等待其他cpu中的高速缓存进行应答,这种等待是一种阻塞的状态,其等待时间远远大于对数据进行修改的时间,导致cpu性能大幅度降低。
5.为了解决这种阻塞的情况,我们引入了写缓存器,如果一个cpu对该高速缓存的变量进行修改时,会将该变量写入写缓存器中,然后让写缓存器来等待其他的高速缓存的应答,这时候cpu就可以去处理其他的指令。
6.但是这种处理有一个最大的问题就是写处理器不会保证他什么时候完成,这就引发了一种情况"内存重排",就像对一个cpu发出了指令1、指令2,但是其他的cpu可能看到这个cpu处理的顺序是指令2、指令1,(一个数据实在独享状态,一个数据是再无效状态,cpu1中先执行无效状态的数据再执行独享状态的数据,但是独享状态的数据可能先执行完,而cpub中是先读取cpua中E状态的数据再读取I状态的数据,但是这是后I状态的数据其实再cpuA中的写缓存器中还没有执行完,导致了数据不一致的情况)
7.这时候为了解决这种情况,又对每个cpu增加了一个时效队列,以及引入了内存屏障的概念,写屏障:对一个数据进行写入之后要求cpu先处理完写缓存器中的指令,读屏障:要求对一个数据进行读取的时候先执行完时效队列中的所有指令