由于CPU和内存的速度差异太大,如果CPU直接访问内存会大大降低CPU的吞吐量,为了解决这个问题,在CPU内部加入了三级缓存L1、L2、L3,其中L1、L2是每个CPU独有的,L3是所有CPU共享的。
CPU读取数据时先从系统内存加载到缓存中,再从缓存中加载到寄存器进行运算,写数据流程相反。
研究表明,CPU读取一个数据后往往会读取附近的数据,因此,为了提高CPU缓存的命中率,CPU缓存的最小单位是缓存行而不是字节(现在的处理器缓存行大小大多是64字节)。
(具体介绍可阅读文末参考资料)
volatile修饰的共享变量在进行写操作时会添加一条Lock前缀指令,该指令会触发两个操作
假设系统内存中有一个共享变量a=0,CPU1和CPU2分别缓存了该变量,CPU1在本地缓存中把a修改为1,然后写回主存(上面的①),CPU2通过嗅探技术发现a被修改了,会把自己缓存中的a置为无效(上面的②),CPU2下次想对a进行操作时会重新从主存中读取新的值,并缓存到本地。
当一个处理器修改数据时,会将整个缓存行锁定,这样其他处理器就不能访问该缓存行中的其他数据。这里假定缓存行大小为64字节,我们可以通过追加字节的形式把共享变量追加到64字节,这样就能让不同的数据分别在不同的缓存行,充分发挥出多处理器的性能。
待续。。。
能力一般,水平有限,欢迎大家进行指正,如果对您有所帮助希望能得到您的赞哦