php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 312|回复: 0

mesi--cpu内存一致性协议

[复制链接]

2670

主题

2677

帖子

9495

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
6703
贡献
0
注册时间
2021-4-14
最后登录
2024-5-15
在线时间
674 小时
QQ
发表于 2022-7-9 09:10:57 | 显示全部楼层 |阅读模式
cpu缓存一致性问题
一个服务器中有多个核,每个核中有多个cpu,每个cpu有多个线程。缓存最少分为3级,1级为线程缓存,2级为核缓存,3级为多个核共享缓存。

产生缓存一致性问题:cpu主缓存count=0,此时线程A需要对count+1,线程B需要count+1,但是线程A读取count=0,修改了count+1还没来得及提交,线程B读取的还是count=0,然后线程A,线程B都提交到cpu主缓存,此时count=1,产生错误,应该count=2

解决方式:
1.cpu主缓存加锁,产生问题效率变低,因为线程A使用count时,其他cpu线程都在等待
2.缓存一致性协议mesi:对单个缓存行进行加锁,不会影响cpu的其他线程
image.png

mesi协议
mesi协议:为了解决cpu缓存一致性问题

mesi协议的4种状态:m e s i
MESI是Midified(已修改),Exclusive(独占),Shared(共享),Invalidated(已失效)的缩写,对应Cache Line的四种状态。

多核CPU的cache和内存的构成可以简化为:每个CPU有自己的独有的cache,然后大家共享内存,当每个CPU从cache中读取数据时,如何保证所有cache和内存中数据的一致性,即使MESI协议要解决的问题。
mesi协议4种状态,及状态转换
状态解释:

【M已修改】: 即脏标记,表示当前cache line中的数据已经被修改,没有被写到内存中。
【i已失效】: 状态,表示这个cache line里的数据已经失效,是不可以读取的数据。
【E独占】和【S共享】:状态都表示这个cache line中的数据是干净的(即与内存中的数据是一致的,共享同时也表示与其他cpu cache中的数据是一致的)。

状态转换:

E独占:数据只在被一个cpu读取。
S共享:独占状态基础上,又有其他cpu读取这份数据到自己的缓存行。代表同一份数据在多个cpu的缓存行中
i已失效:当共享状态时,代表同一份数据在多个cpu的缓存行中,不能直接修改,而是要先向所有的其他 CPU 核心广播一个请求,要求先把其他核心的 Cache 中对应的 Cache Line 标记为【已失效】状态,然后再更新当前Cache 里面的数据(这时数据的状态就变为独占的)
image.png
模拟工具演示
https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/caches/MESIHelp.htm





上一篇:记一次 .NET 某新能源系统 线程疯涨 分析
下一篇:曝华为HarmonyOS 3.0将于7月27日发布
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-5-18 11:19 , Processed in 0.156520 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表