多核缓存一致性问题及解决方案MESI协议《深入浅出计算机组成原理》学习笔记 Day 4

news2024/9/21 14:50:35

系列文章目录

这是本周期内系列打卡文章的所有文章的目录

  • 《Go 并发数据结构和算法实践》学习笔记 Day 1
  • 《Go 并发数据结构和算法实践》学习笔记 Day 2
  • 《说透芯片》学习笔记 Day 3

文章目录

  • 系列文章目录
  • 前言
  • 一、多核缓存一致性从何而来(What)
  • 二、怎么解决(How、Why):总线嗅探机制 + MESI 协议
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

学习内容:https://time.geekbang.org/column/article/109874
主客体之间的联系:
这次了解了工作中遇到的多核缓存一致性问题,在GEM5 RISC-V多核仿真环境中,多核共享内存的体系结构。在内存池分配算法时会遇到多核竞争和缓存一致性的问题。


提示:以下是本篇文章正文内容,下面案例可供参考

一、多核缓存一致性从何而来(What)

这点文章解释得很清楚,我用文中的图和自己的文字来简要串一下。

结构上,多核 CPU 里的每一个 CPU 核,都有独立的属于自己的 L1 Cache 和 L2 Cache。多个 CPU 之间,只是共用 L3 Cache 和主内存。

在这里插入图片描述
当多个核上,去更新各自的缓存时,其实跟缓存的策略有关:写更新、写穿透。写更新策略,就好遇到多核缓存一致性的问题。

顺便提一下基础问题,为啥CPU有几级缓存:CPU Cache 解决的是内存访问速度和 CPU 的速度差距太大的问题

Step1:
在这里插入图片描述
Step2:
在这里插入图片描述

当一个核更新缓存时,另一个核的cacheline也更新了,如果这些更新在第三个核可见,那它的观测会以哪个为准?这其中有时序问题、有可见性。

二、怎么解决(How、Why):总线嗅探机制 + MESI 协议

  1. 引入机制:写传播与事务串行化

为了解决这个缓存不一致的问题,我们就需要有一种机制,来同步两个不同核心里面的缓存数据。那这样的机制需要满足什么条件呢?我觉得能够做到下面两点就是合理的。

第一点叫写传播(Write Propagation)。写传播是说,在一个 CPU 核心里,我们的 Cache 数据更新,必须能够传播到其他的对应节点的 Cache Line 里。
第二点叫事务的串行化(Transaction Serialization),事务串行化是说,我们在一个 CPU 核心里面的读取和写入,在其他的节点看起来,顺序是一样的。

如果有数据库了解的,是不是“事务化”那个味道了,其实ACID是比较强的事务化约束。当然也是一个解决方案标杆了。

来了,这个机制的重点:解决多个 CPU 核心之间的数据传播问题、保证时序性(锁)。

在 CPU Cache 里做到事务串行化,需要做到两点,第一点是一个 CPU 核心对于数据的操作,需要同步通信给到其他 CPU 核心。第二点是,如果两个 CPU 核心里有同一个数据的 Cache,那么对于这个 Cache 数据的更新,需要有一个“锁”的概念。

  1. 第一个问题:总线嗅探机制

由谁来传播多个 CPU 核心之间的数据:总线。如果是软件设计,可能就来个观察者模式了,总线这是实体。

最常见的一种解决方案呢,叫作总线嗅探(Bus Snooping)。本质上就是把所有的读写请求都通过总线(Bus)广播给所有的 CPU 核心,然后让各个核心去“嗅探”这些请求,再根据本地的情况进行响应

  1. 第二个问题:MESI 协议
    基于总线嗅探机制,其实还可以分成很多种不同的缓存一致性协议。不过其中最常用的,就是今天我们要讲的 MESI 协议。和很多现代的 CPU 技术一样,MESI 协议也是在 Pentium 时代,被引入到 Intel CPU 中的。

Cacheline的操作方式是:标记

MESI 协议的由来呢,来自于我们对 Cache Line 的四个不同的标记,分别是:

  • M:代表已修改(Modified)
  • E:代表独占(Exclusive)
  • S:代表共享(Shared)
  • I:代表已失效(Invalidated)

MESI 协议,是一种叫作写失效(Write Invalidate)的协议。在写失效协议里,只有一个 CPU 核心负责写入数据,其他的核心,只是同步读取到这个写入。在这个 CPU 核心写入 Cache 之后,它会去广播一个“失效”请求告诉所有其他的 CPU 核心。其他的 CPU 核心,只是去判断自己是否也有一个“失效”版本的 Cache Block,然后把这个也标记成失效的就好了。

相对于写失效协议,还有一种叫作写广播(Write Broadcast)的协议。在那个协议里,一个写入请求广播到所有的 CPU 核心,同时更新各个核心里的 Cache。

在这里插入图片描述
4. 进一步:状态图

整个 MESI 的状态,可以用一个有限状态机来表示它的状态流转。需要注意的是,对于不同状态触发的事件操作,可能来自于当前 CPU 核心,也可能来自总线里其他 CPU 核心广播出来的信号。状态机流转图如下:
在这里插入图片描述


总结

提示:这里对文章进行总结:

想要实现缓存一致性,关键是要满足两点。第一个是写传播,也就是在一个 CPU 核心写入的内容,需要传播到其他 CPU 核心里。更重要的是第二点,保障事务的串行化,才能保障我们的数据是真正一致的,我们的程序在各个不同的核心上运行的结果也是一致的。这个特性不仅在 CPU 的缓存层面很重要,在数据库层面更加重要。

内容来源:
极客时间:39 | MESI协议:如何让多核CPU的高速缓存保持一致?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习TinyRenderer

1图形学图形学,简单来讲是将3D数据以各个视觉效果呈现在2D画布(屏幕)上;2 TinyRendererTinyRenderer从零开始实现了一个渲染器;TinyRenderer代码地址:https://github.com/ssloy/tinyrenderer内容介绍在&…

ThreeDXF预览DXF文件集成到vue项目中

由于网上资料都是html的,而自己需要嵌入到vue项目中,查找资料都是在index.html引入script脚本,在写到Vue文件中,但是我尝试过了,各种报错,找不到,window. 根本无法用,于是改注入main…

主动服务再升级!这个品牌引领智慧生活进入“深度体验”

文|智能相对论作者| 佘凯文1月15日,一档央视新闻的新概念科技节目《KU A !酷啊未来 | 中国科技创新之夜》正式播出,来自中国科学院的多领域顶级科学家及许多科技企业、青年科研人员代表,共同分享了科技创新之路上的成果和突破。不…

EDI文件处理失败如何汇总?

知行之桥EDI系统在后台自动运行的时候,有时会遇到处理文件失败的情况,导致失败的原因有很多,部分客户希望把处理失败的文件都汇总起来,便于分析失败原因,减少未来再出现类似的错误,同时也能够方便后期排查&…

ERD Online 4.0.7 在线数据库建模、元数据管理(免费、私有部署)

4.0.7❝ feat(erd): 增加新春火红主题feat(erd): 增加团队协作人员进入、退出提示fix(erd): 修复权限配置页面显示混乱doc(erd): 修改更新通告地址❞变化一览 增加新春火红主题 新春主题所有按钮、菜单、元素由原来的蓝色改为火红色修复权限配置页面显示混乱 团队功能增加团队协…

【算法基础】快速排序

目录 一、快速排序核心思想 二、快速排序步骤 (1)暴力做法 (2)双指针做法 三、代码模板 四、边界问题 五、总结 一、快速排序核心思想 分治,即将一个序列划分成左部分小于等于x,右部分大于等于x 二、快速排序步骤 ①确定一个分界点x。分界点可以是左端 a[l]、右…

【Linux】两个故事带你使用git命令行

目录一.历史故事背景经过git的诞生二.git版本管理1.小故事2.理解版本管理三.git的使用1.仓库的创建2.安装git和仓库克隆3.上传代码三板斧addcommitpushgithub和gitee是代码的托管平台,我们上传代码或文件在其中,来管理我们的代码和不同版本软件。 在多人…

【操作系统】——主流的操作系统(带你快速了解)

📜 “作者 久绊A” 专注记录自己所整理的Java、web、sql等,IT技术干货、学习经验、面试资料、刷题记录,以及遇到的问题和解决方案,记录自己成长的点滴。 🍁 操作系统【带你快速了解】对于电脑来说,如果说…

【Java IO流】字符集使用详解

文章目录前言ASCIIGBKUnicode为什么会出现乱码前言 上一节关于字节流的文章中,在使用字节流读取本地文件中的数据时,文件中只存放了英文,而并没有存放中文数据。我们还提到了不建议使用字节流读取纯文本文件的数据,否则会出现乱码…

Elasticsearch7.8.0版本高级查询—— 匹配查询文档

目录一、初始化文档数据二、匹配查询文档示例2.1、概述2.2、示例一、初始化文档数据 在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/1,请求体内容为: {"name":"张三","age&…

浅谈php原生类的利用 2(ErrorSoapClientSimpleXMLElement)

除了上篇文章浅谈 php原生类的利用 1(文件操作类)_php spl原生类_葫芦娃42的博客-CSDN博客 里提到的原生利用文件操作类读文件的功能,在CTF题目中,还可以利用php原生类来进行XSS,反序列化,SSRF,XXE。 常用内置类: Dire…

【SAP Abap】X档案:SAP Native SQL 简介及实现方式(EXEC SQL、ADBC、AMDP)

SAP Native SQL 简介及实现方式(EXEC SQL、ADBC、AMDP)1、SAP Open SQL 与 Native SQL 的特点2、Native SQL 的实现方式方式一:Exec SQL(1)获取单值(2)获取多行(3)游标应…

TCP协议的长连接和短连接详解

一 前言TCP在真正开始进行数据传输之前,Server 和 Client 之间必须建立一个连接。当数据传输完成后,双方不再需要这个连接时,就可以释放这个连接。TCP连接的建立是通过三次握手,而连接的释放是通过四次挥手。所以说,每…

【SpringCloud】Eureka的基本原理与使用

【SpringCloud】Eureka的基本原理与使用 一、Eureka-提供者与消费者 【问】如果服务A调用了服务B,而服务B又调用了服务C,服务B的角色是什么? 二、Eureka的结构和作用 什么是Eureka? Eureka 解决服务调用的问题 order-servic…

博物馆3d数字化全景展示设计方案

作为近几年新兴的营销方式,交互式营销能够让消费者对产品从主动感兴趣到互动体验,甚至自主自发传播,达到“在销售中传播,在传播中销售”的目的。进入数字体验经济时代,当3d数字化展示技术遇上传统行业,3d数…

Redis原理篇(三)通信协议

一、RESP协议 1、定义 Redis是一个cs架构的软件,通信一般分两步: 客户端client向服务端server发送一条命令服务端解析并执行命令,返回响应结果给客户端 因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规…

HashMap源码学习:JDK1.8版本源码解析

文章导航 HashMap源码学习:红黑树原理详解 HashMap源码学习:JDK1.8版本源码解析 目录文章导航前言正文HashMap重要属性HashMap构造方法HashMap扩容方法HashMap链表迁移HashMap红黑树迁移HashMap链表转红黑树HashMap红黑树转链表HashMap添加数据HashMap移…

让你彻底明白Java SPI与SpringBoot自动配置,内附实例代码演示

一、Java SPI的概念和术语 SPI:全称是Service Provider Interface:是一种基于ClassLoader来发现并加载服务的机制 SPI由三个组件构成:Service、Service Provider、ServiceLoader Service:是一个公开的接口或抽象类,定…

数说菊风2022

春风传捷报, 梅韵贺新年! 2022,已悄然划过, 就让我们用数字说话, 述说这年的精彩! 树十大标杆案例 国际运营商战略合作——Telkomsel 携手印尼运营商Telkomsel在RCS融合通信和RTC实时音视频领域形成合…

golang入门笔记——kitex

WSL的安装 由于Kitex并不支持Linux,所以需要首先安装WSL2 WSL一句话来说就是微软出的一个虚拟机工具 Win11下安装WSL2的步骤为: 1.“开始菜单”搜索功能,打开“启动或关闭Window功能” 2.勾选以下功能 1.适用于Linux的Window子系统 2.虚…