CPU缓存不一致性问题的两种处理方式

由于CPU的读写速度远远大于内存的读写速度,所以为了解决CPU访问主内存效率低下的问题,CPU引入了缓存。这时因为主内存和缓存都会存有数据,那么势必要保证缓存中的数据和主内存数据的一致。特别是多线程情况下,如果两个线程同时从CPU缓存中读取的值i为1,二者同时对i+1,然后写回主内存,那么i的值回变为2,但实际上i进行了2次+1的操作,实际值应该是3。这就是CPU缓存不一致导致的问题。

解决方法:

总线加锁,由于CPU和其他组件都是通过总线(数据总线,控制总线,地址总线)来通信,不过如果采用总线加锁的方式,就只能有一个CPU能够获取到总线锁,从而访问到内存中的变量,而其他的CPU都会被阻塞。这就类似于读写都串行化了,对效率的影响会很大。

缓存一致性协议,在缓存一致性协议中,最出名的就是Intel的MESI协议,MESI的大致思想是,当CPU操作的变量是一个共享变量时,
说明其他的CPU缓存中也可能会存在副本,那么这时候对该共享变量的读操作不做限制,照常读取数据,只是在写入的时候,会发出信号告诉其他的CPU将这个变量的Cache
line设置为无效状态,那么其他的CPU在对该变量做读取时,由于缓存中的该变量已经失效,那么就会重新到主内存中读取。

注:CPU Cache由很多个Cache Line构成,可以把Cache Line简单的理解为CPU Cache中的最小缓存单位。目前主流的CPU Cache的Cache Line大小都是64字节。

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/107460824
今日推荐