MESI协议为何会引发 有序性、可见性的问题
引发可见性
case1:处理器将数据写入到写缓冲器,发送invalidate消息到总线bus,就认为成功了。此时数据并未到高速缓存中。
case2:处理器1在嗅探到invalidate之前,就去读取高速缓存的数据。如果有,就从自己高速缓存中取出旧值;如果没有,就发送read消息,去处理器0的高速缓存读。处理器0提供的就是旧值。
case3:处理器1收到invalidate消息,放到无效队列。还没来得及将自己的数据状态设为 I过期。此时读,就是旧值
原因:写缓冲器+无效队列 导致的。写数据不一定立马写入自己的高速缓存或主内存,只写入到了写缓冲器;读数据不一定立马从别人的高速缓存或主内存刷新最新值过来,invalidate消息还在无效队列。
引发有序性
case1:StoreLoad重排序
int a = 0;
int c = 1;//线程1:
a = 1; //写操作,Store
int b = c; //读操作,Load
Store写入到了写缓冲器,紧接着执行Load。此时其他线程读不到 “a = 1”,好像是写操作未执行。然而读操作成功了。
明明顺序是读、写,表现出来的确实写、读
case2:StoreStore重排序
int a,b=0;a = 1;
b = 2;
有可能a原本的状态是S共享,说明其他人都在用,于是写入到了写缓冲器,发invalidate、收invalidate ack…最后再写入高速缓存。
b原本状态是独占,说明我有锁,别人的都过期了。于是未到写缓冲器, 直接写入到高速缓存。反正别人也无权限
这样一来,其他处理器能立马看到b的新值、a的旧值,仿佛第二个写操作先执行、第一个后执行。
MESI协议为何会引发 有序性、可见性的问题相关推荐
- volatile可见性MESI协议volatile
volatile 的作用 volatile 的主要作用有三点: - 保证变量的内存可见性 ,有序性(禁止指令重排序),不保证原子性. 可见性 简单解释:指当多个线程访问同一个变量时,一个线程修改了这个 ...
- mesi协议怎么实现_volatile的底层实现原理
volatile关键字有两个作用 保证被volatile修饰的共享变量(vlatile int a=1)对所有线程总数可见的,也就是当一个线程修改了一个被volatile修饰共享变量的值,新值总是可以 ...
- 2021-04-04 CPU缓存一致性 MESI协议
一 CPU以及缓存和高速缓存结构 1.1 CPU结构 我们知道CPU主要功能,一是控制,一是运算.主要包括寄存器.控制单元.运算单元和中断系统,主要架构如下: 控制单元:主要负责分析和解释指令 算数逻 ...
- 【原理/Java并发】从volatile到MESI协议
文章目录 1 前言 2 有序性 2.1 编译器层面的内存屏障 2.2 CPU层面的内存屏障 3 可见性 3.1 MESI协议 3.2 Store Buffer 和 Invalid Queue 3.3 ...
- CPU中的MESI协议(Intel)
目录 CPU缓存一致性 MESI 协议 MESI优化带来的性能问题 处理器执行时的乱序优化引发的问题 as-if-serial规则 happens-before规则 as-if-serial规则和ha ...
- Java内存模型MESI协议
参考链接 也许,这是东半球最叼的Java内存模型 CPU缓存一致性协议MESI 目录 多线程并发编程的三个特性实现 缓存的出现 缓存不一致 MESI协议 MESI优化和他们引入的问题 硬件内存模型 v ...
- 线程基础:多任务处理——MESI协议以及带来的问题:伪共享
1.概述 本文和后续文章将着眼CPU的工作原理阐述伪共享的解决方法和volatile关键字的应用. 2.复习CPU工作原理 2.1.CPU工作原理 要清楚理解本文后续内容,就需要首先重新概述一下JV ...
- 缓存一致性协议和CPU缓存架构(MESI协议)、伪共享
目录 简介 CPU高速缓存 为什么要有CPU高速缓存 局部性原理 缓存一致性 缓存一致性的要求 总线窥探 工作原理 窥探协议 一致性协议 MESI协议 总线事务 总线仲裁 总线锁定 缓存锁定 伪共享问 ...
- Mesi协议与内存屏障
Mesi协议和内存屏障都是和计算机并发相关的概念. 什么是Mesi协议 计算机存储分层 多核cpu带来的问题 而随着CPU的发展,CPU逐渐发展成了多核,CPU可以同时使用多个核心控制器执行线程任务, ...
最新文章
- Caddy-基于go的微型serve用来做反向代理和Gateway
- access课程均不及格_access 第二章 查询 练习题 -
- [蓝桥杯]错误票据---stringstream应用举例
- 数据结构与算法--二叉树的深度问题
- idea中新建javaWeb项目
- 某电子工厂老板感叹创业开厂人生
- 爱普生l301打印机驱动 电脑版
- BR8041A02串口烧录PC工具操作说明(BR8041_USB_Programer_V2.0.exe)
- python初学入门————列表
- 我的推荐系统学习之路
- ARC 128D - Neq Neq(dp+组合数学+思维)
- python质因子分解_质因子分解_个人文章 - SegmentFault 思否
- 钉钉内网穿透工具使用
- 基于javaweb的房屋租赁系统(前端+后端)
- BC20 MQTT与GPS功能测试
- 使用python爬虫爬取百度新闻,告诉你社会热点话题
- select 向上弹起
- 8月顺利拿到OPPO公司Android架构师offer,一面+部长面
- 帝国往昔--中国的附属国
- linux sendmail 总结
热门文章
- js中的null和undefined总结
- SpringBoot2.XX 产生的问题
- MySQL SQL优化
- 译-在Python正则模式中search()和match()的区别是什么?
- list of Java class file format major version numbers?
- 蓝桥杯 基础练习 十进制转十六进制(水题,进制转换)
- Cisco Easy ***综合配置示例
- 【转】JS回调函数--简单易懂有实例
- 内嵌iframe撑高父容器,底部有4px留白问题解决办法
- HTML5 Canvas 绘制库存变化折线 增加超储告罄线