cpu缓存
一级缓存:每刻cpu核心有两个一级缓存,分别是L1P(progame程序)和L1D(data数据),分别用作程序的缓存和数据的缓存
二级缓存:核心级别的缓存,每颗核心独占的缓存
三级缓存:cpu级别的缓存,cpu中各个核心共用的缓存
缓存结构图:
缓存读取顺序
首先,cpu需要数据会先去一级缓存里找,找不到就去二级缓存,在不找到就去三级缓存,三级缓存再没有的话,就通过内存读取。
缓存不一致性问题
因为是多核心CPU,所以现在出现一个问题,因为cpu不仅读数据,还会写数据。
如果L3中存在一个变量variableA,此时variableA的值是0,core1要对variableA进行计算,但是此期间core2对variableA进行了+1操作,这就会导致core1的计算结果不准确。
甚至如果variableA对core2没有用了,core2删除了variableA这个变量,但是core1需要这个变量,那么程序就会出错。
MESI协议就可以解决上面出现的问题。
MESI协议
首先看每个字母代表的意思:
- M(modifield)修改的:表示这个数据被某个核心修改了。
- E(exclusive)独占的:表示此数据被单个核心独占,其他cpu要用则拷贝一份。
- S(shared)共享的:表示这个数据是多个核心共享的。
- I(invalid)失效的:表示此数据不可用,如果要用,则创建或者去其他核心的缓存位置找。
缓存的作用:
核心中的缓存,不仅要知道自己核心的操作,还要监听其他核心的操作。
当core1需要变量variableA,variableA在不同状态下的情况:
- (modifield)修改:当核心缓存监听到其他核心修改了variableA,则variableA变成失效态。
- (exclusive)独占的:自己核心的缓存–>直接用;其他核心的缓存–>拷贝一份到自己核心的缓存再用。
- (shared)共享:多核心共用的,直接读写即可。
- (invalid)失效:variableA失效了,不可用。