缓存不一致

1.1定义

当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。
举个简单的例子:i = i +1。当线程执行这个语句时,会先从主存当中读取i的值,然后复制一份到高速缓存当中,然后CPU执行指令对i进行加1操作,然后将数据写入高速缓存,最后将高速缓存中i最新的值刷新到主存当中。在单线程环境下没问题,但是当在多个线程同时执行的时候就可能出现问题。
比如同时有2个线程执行这段代码,假如初始时i的值为0初始时,两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,然后线程1进行加1操作,然后把i的最新值1写入到内存。此时线程2的高速缓存当中i的值还是0,进行加1操作之后,i的值为1,然后线程2把i的值写入内存。最终结果i的值是1,而不是2。这就是著名的缓存一致性问题。通常称这种被多个线程访问的变量为共享变量。

1.2解决

为了解决缓存不一致性问题,通常来说有以下2种解决方法:

  1. 通过在总线加LOCK锁的方式
    就是当存在一个一个线程访问共享变量时,我们就锁住总线,这个时候其他线程访问该变量的内存时就会被阻塞。直到该代码执行完成。由于在锁住总线期间,其他CPU无法访问内存,会导致效率低下
  2. 通过缓存一致性协议
    例如MESI协议:MESI协议保证了每个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。
posted @ 2020-07-11 11:29  大嘤熊  阅读(412)  评论(0编辑  收藏  举报