voliate可见性和有序性原理——硬件以及软件层面分析

volatile的作用

volatile的作用是保证被它修饰的共享变量具有可见性和有序性。

什么是内存可见性?
在多线程下一个线程修改了共享变量,能够立即让其他线程知道这个新值。

什么是有序性?
程序在执行时会以到达更高执行效率为目的,在保证最终程序结果正确的前提下进行指令重排,有序性就是阻止指令重排,保证指令按序执行。

硬件层面分析

我们先了解下硬件层面实现防止指令重排和内存可见性的原理。

CPU缓存的出现
计算机在执行程序指令时涉及到数据的读写,而程序运行时需要的临时数据都存在主存中,这样会导致一个问题,cpu执行的速度非常快而内存读写数据的速度较慢,这样就会导致指令处理效率低下。
为了解决这个问题cpu缓存出现了(cache memory),cpu缓存读取速度快,当程序运行时将需要的数据拷贝一份到cpu缓存,cpu直接与缓存交互,程序结束后再将缓存内的结果刷回到主存,保证了cpu执行效率。
现在的的cpu基本都是采用的三级缓存,如下图:
一级二级缓存是核心独享,三级缓存是核心共享。
在这里插入图片描述
缓存一致性
当加入了cpu缓存后性能的确得到了提升,但是当在多线程时因为每个线程中都会有一份数据缓存,当其中一个线程修改了这个数据并同步到主存,其它线程并不知道,这时就会导致缓存不一致,缓存不一致就会导致程序的最终结果错误。

例如:假设有两个线程同时对变量i进行加1操作,假设主存中i=1、线程的缓存中i=1,当线程1对变量i加1后自己缓存的i=2,刷回主存此时主存的i=2,此时线程2对自己缓存的i加1 i=2,刷回主存主存的i=2,正常情况下两个线程都对i加1,此时i应该等于3.

解决缓存不一致带来的问题有两种方案,加总线锁,使用缓存一致性协议。
1.cpu和其他的组件通信都是通过总线(控制总线、地址总线、数据总线 ),所以解决缓存不一致带来的问题可以加总线锁,这样就可以保证其他cpu阻塞不能访问缓存了该数据内存地址的缓存,但是这样操作相当于串行化,代价有点大,所以就引入缓存锁,不锁总线而是将缓存上锁。

2.缓存一致性协议就是当某块cpu对缓存中的数据进行操作后,再写回主存时通知其他cpu将自己缓存中的该数据视为无效,从主存中重新读取。
缓存一致性的实现基于缓存一致性协议,如MESI。

在这里插入图片描述

存储缓存和存储转发
通过上面的解决方案已经实现了cpu执行指令速度的提升以及缓存一致,但是缓存一致性协议是基于四个状态的切换(

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值