当前位置: 首页 > news >正文

一文读懂从 CPU 多级缓存 缓存一致性协议(MESI)到 Java 内存模型

文章目录

  • CPU 多级缓存 & 缓存一致性协议(MESI)
    • CPU 多级缓存
    • 缓存一致性协议(MESI)
      • 缓存行(Cache line)
      • 四种缓存状态
      • 缓存行状态转换
        • 多核协同示例
        • 网站体验
      • MESI优化和引入的问题
        • Store Bufferes & Invalidate Queue
          • Store Bufferes & Invalidate Queue 带来的问题
      • 硬件内存模型
        • 读屏障 & 写屏障
      • 思考 & 联系

CPU 多级缓存 & 缓存一致性协议(MESI)

CPU 多级缓存

  • 参考:Java Memory Model

缓存一致性协议(MESI)

  • 多级缓存的出现解决了CPU处理速度和内存读取速度不一致的问题,但是同时也带来缓存不一致的问题,为了解决这个问题,我们引入了缓存一致性协议,常见的缓存一致性协议有MSI,MESI,MOSI,Synapse,Firefly及DragonProtocol等等,下文以MESI协议进行讲述。

企业微信截图_16866534797390.png

缓存行(Cache line)

  • 缓存行是指在缓存中的最小数据单元。

四种缓存状态

  • 缓存行有4个状态,用2个bit表示。
状态描述监听任务
E 独享该Cache line有效,数据被修改,和内存数据一致,数据只存在本Cahe中必须监听所有试图读该缓存行的操作,操作必须在该缓存行写回主存并将状态变为S后执行
M 修改该Cache line有效,数据被修改,和内存数据不一致,数据只存在本Cahe中必须监听所有试图读该缓存行的操作,操作必须在该缓存行写回主存并将状态变为S后执行
S 共享该Cache line有效,数据和内存数据一致,数据存在多个Cache中必须监听其它缓存使该缓存无效或独享该缓存的请求,并将该缓存行变为无效
I 失效该Cache line无效
  • 注:对于M和E状态而言总是精确的,他们在和该缓存行的真正状态是一致的,而S状态可能是非一致的。如果一个处于S状态的缓存失效,另外一个缓存行可能已经独享了该缓存行,但是不会升迁为独享状态,因为失效并不会广播给其它缓存行。

缓存行状态转换

企业微信截图_16866494063738.png

多核协同示例

企业微信截图_16866534382085.png

  • 初始状态:CPUB 存在缓存变量 X 状态为 M
  • CPUA 发出指令读取 X 指令,通过 bus 读取 X,检测到地址冲突,将 CPUB 缓存变量状态置为 S,读取 X 到 CPUA 完成
  • 此时,CPUB 修改缓存变量并通过 bus 写回主存,发现地址冲突,将 CPUA 中的变量从 S 状态置为 I,数据写回主存
网站体验
  • 模拟一致性的整个过程:https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/caches/MESIHelp.htm

MESI优化和引入的问题

  • 在上述多核CPU为保证缓存一致性进行协同的过程中,消息传递的时间远远大于CPU执行时间,如果每次的操作都需要等待协同指令响应完成,那么就会大大降低处理器的处理性能,因此引入了Store Bufferes和Invalidate Queue进行优化。
Store Bufferes & Invalidate Queue
  • 从上述的多核协同案例中我们可以发现,每次修改缓存中的元素,都需要将无效状态指令(Invalidate Acknowledge)执行完才能将修改的数据写回缓存行中,等待协同指令会造成CPU运算能力浪费,因此,Store Bufferes被引入,我们不需要等待协同指令返回就可以将修改的数据写入Store Bufferes,当再次读取时若在Store Bufferes中已存在直接从Buffer中读取(称为“Store Forwarding”),只有当收到所有协同指令响应后才能写回缓存行中。
  • Store Bufferes 是有限的,因此当要写回缓存行时为了更快的得到所有Invalidate Acknowledge指令的响应,实际上也不会立即执行,而是放入了Invalidate Queue中,并立即返回响应,在合适的时机去执行。

企业微信截图_16866534797390.png

Store Bufferes & Invalidate Queue 带来的问题
  • Store buffer 什么时候写回并没有保证
value = 3;void exeToCPUA(){value = 10;isFinsh = true;
}void exeToCPUB(){if(isFinsh){// value 一定等于10?// 如果 Store Bufferes 没有写回那么将导致数据不一致assert value == 10;}
}
  • Invalidate Acknowledge 什么时候执行没有保证
// 当一个CPU尝试读取实际已经失效但未执行 Invalidate Acknowledge 的数据时,会导致数据不一致

硬件内存模型

  • 由于 Store Bufferes & Invalidate Queue 的引入,导致 Store Bufferes 写入缓存行和执行 Invalidate Acknowledge 的时机需要十分合适才能尽可能释放CPU的处理能力,实际上CPU并不知道什么时候会执行,因此将这个任务留给了写程序的人,这就是我们常说的内存屏障。
读屏障 & 写屏障
  • 写屏障 Store Memory Barrier(a.k.a. ST, SMB, smp_wmb)是一条告诉处理器在执行这之后的指令之前,应用所有已经在Store buffer中的保存的指令到缓存行中。

  • 读屏障Load Memory Barrier (a.k.a. LD, RMB, smp_rmb)是一条告诉处理器在执行任何的加载前,应用所有已经在失效队列中的失效操作的指令。

void executedOnCpu0() {value = 10;// 在更新数据之前必须将所有存储缓存(store buffer)中的指令执行完毕。storeMemoryBarrier();finished = true;
}
void executedOnCpu1() {while(!finished);// 在读取之前将所有失效队列中关于该数据的指令执行完毕。loadMemoryBarrier();assert value == 10;
}

思考 & 联系

  • 不同的系统架构有不同的内存屏障,以X86架构为例:读屏障:lfence、写屏障:sfence、读写屏障:mfence。
  • MESI 缓存一致性协议中为了尽可能的提高性能,引入了 Store Bufferes & Invalidate Queue ,将数据具体的失效时机和写入时间交给了内存屏障控制,而 JMM 则基于内存屏障保证数据的可见性。
  • volatile 关键字底层使用了LOCK关键字,LOCK关键字的本质是锁(总线锁或缓存行锁),只是LOCK关键字的一部分能力具备和内存屏障相同的作用,但是和内存屏障还是有一定区别。

相关文章:

一文读懂从 CPU 多级缓存 缓存一致性协议(MESI)到 Java 内存模型

文章目录 CPU 多级缓存 & 缓存一致性协议(MESI)CPU 多级缓存缓存一致性协议(MESI)缓存行(Cache line)四种缓存状态缓存行状态转换多核协同示例网站体验 MESI优化和引入的问题Store Bufferes & Inva…...

MongoDB设置密码

关于为什么要设置密码 公司的测试服务器MongoDB服务对外网开放的,结果这几天发现数据库被每天晚上被人清空的了,还新建了个数据库,说是要支付比特币。查了日志看到有个境外的IP登录且删除了所有的集合。所以为了安全起见,我们给m…...

重生奇迹mu召唤师怎么加点?

召唤师在重生奇迹mu游戏里面是一个智力型的职业,所以智力自然就成为主要加点属性,但是此职业却又算是近身攻击,因为她的技能范围并不算远,而且还是呈现出一种半径趋势,一方面是攻击伤害,另一方面则是辅助造…...

第九章《搞懂算法:决策树是怎么回事》笔记

决策树算法是机器学习中很经典的一个算法,它既可以作为分类算法,也可以作为回归算法。 9.1 典型的决策树是什么样的 决策树算法是依据“分而治之”的思想,每次根据某属性的值对样本进行分类,然后传递给下个属性继续进行分类判断…...

jar包的精细化运营,Java模块化简介 | 京东云技术团队

图:模块化手机概念 一、什么是Java模块化 Java模块化(module)是Java9及以后版本引入的新特性。 官方对模块的定义为:一个被命名的,代码和数据的自描述集合。( the module, which is a named, self-descri…...

「Verilog学习笔记」移位运算与乘法

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 1、在硬件中进行乘除法运算是比较消耗资源的一种方法,想要在不影响延迟并尽量减少资源消耗,必须从硬件的特点上进行设计。根据寄存器的原理&a…...

静态、友好、内在:解析C++中的这些特殊元素和对象复制的优化

W...Y的主页 😊 代码仓库分享💕 🍔前言: 前面我们学习了C中关于类与对象的许多知识点,今天我们继续学习类与对象,最后再总结一下类与对象中的一些关键字内容,以及需要注意的细节。满满的干货…...

【RabbitMQ】 RabbitMQ 消息的延迟 —— 深入探索 RabbitMQ 的死信交换机,消息的 TTL 以及延迟队列

文章目录 一、死信交换机1.1 什么是死信和死信交换机1.2 死信交换机和死信队列的创建方式 二、消息的 TTL2.1 什么是消息的 TTL2.2 基于死信交换机和 TTL 实现消息的延迟 三、基于 DelayExchang 插件实现延迟队列3.1 安装 DelayExchang 插件3.2 DelayExchang 实现消息延迟的原理…...

CVE-2023-34040 Kafka 反序列化RCE

漏洞描述 Spring Kafka 是 Spring Framework 生态系统中的一个模块,用于简化在 Spring 应用程序中集成 Apache Kafka 的过程,记录 (record) 指 Kafka 消息中的一条记录。 受影响版本中默认未对记录配置 ErrorHandlingDeserializer,当用户将容…...

全局变量和局部变量在for循环的使用

imageloc字典作为全局变量,然后添加到全局的列表中,每次for循环都会将最新的元素改变之前for循环添加的元素。而imageloc字典作为局部变量,则不会影响。 import numpy as np originaljson [{"joints_vis": [1,1,1,1,1,1,1,1,1,1,…...

pytorch collate_fn测试用例

collate_fn 函数用于处理数据加载器(DataLoader)中的一批数据。在PyTorch中使用 DataLoader 时,通过设置collate_fn,我们可以决定如何将多个样本数据整合到一起成为一个 batch。在某些情况下,该函数需要由用户自定义以满足特定需求。 import …...

【qemu逃逸】HITB2017-babyqemu 2019数字经济-qemu

前言 由于本地环境问题,babyqemu 环境都没有起起,这里仅仅做记录,exp 可能不正确。 HITB2017-babyqemu 设备逆向 设备定位啥的就不说了,先看下实例结构体: 其中 dma_state 结构体如下: 这里看字段猜测…...

Docker Compose学习笔记

Docker Compose用来做什么? Docker Compose 是Docker官方的开源项目。 Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single …...

基于树 二叉树的回溯搜索算法(DPLL)

1)全称:Davis-Putnam-Logemann-Loveland 2)思想:基于树/二叉树的回溯搜索算法,主要基于两种策略。 单子句规则:如果一个CNF范式中存在单子句L(含有一个文字的子句),取L为…...

【嵌入式】适用于ESP32/ESP8266远程自动烧录工具

文章目录 介绍开始使用下载项目开启服务端开始远程烧录 后记 介绍 esp_remote_flash_tool 是一款基于 esptool.py 的远程自动烧录工具,支持 ESP32 和 ESP8266。 使用场景 基于 ESP-IDF 、ESP8266 NONO SDK、ESP8266 RTOS SDK 进行开发的项目项目代码存储在 Linux…...

服务器遭受攻击如何处理(记录排查)

本文的重点是介绍如何鉴别安全事件以及保护现场的方法,以确保服务器负责人能够在第一时间对安全攻击做出反应,并在最短时间内抵御攻击或减少攻击所带来的影响。 在服务器遭遇疑似安全事件时,通常可以从账号、进程、网络和日志四个主要方面进…...

分享81个工作总结PPT,总有一款适合您

分享81个工作总结PPT,总有一款适合您 PPT下载链接:https://pan.baidu.com/s/13hyrlZo2GhRoQjI-6z31-w?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。知识付…...

什么是DITA?从百度的回答说起

▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 什么是DITA? 把这个问题输入百度,获得以下回答: DITA 是“Darwin Information Typing Architecture”(达尔文信息类型化体系结构)的缩写,它是IBM 公司为OASIS 所支持…...

线扫相机DALSA软件开发套件有哪些

Win10和Win7系统完整SDK目录截图: Sapera Configuration 缓存与内存管理,以及通信端口配置工具,部分功能等效于Detection(查找相机)内的Settings。 Sapera Log Viewer 打开Log Viewer后会显示之前发生过的所有与Sapera LT软件有关的运行信息…...

Scala集合操作

1 集合简介 Scala 中拥有多种集合类型,主要分为可变的和不可变的集合两大类: 可变集合: 可以被修改。即可以更改,添加,删除集合中的元素; 不可变集合类:不能被修改。对集合执行更改,…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...