首页 > 其他分享 >「30 天沉淀 90 mins」Day 1 CPU缓存一致性相关问题——MESI协议

「30 天沉淀 90 mins」Day 1 CPU缓存一致性相关问题——MESI协议

时间:2023-08-21 23:11:51浏览次数:40  
标签:缓存 核心 Cache 总线 CPU MESI 内存 30 Day

参考资料

  1. 小林Coding, 也是这里没想到居然讲了这个;

先简单复习一下冯诺依曼模型——运算器、控制器、存储器、输入设备、输出设备, 以及他们如何交互


寄存器分类:

  1. 通用寄存器,用来存放需要进行运算的数据,比如需要进行加和运算的两个数据。
  2. 程序计数器,用来存储 CPU 要执行下一条指令「所在的内存地址」,注意不是存储了下一条要执行的指令,此时指令还在内存中,程序计数器只是存储了下一条指令「的地址」。
  3. 指令寄存器,用来存放当前正在执行的指令,也就是指令本身,指令被执行完成之前,指令都存储在这里。

总线分类:

  1. 地址总线,用于指定 CPU 将要操作的内存地址;
  2. 数据总线,用于读写内存的数据;
  3. 控制总线,用于发送和接收信号,比如中断、设备复位等信号,CPU 收到信号后自然进行响应,这时也需要控制总线;

CPU缓存一致性

CPU缓存是什么?

CPU缓存又叫CPU Cache, 通常分为三级: L1, L2, L3 三级核心, L3所有核心共享;

明确点: CPU访问缓存明显快于访问内存

CPU缓存的结构, 由多个 Cache Line 组成, 对于单个 Cache Line 组成

| tags | Data Block |

修改缓存时可能会造成缓存与内存的不一致, 如何同步? 有两种方法, 写直达 (write through) , 写回 (write back)

写直达

  • 每次写数据, 同时写入缓存和内存, 如果缓存没有对应数据则直接写内存, 否则先改缓存再改内存
  • 性能损失大

写回

  • 当发生写操作时,新的数据仅仅被写入 Cache Block 里,只有当修改过的 Cache Block「被替换」时才需要写到内存中
  • 懒操作的思想, 先标记, 缓存需要被覆盖时再写内存, 显然性能更好

什么是CPU缓存一致性(Cache Coherence)

考虑 A,B 两个核心, 同时执行 i++ 的操作, 设 i 初始为 0, A执行后, 采用写回方式, A 内缓存 i 为 1, 而内存中为 0, 此时 B 执行 i++ 拿到的 i = 0 是错误的, 这就是缓存不一致的现象;

显然对于单CPU核心机器来说, 天生 CPU 缓存一致性, 因此仅考虑多CPU核心的情况

怎么保证CPU缓存一致性?

通过两点来解决:

  1. 某个 CPU 核心里的 Cache 数据更新时,必须要传播到其他核心的 Cache,这个称为写传播(Wreite Propagation);

  2. 某个 CPU 核心里对数据的操作顺序,必须在其他核心看起来顺序是一样的,这个称为事务的串形化(Transaction Serialization)。

保证事物串行化:

  • CPU 核心对于 Cache 中数据的操作,需要同步给其他 CPU 核心
  • 引入锁, 保证 CPU 核心对相同数据的缓存更新互斥

总线嗅探(Bus Snooping)

写传播的原则就是当某个 CPU 核心更新了 Cache 中的数据,要把该事件广播通知到其他核心, 常用 Bus Snooping 实现;

广播事件也有可能来自本地CPU核心

CPU 需要每时每刻监听总线上的一切活动,但是不管别的核心的 Cache 是否缓存相同的数据,都需要发出一个广播事件,这无疑会加重总线的负载。

显然 Bus Snooping 无法保证事物串行化, 需要引入 MESI 协议.

MESI

What is MESI?

  • Modified,已修改
  • Exclusive,独占
  • Shared,共享
  • Invalidated,已失效

进一步解释

  • E 和 S 都保证 Cache Block 里的数据时干净的(和内存一致), E 和 S 的区别是是否只有 1 个 Cache核心拥有这个数据的缓存;
  • 修改 S 的 Cache Line, 需要先广播到其他 core, 等待其他 core 标记数据对应 CacheLine 为 I, 之后才可以更新当前 Cache Line
    并标记为 M ;
  • 当 Cache Line 是** M 或者 E 的时候修改不需要广播到其他 CPU 核心**, 减少总线带宽压力

因此很容易给出一个状态机模型, 转移比较简单, 4 种触发事件:

  1. 本地读自己Cache (从 I 触发, 需要区分本地是否有数据决定是 E 还是 I)
  2. 本地写自己Cache
  3. 其他写它自己Cache
  4. 其他读它自己Cache

原子操作、CAS

MESI 确保了,同一数据在所有 Cache 中只会被 1 个 core 修改, 假设两个 core 并行修改且同时发出写入或读-修改(read-for-ownership, RFO)请求, 此时请求会在总线发生碰撞 “pingpong”, 总线和缓存协议通常有冲突解决策略,如基于优先级的算法或其他机制,来确定哪个核心可以首先获得修改权限。

标签:缓存,核心,Cache,总线,CPU,MESI,内存,30,Day
From: https://www.cnblogs.com/Roshin/p/17647233.html

相关文章

  • py之路——day13-20230821:生成器和迭代器
    作者:zb一、列表生成式1、定义用来生成列表的表达式2、特点可以使代码更加简洁示例代码如下:1#普通方法定义列表2a=[1,2,3]3print(a)4#列表生成式方法定义列表5b=[i*2foriinrange(10)]6print(b)7#如果不用列表生成式,上述b列表定义会很麻烦......
  • 自我介绍:20231301 周子昂
    自我介绍大家好!我叫周子昂。#(0)照片---#(1)形容词##周:思绪“周”密,严谨踏实###做事之前喜欢整体思考,有一定的布局。尽可能在做事时脚踏实地,认真仔细。事后反思总结经验教训,以便下次更好。##子:谦谦君“子”,温和有礼###待人接物有基本的礼仪与尊重。......
  • day04
    信号管理一、基本概念  1、中断    当程序进程接收到消息后,中止当前正在进行的进程,转而去执行其他任务等其他任务执行结束后再返回刚刚中止的位置,可以继续往下运行    中断分为硬件中断、软件中断,硬件中断是由硬件设备引发的、软件中断是执行了中断指令......
  • Java学习IO流Day01
    io一、File2.1FIle概述File用来表示文件系统中的一个文件或者目录java.io包下2.2方法构造方法File(Stringpathname):通过指定路径名称创建一个新的FIle实例Filefile=newFile("D:\\demo.txt");File(Fileparent,Stringchild):根据父级目录对象和子文......
  • 20230821比赛
    20230821比赛T1【佛山市选2013】树环转换GMOJ3230Description给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1。树的节点编号从1开始。在这个问题中,你需要使用最小的消耗值(加边和删边操作)将这棵树转化为环,不允许有重边。环的定......
  • 8.21 Day5
    上午讲了严谨的时间复杂度分析理论,不知道有什么用,但是让我更严谨了中午在睡觉下午讲了欧几里得全家桶(一般欧几里得,拓展欧几里得,类欧几里得),黄钰曾评价类欧几里得:800年不考但还是习得了如何用图像法解决一般的类欧几里得问题总结,今天讲的ppt上的内容不多,但是拓展了很多,没有局......
  • 20天 hot 100 速通计划-day13
    回溯131.分割回文串给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。回文串是正着读和反着读都一样的字符串。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]提示:1&......
  • 30、NAT网络地址转换
    网络地址技术NAT的主要功能是实现内网访问外网,实现IP地址的转换。NAT一般部署在出口防火墙或者路由器中,可以更加安全的访问Internet,同时可以保护私有网络信息不被直接暴露在公网中,是一种主要解决IP地址短缺的技术。NAT转换技术包括静态、动态以及地址端口转换NAPT三种方式。NAT地......
  • 联想DM3000H存储用户配置
    vserverservicesname-serviceldapclientcreate    在SVM上创建LDAP客户端配置vserverservicesname-service ldap create 将该客户端配置与 SVM 关联vserverservicesname-service ldap create-vserverSVM_name-client-configclient_configuration-cl......
  • 代码随想录算法训练营第二十一天| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的
     530.二叉搜索树的最小绝对差   卡哥建议:需要领悟一下二叉树遍历上双指针操作,优先掌握递归   题目链接/文章讲解:https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%BB%9D%E5%AF%B9%E5%B7%AE.html ......