文档章节

java并发-缓存一致性协议和内存屏障的思考和理解

萧默
 萧默
发布于 2019/12/14 16:16
字数 768
阅读 8
收藏 0

################这是之前的思考

内存屏障只是保证清空流水线,如何保证高速缓存的内容更新到最新或刷新到主存呢?这个问题突然想到了,不知道这个需要怎回答。

内存屏障保证的CPU执行执行序列能够顺序执行,而不是乱序执行。当然,前提是编译器没有重排指令,JVM没有重排执行,有了这两个前提,再保证CPU不重排执行,不乱序执行。

缓存一致性协议是保证多个CPU的高速缓存和主存的数据的一致性的问题。

################这是最近的思考

缓存一致性协议是一种维护多个CPU的缓存数据一致性的协议。

能够保证多个CPU高效实用缓存内的数据。

1.每个CPU读数据,都优先从所有高速缓存内查找,当找不到,才会从主存中查找,然后缓存到自己所属的高速缓存当中。

2.每个缓存行都具有一种状态,这种状态标识了当前缓存的数据,在其余高速缓存中是否有复制,是否是最新的。

最简单的MESI协议,每个缓存行具有四种状态。

内存屏障其实是作用于CPU和缓存之间的存储缓冲区的。

当使用内存屏障指令,就会将存储缓存区中的数据刷新到缓存的缓存行中。从而得到数据访问的顺序一致性。

当然,还有一部分功能就是防止CPU指令流水线的指令重排序,让内存屏障指令前面的指令都执行完,才执行内存屏障后面的指令。

################################

按照道理,CPU应该只能和缓存打交道,我感觉应该确实如此。

CPU不会直接访问内存,因为这样效率太低,缓存作为一个中间的组件,用来从内存中加载数据,然后缓存起来,提供给CPU使用。

当CPU要读数据的时候,向缓存请求数据,如果缓存中存在,那么直接返回,如果缓存中不存在,那么就向其他的CPU核心的缓存请求,如果还不存在,则从内存中加载。

当CPU要加载数据的时候,将数据先暂存到写缓冲区中,当写缓冲区满了,才被动的写入到缓存,注意!!!这里依然没有写入到内存。其实,是当写缓冲区写数据发生写缺失,才会真正的向内存中写数据。

© 著作权归作者所有

萧默
粉丝 0
博文 43
码字总数 19380
作品 0
杭州
程序员
私信 提问
Java内存模型原理,你真的理解透彻了吗?

内存模型产生背景 在介绍 Java 内存模型之前,我们先了解一下物理计算机中的并发问题,理解这些问题可以搞清楚内存模型产生的背景。 物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物...

小刀爱编程
2018/11/20
39
0
Java并发编程-volatile

1、 CPU 、主存及高速缓存的概念 计算机的硬件组成可以抽象为由总线、IO设备、主存、处理器(CPU)等组成。其中数据存放在主存中,CPU负责指令的执行,CPU的指令执行非常快,大部分简单指令的...

jamesese
2018/07/08
0
0
Java并发编程-volatile解释

CPU 、主存及高速缓存的概念 计算机的硬件组成可以抽象为由总线、IO设备、主存、处理器(CPU)等组成。其中数据存放在主存中,CPU负责指令的执行,CPU的指令执行非常快,大部分简单指令的执行...

TonyStarkSir
2018/08/08
18
0
BAT最新Java面试题汇总:并发编程+JVM+Spring+分布式+缓存等!

前言 作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度? 面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责。 今天给大家分享下我整理的Java架构面试...

别打我会飞
2019/06/03
328
0
JMM是怎么解决原子性、可见性、有序性问题的?

Java内存模型封装了底层的实现后提供给开发人员一系列和并发处理相关的关键字,,比如volatile、Synchronized、final等,在开发多线程代码的时候,我们可以直接使用 这些关键词来控制并发,从...

浦涛
2018/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kettle自定义jar包供javascript使用

我们都知道 Kettle 是用 Java 语言开发,并且可以在 JavaScript 里面直接调用 java 类方法。所以有些时候,我们可以自定义一些方法,来供 JavaScript 使用。 本篇文章有参考自:https://www...

CREATE_17
昨天
102
0
处理CSV文件中的逗号

我正在寻找有关如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且该值可能带有逗号(例如公司名称)。 我们正在研究的一些想法是:带引号的标识符(值“,”值“,”等)或使用|...

javail
昨天
79
0
如何克隆一个Date对象?

将Date变量分配给另一个变量会将引用复制到同一实例。 这意味着更改一个将更改另一个。 如何实际克隆或复制Date实例? #1楼 简化版: Date.prototype.clone = function () { return new ...

技术盛宴
昨天
73
0
计算一个数的数位之和

计算一个数的数位之和 例如:128 :1+2+8 = 11 public int numSum(int num) { int sum = 0; do { sum += num % 10; } while ((num = num / 10) > 0); return sum;......

SongAlone
昨天
124
0
为什么图片反复压缩后普遍会变绿,而不是其他颜色?

作者:Lion Yang 链接:https://www.zhihu.com/question/29355920/answer/119088684 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 业余版概要:安卓的...

shzwork
昨天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部