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

IT技术2年前 (2022)发布 投稿用户
0

当程序在运转过程中,会将运算需要的数据从主存仿制一份到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需要读取这个变量时,发现自己缓存中缓存该变量的缓存是无效的,那么它就会从内存重新读取。

© 版权声明
好牛新坐标 广告
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com

相关文章