志在指尖
用双手敲打未来

什么是缓存一致性问题? 怎么处理呢?

当程序在运转过程中,会将运算需要的数据从主存仿制一份到CPU高速缓存中,那么CPU进行核算时就可以从它的高速缓存读取数据和向其中写入数据,当运算结束后,再将高速缓存中的数据刷新到主存傍边。举个简略的比如,比方下面的这段代码:
i=i+1;
当线程履行这个句子时,会先从主存傍边读取i的值,然后仿制一份到高速缓存傍边,然后CPU履行指令对i指令进行加1操作,然后将数据写入高速缓存,终究将高速缓存中i最新的值刷新到主存傍边。
这个代码在单线程中运转时没有任何问题的,但是在多线程中运转就会有问题了。在多核CPU中,每条线程或许运转于不同的CPU中,因而每个线程运转时有自己的高速缓存(对单核CPU来说,其实也会呈现这种问题,只不过是以线程调度的方式来分别履行的)。咱们以多核CPU为例。
比方同时有两个线程履行这段代码,假设初始时i的值为0,那么咱们期望两个线程履行完之后i的值变为2。但现实会是这样吗?
或许存在下面一种情况:初始时,两个线程分别读取i的值存入各自地点的CPU的高速缓存傍边,然后线程1进行加1操作,然后把i的最新值1写入到内存。此刻线程2的高速缓存傍边i的值仍是0,进行加1操作后,i的值为1,然后线程2把i的值写入内存。Java
终究成果i的值是1,而不是2。这便是著名的缓存共同性问题。一般称这种被多个线程拜访的变量为同享变量。
也便是说,假如一个变量在多个CPU中都存在缓存(一般在多线程编程时才会呈现),那么就或许存在缓存不共同的问题。
为了处理缓存不共同问题,一般来说有以下2种处理方法:
1)经过在总线加LOCK,锁的方式;
2)经过缓存共同性协议;
在早期的CPU中,是经过在总线上加LOCK锁的方式来处理缓存不共同的问题。因为CPU和其他部件进行通信都是经过总线来进行的,假如对总线加LOCK锁的话,也便是说阻塞了其他CPU对其它部件拜访(如内存),从而使得只能有一个CPU能运用这个变量的内存。比方上面比如中,假如一个线程在履行i=i+1,假如在履行这段代码的过程中,在总线上发出了LOCK锁的信号,那么只要等候这段代码彻底履行结束之后,其他CPU才能从变量i地点的内存读取变量,然后进行相应的操作。这样就处理了缓存不共同的问题。
但是上面的方式会有一个问题,由于在锁住总线期间,其他CPU无法拜访内存,导致效率低下。
所以就呈现了缓存共同性协议。该协议保证了每个缓存中运用的同享变量的副本是共同的。它的中心思想是:当CPU向内存写入数据时,假如发现操作的变量时同享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状况,因而当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存是无效的,那么它就会从内存重新读取。

未经允许不得转载:IT技术网站 » 什么是缓存一致性问题? 怎么处理呢?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载