当前位置:网站首页>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
边栏推荐
猜你喜欢

迪文串口屏幕制作(连载一)=====准备工作

influxDB运维记录

边境的悍匪—机器学习实战:第四章 训练模型

求职准备知识点

边境的悍匪—机器学习实战:第十一章 训练深度神经网络

十五、Kotlin进阶学习:一、子类与子类型;二、协变;三、逆变;

使用kotlin扩展插件/依赖项简化代码(在最新版本4.0以后,此插件已被弃用,故请选择性学习,以了解为主。)

边境的悍匪—机器学习实战:第十二章 使用TensorFlow自定义模型和训练

【正点原子】IIC的学习与使用(未完...)

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.)
随机推荐
昆仑通态屏幕制作(连载2)---基础篇(设定与显示,串口发送)
The types of data structures and MySQL index
为什么会出现梯度爆炸和梯度消失现象?怎么缓解这种现象的发生?
求职准备知识点
常用损失函数(一):Focal Loss
七、Kotlin基础学习:1、创建类;2、构造函数;3、继承;4、封装;5、抽象类;6、接口;7、嵌套类;8、内部类;9、枚举类
2021-09-16 集成学习上--task1机器学习数学基础
ssh 脚本 空格字符转换
MySQL data types and footprint
昆仑通态屏幕制作(连载3)---基础篇(按钮串口发送)
protobuf编码及网络通信应用(一)
Jdbc & Mysql timeout analysis
ipconfig命令指南
迪文串口屏幕制作(连载一)=====准备工作
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.)
边境的悍匪—机器学习实战:第九章 无监督学习任务
十三、Kotlin进阶学习:内联函数let、also、with、run、apply的用法。
昆仑通态屏幕制作(连载4)---基础篇(图形设定与显示,按钮灯)
基于MATLAB 2021b的机器学习、深度学习
OpenCV中(rows,cols)与图像(x,y)