多线程编程--04CPU高速缓存

CPU高速缓存
上一篇分享到了线程安全性的三个问题,可见性,原子性,安全性。
这一篇从OS底层来阐述这三个问题的由来:
线程是CPU调度的最小单元,那么CPU在调度线程执行指令的时候,不仅仅是依靠计算机的处理器去完成,处理器依然需要跟内存进行交互,这里就存在IO操作。由此引发了一个问题,这个问题就是CPU的运算速度远比内存要高很多,导致数据读写速度跟不上CPU运算速度;那么解决方案就是在CPU和内存之间存在一个高速缓存叫CPU高速缓存。

下面看一张图:
在这里插入图片描述
如图,缓存被分级以后就会导致另一个问题-------数据一致性问题。
每个CPU对应一个高速缓存区,这一部分数据对于其他CPU是不可见的。
当cpu-core0处理了一个共享数据count,并把它加载到高速缓存当中来。那么这是对于cpu-core1来讲,count是不可见的。那么对于这种缓存一致性问题来讲,CPU层面提供了两种解决方式-------总线锁和缓存锁,
顾名思义总线锁就是在总线上加一把锁,当一个cpu处理一个数据并放到主内存时,会向总线发起一个请求,把这个数据锁住不让其他线程进行访问。以为这总线锁是一个排它锁(悲观锁)。导致的问题就是性能问题。
缓存锁使用MESI协议进行缓存中数据的锁定,对数据添加LOCK开头的指令。
那么什么是MESI(缓存一致性)协议呢?
事实上这个协议是一种标记位。
M(modify)、
I (invalid)、
E(exclusive)表示这个数据只会在指定的缓存里使用、
S(share)表示多个CPU缓存里的数据是一致的。
那么这里还涉及到另一个协议----嗅探协议。这个协议的大概内容及就是:一个cpu会关心其他cpu高速缓存数据的变化。
那么基于以上两个协议数据是怎样变化的呢?
M表示当前缓存被修改过,当一个数据在本缓存里被修改了就会被标记为M,同时其他缓存了该数据cpu核心的数据就会被标记为I(invalid)状态(失效状态)。E表示独占缓存状态,意思是count只会在cpu0里面使用并且和主内存当中的数据保持一直。S共享缓存状态,表示所有cpu-core里面是数据值是一致的。

为了解决上述三个问题引出了JMM(java内存模型)。不同OS(硬件层面)的内存结构不尽相同,他们对协议的支持时不相同的,为了保证java能在多个平台上的运行,出现了JMM----软件层面的解决方案java内存模型。主要是解决了可见性、安全性、原子性等问题。

在这里插入图片描述
本篇结!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值