多线程和并发专题

Q:缓存一致性:

你知道高速缓存和内存的概念吗?或者说你知道高速缓存和内存IO速度的差异吗?如果知道就太好了,不知道的话我可以给你解释一下,比如内存IO是10个单位,高速缓存IO速度是100个单位(当然其实读速度通常会快于写速度,这里就不考虑啦!),内存中存储了一个变量sum是0,我们现在要做一个求和运算sum=1+2+3+...+100,这就是高斯在8岁时做出的问题!。。。。。。

高速缓存的确加快了我们的运算速度呢,但是内存才是我们程序运行过程中最终的存储数据的地方!

可能带来的问题:读内存变量i到缓存变量i,做i++运算,写回高速缓存变量i,写回内存变量i.-----可以理解为这些操作共同构成了一个不可分割的单元,应当满足原子性!

但是在多线程情形下遇到的问题是可能发生原子缠绕破坏了原子性,进而意味着可能出现相互干扰(当然这种问题未必一定会出现,例如只读操作就不会。)

本质上是因为一个变量存在多个线程缓存或者CPU的高速缓存中!

A:解决办法嘛?

(1)通过总线加LOCK方式,因为CPU和其他部件通信方式都是通过总线进行的,对总线加锁意味着阻塞了其他CPU对其他部件的访问(例如CPU)----------问题是效率低下啊!

(2)引入缓存一致性协议!When CPU write data to main memory ,if the variable is all shared,notify other CPUs their variable in cache is useful!

像volatile修饰变量时就意味着这个变量遵循“缓存一致性协议”!

(1)立即可见性:一个线程修改共享变量时,其他线程立即觉察到使自身缓存的该变量失效并且等待该变量主存更新时重新读取。

(2)有序性:禁止指令重排序,阻止编译器对代码的优化,使得程序执行顺序按照代码顺序先后执行!

猜你喜欢

转载自www.cnblogs.com/Shen-Shu/p/11038945.html