文档章节

什么是缓存一致性问题?如何解决?

o
 osc_fmg49rzg
发布于 2019/03/19 21:10
字数 915
阅读 14
收藏 0

精选30+云产品,助力企业轻松上云!>>>

当程序在运行过程中,会将运算需要的数据从主存复制一份到cup的高速缓存当中,那么cpu进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束后,再将高速缓存中的数据刷新到主存当中。举个简单的例子,比如下面这段代码:

i=i+1
  • 1

当线程执行这个语句时,会先从缓存当中读取i的值,然后复制一份到高速缓存当中,然后CPU执行命令对i进行加1操作,然后将数据写入高速缓存。最后将高速缓存中的最新的值刷新到主存当中。

这个代码在单线程中运行时没有任何问题的,但是在多线程中运行就会有问题了。在多核CPU中,每条线程可能运行于不同的CPU中,因此每个线程运行时有自己的高速缓存(对单核CPU来说,其实也会出现这种问题,只不过是以线程调度的形式来分别执行的)。我们以多喝CPU为例。

可能存在下面一种情况:初始时,两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,然后线程1进行加1操作,然后把i的最新值1写入到内存。此时线程2的高速缓存当中i的值还是0,进行加1操作之后,i的值为1,然后线程2把i的值写入内存。

最终结果i的值是1,而不是2.这就是缓存一致性问题。通常称这种被多个线程访问的变量为共享变量。

解决缓存一致性问题的方法有一下2种:

  1. 通过在总线加LOCK#锁的方式
  2. 通过缓存一致性协议

在早期的CPU当中,是通过在总线上加LOCK#锁的形式来解决缓存不一致的问题。因为CPU和其他部件进行通信都是通过总线来进行的,如果对总线加LOCK#锁的话,也就是说阻塞了其他CPU对其他部件访问,从而使得只有一个CPU能使用这个变量的内存。比如上面例子中,如果一个线程在执行i=i+1,如果在执行这段代码的过程中,在总线上发出了LOCK#锁的信号,那么只有等待这段代码完全执行完毕之后,其他CPU才能从变量i所在的内存读取变量,然后进行相应的操作。这样就解决了缓存不一致问题。

但是上面的方式会有一个问题,由于在锁住总线期间,其他CPU无法访问内存,导致效率低下。

所以就出现了缓存一致性协议。该协议保证了每个缓存中使用的共享变量的副本是一致的。它的核心思想是:当CPU向内存写入数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存行是无效的,那么它就会从内存重新读取。java中的volatile就是该协议的实现,volatile的实现原理可参见volatile底层实现

上一篇: 第四周作业
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
八、到底什么是计算机内存模型?

到底什么是计算机内存模型? 在上一篇文章中,我们提到:随着计算机硬件的不断升级,间接的会给软件系统带来一些问题或者难题。而其中比较重要的三个问题就是我们一致性问题、原子性问题和有...

傅小水water
2019/08/14
0
0
问题

1,设计一个异地多活的技术方案? 2,设计一个接口级别的应对方案? 3,如何设计百亿级缓存方案?缓存穿透,缓存雪崩,缓存热点 4,如何实现强一致性? 5,如何实现最终一致性? 6,如何实现...

Original123
2019/06/24
0
0
redis的几个重要知识点

随着系统访问量的提高,复杂性的提升,响应性能成为一个重点的关注点。其中,缓存的使用成为了一个重点。Redis作为缓存中间件的一个佼佼者,很有必要了解Redis相关的一些重要知识点。 什么是...

osc_9vxdigiw
2019/12/25
0
0
思考&梳理

架构 1. 什么是架构 2. 架构师是什么样的角色 3. 系统面临的复杂度问题通常有哪些 4. 高性能的问题通常解决方案有什么 4.1 拆分 4.1.1 系统的拆分原则 4.1.2 数据库拆分 4.1.2.1 数据库的主从...

爱吃大肉包
2019/10/18
0
0
【面试真题】JAVA面试真题(3)

Java面试的重点: 数据结构与算法,JVM内存结构、垃圾回收器、回收算法、GC、并发编程相关(多线程、线程池等)、NIO/BIO、性能优化、设计模式、Spring框架:分布式相关:Redis缓存、一致Hash算...

HOT_POT
2019/02/21
2
0

没有更多内容

加载失败,请刷新页面

加载更多

会议通知 | 2020中国计算与认知神经科学会议

关于大会关于 计算神经科学以神经生物实验为基础,以建立数学模型,开展计算模拟和分析作为基本手段,来刻画和描述大脑的神经活动,探究神经系统各种复杂活动和认知功能包括注意、学习、记忆...

脑机接口社区
06/02
0
0
大神分享快3怎么算下期和值

大神分享快3怎么算下期和值{叩67790572}使用的标签:constructor-arg标签出现的位置:bean标签的内部标签中的属性type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个...

yiren081
9分钟前
4
0
Matlab系列之运算符和标点符号的功能介绍

本来月初就打算接着写的,但是电脑不小心进水,主板什么的都废了,周末才找时间拿去修好,心塞。 就不多讲太多废话了,开始分享今天的内容,对MATLAB的运算符做个介绍,然后再对标点符号进行...

狂人V
07/06
0
0
Java源码系列(1):Comparable和Comparator的区别

在讲Comparable和Comparator区别之前,先补充一个知识点。 先看代码: Person类 1public class Person<T> { 2  private T id; 3 4  public T getId() { 5    return i...

学习Java的小姐姐
2018/09/19
0
0
ThreadPoolTaskScheduler手写调度中心

先贴一个自己写的demo把,原理其实就是这样的。 CronTrigger这个类可以将cron表达式转换成Date,可以查看schedule源码学到不少东西,下面代码就是转换成下一执行时间。 public Date nextEx...

朝如青丝暮成雪
30分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部