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

原创
2019/12/14 16:16
阅读数 153

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部