当前位置:网站首页>CPU缓存一致性问题
CPU缓存一致性问题
2022-07-30 05:45:00 【zpv2jdfc】
今天复习了下CPU缓存的知识。(๑•̀ㅂ•́)و*
CPU的访问速率要远高于内存的访问速率,为了减少内存访问次数,提高计算机系统效率,CPU中引入了缓存。

这是我虚拟机的三级缓存结构。L1d和L1i是一级缓存,他距离cpu核心最近,
其中,l1d用来存数据,l1i用来存指令。L1和L1 cache是每个核心独有的缓存,而L3则是多个cpu核心共享的。
缓存每次从内存中读取的数据的大小cache line 可以从这里看到,默认是64字节。
接下来进入正题:
数据写入内存的两种方式
如何同步cache和内存的数据呢?
写直达 & 写回
写直达就是每次写数据的时候都同时往cache和内存写。如果写操作比较频繁的话,这样显然效率很低。
写回则是cpu只往cache写,只有当某个cache block要被替换时,才把他写回内存,这就引出了下一个问题:
缓存一致性问题
因为每个cpu核心都有自己私有的cache。假设有两个cpu核心A和B,他们都从内存读取了同一个变量i,之后A修改了 i 的值并且写回了内存,此时B的缓存中 i 的值就和内存中的i不一样了。
- 为了保证数据的一致性,首先要做到 写传播,即一个cpu修改了cache数据时,要通知给其他的cpu。
- 其次要做到 事务串行化,假设有两个个cpu核心,都修改了同一个变量 i,他们俩在把“我修改了 i ”这个消息传递给其他cpu时,可能消息达到的顺序不同,这样也会产生问题。
总线嗅探
通过总线嗅探可以实现写传播,但是会增加总线的压力,另外,总线嗅探也不能保证事务串行化。
MESI协议
MESI协议解决了写传播和事务串行化这两个问题。
MESI用四种状态来表示cache的状态:
- M:Modified 修改
- E:Exclusive 独占
- S:Shared 共享
- I:Invalidated 失效
MESI协议中,如果有个cpu核心修改了cache的值,他就会把自己这个cache block标志为M,同时告诉其他的核心,让他们把对应的cache block标记为I,如果qita核心要读取这块内容的话,他就要先把这个cache block写回内存,然后状态该改为S。
还有其他几种情况,比如要写的时候发现是 I。用MESI的四种状态都可以解决。
伪共享
但这里还有一个不太合理的地方,假设cpu核心A和B都读取了相同的cache block,A一直修改缓存中 a的值,B则一直修改 b的值。按理说他们俩操作不同的值应该是不存在一致性问题的,但由于a和b这俩变量挨得比较近,会读取到同一个cache block中,A每次修改完a就会把B的cache block置为无效,B也一样,这就是伪共享问题。
留在下一篇 ヾ(≧▽≦*)o
边栏推荐
- CNN经典模型发展进程
- 遥感、GIS和GPS技术在水文、气象、灾害、生态、环境及卫生等应用
- C语言实战小项目(传统卡牌游戏)
- 逻辑右移和算术右移区别
- openssl 1.1.1编译语句
- Self-augmented Unpaired Image Dehazing via Density and Depth Decomposition program running record
- 新导则下 防洪评价报告编制方法及洪水建模(HEC-RAS)
- Nodejs PM2 monitoring and alarm email (2)
- 九、Kotlin基础学习:1、Companion的扩展方法和扩展属性;2、一般类的扩展方法和扩展属性;3、委托;
- openssl1.1.1ARM双编译
猜你喜欢
随机推荐
为什么会出现梯度爆炸和梯度消失现象?怎么缓解这种现象的发生?
Conda 安装 tensorflow gpu 1.13.1(验证可行)
User password encryption using Bcrypt instead of MD5, SHA1 and SHA256
【正点原子】IIC的学习与使用(未完...)
2021-09-19 集成学习TASK2
Pytorch(一):动态图机制以及框架结构
DeepLearing4j深度学习之Yolo Tiny实现目标检测
CLUE Model Construction Method, Model Validation and Land Use Change Scenario Prediction
十四、Kotlin进阶学习:一、内联函数 inline;二、泛型;三、泛型约束;四、子类与子类型;
QT串口动态实时显示大量数据波形曲线(四)========“界面的美化与处理”
Use kotlin to extend plugins/dependencies to simplify code (after the latest version 4.0, this plugin has been deprecated, so please choose to learn, mainly to understand.)
Redis publish/subscribe
Pytorch(二):数据读取机制(DataLoader、DataSet)与图像预处理模块(transforms)
Flood Control Assessment Report Compilation Method and Flood Modelling under the New Guidelines (HEC-RAS)
边境的悍匪—机器学习实战:第十五章 使用CNN和RNN处理序列
关于map对key自定义排序
基于R语言地理加权回归、主成分分析、判别分析等空间异质性数据分析
联影医疗一面
The types of data structures and MySQL index
使用kotlin扩展插件/依赖项简化代码(在最新版本4.0以后,此插件已被弃用,故请选择性学习,以了解为主。)









