解决cpu多级缓存模型下的数据不一致性问题

[TOC]

1 回顾

通过上文 cpu多级缓存模型及存在问题 ,对 cpu 的结构和对应的多级缓存模型进行了介绍。

同时留下了一个问题,就是当多个 cpu 对同一数据进行操作时,由于数据没有从缓存刷回内存,导致计算后的数据不一致了。

cpu多级缓存模型存在的问题

2 mesi 缓存一致性协议

固本培元,我们思考问题的根本原因:发生数据不一致性的原因,就是另外的 cpu 没有办法及时感知到数据被改动了,没办法进行及时的数据更新

那么,有没有什么办法,在一个 cpu 进行数据修改时,及时感知到改动后的值并进行修改呢?

有的,mesi 缓存一致性协议就是用来解决数据不一致性问题的。

mesi协议要求:要求只要cpu改了本地的缓存,便立即将修改后的结果强制刷新会回主内存

3 实现数据一致

mesi 缓存一致性协议 是结合cpu嗅探技术来实现数据一致性的。

所谓的 cpu嗅探技术:嗅探嗅探,就是跟监听差不多嘛;一个cpu如果嗅探到其他cpu对某个变量做了修改,便将本地缓存中的数据给过期掉;那么,当该cpu读取本地缓存数据的时候,发现过期了,就会从主内存中取新的数据到缓存中。

如图,我们对int i = 0 进行计算,cpu1、cpu2都对 i 执行累加操作

1、首先cpu1、cpu2从内存读取数据到自己的缓存中此时,cpu1、cpu2中的i = 0

2、cpu1进行计算,并将结果放到缓存中,由于mesi协议,将修改过后的值强制刷回内存 此时,内存的值为1

3、cpu2 嗅探到值发生了改变,于是进行值过期 cpu2中的i过期掉,并且重新从内存中读取值

4、cpu2此时缓存中的值为 i = 1

总结

1、首先我们知道因为多个cpu同时对同一数据进行计算时,容易导致数据不一致性的问题。

2、解决这个问题需要保证:当一个cpu进行数据修改时,强制将修改后的数据刷回内存。同时其他cpu能够嗅探到数据发生了改变并进行过期掉,重新从内存中读取值。

这就是通过 mesi 缓存一致性协议和cpu嗅探技术,实现数据一致性。

最后,欢迎大家关注我的个人公众号(白话编程),一起学习、一起进步!