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

CPU缓存架构+Disruptor内存队列

文章目录

  • CPU缓存架构+Disruptor内存队列
    • CPU缓存架构
      • 介绍
      • 缓存一致性问题
      • 缓存一致性协议
      • MESI协议
      • 伪共享问题
    • 高性能内存队列Disruptor

CPU缓存架构+Disruptor内存队列

CPU缓存架构

介绍

cpu与内存的交互数据之间,有一个高速缓存层。有些处理器有3层缓冲,有些处理器有4层缓存

当下CPU都是有多核,每核cpu都有一份自己的高速缓存

内存中的数据读取到高速缓存中每次读取的数据至少是一次缓存行64字节

在这里插入图片描述



缓存一致性问题

多个cpu将数据赋值到高速缓存中,再进行更新操作,先是修改的缓存中的数据,然后在刷新回主内存,那么此时就有缓存一致性问题。

多个cpu缓存中的数据与主存中不一致,如果都直接刷新回主内存那么就肯定会出现丢失更新的问题。

解决缓存一致性问题的方案:

  • CAS原子指令
  • 总线锁定。上图中数据的传输是使用总线,直接给总线加一把锁。这种方式对性能较低
  • 缓存锁定。利用缓存一致性协议实现


缓存一致性协议

缓存一致性协议是一种用于确保处理器缓存中的数据和主存中的数据一致的机制。它的实现是基于总线窥探实现的

总线窥探

总线窥探是缓存中的一致性控制器监视总线事务的一种方案。在计算机中,数据通过总线在处理器和内存之间传递。每次处理器和内存之间的数据传递都是通过一系列步骤来完成的,这一系列步骤称之为总线事务

总线窥探的协议类型有两种:写失效、写更新


工作原理

当特定数据被多个缓存共享时,处理器修改了共享数据的值,更改必须传播到所有其他具有该数据副本的缓存中。这种更改传播可以防止系统违反缓存一致性。


协议

缓存一致性协议在多处理器系统中应用于高速缓存一致性。为了保持一致性,人们设计了各种模型和协议,如MSI、MESI(又名Illinois)、MOSI、MOESI、MERSI、MESIF、write-once、Synapse、Berkeley、Firefly和Dragon协议。



MESI协议

MESI协议是一个基于写失效的缓存一致性协议,是支持回写(write-back)缓存的最常用协议。

它又四种状态:

  • M 已修改(Modified)

    缓存行是脏的(dirty),与主存的值不同。如果别的CPU内核要读主存这块数据,该缓存行必须回写到主存,状态变为共享(S).

  • E 独占(Exclusive)

    缓存行只在当前缓存中,但是干净的——缓存数据同于主存数据。当别的缓存读取它时,状态变为共享;当前写数据时,变为已修改状态。

  • S 共享(Shared)

    缓存行也存在于其它缓存中且是未修改的。缓存行可以在任意时刻抛弃。

  • I 无效(invalid)

    缓存行是无效的


处理器要访问一个数据先去缓存中找,如果没找到就去主存中找,拷贝一份数据副本到高速缓存中,此时该数据只有这一个处理器使用,是独占E

之后有有处理器使用了这个数据,会触发缓存到缓存的复制,目的是减少对内存的访问提高性能,现在两个处理器的缓存中数据的状态是共享S

处理器1修改了这个数据,处理器1中的数据状态就变为了已修改M,其他处理器该数据就变为了无效I



伪共享问题

使用了缓存一致性协议,那么就需要考虑伪共享问题。

伪共享问题的在一个缓存行中存在多个变量的数据,可能处理器1操作的是x,处理器2操作的是y。但是处理器1先修改 再将处理器2的缓存行置于无效,那么处理器2就又需要重新读取一份数据到缓存中。

解决伪共享问题常见的方法就是缓存行填充。就比如我们创建一个类实例,分配的是一块连续的内存空间,其中多个连续的成员变量就很有可能是在一个缓存行中

  • 缓存行填充

    class Pointer {volatile long x;//避免伪共享: 缓存行填充,将x和y分开,中间插入几个无用的成员变量long p1, p2, p3, p4, p5, p6, p7;volatile long y;
    }
    
  • 使用 @sun.misc.Contended 注解(java8)

    注意需要配置jvm参数:-XX:-RestrictContended

    class Pointer {// 避免伪共享: @Contended +  jvm参数:-XX:-RestrictContended  jdk8支持//@Contendedvolatile long x;volatile long y;
    }
    
  • 使用ThreadLocal



高性能内存队列Disruptor

JUC包下的阻塞队列有以下几个缺点:

  • 大部分采用ReentrantLock锁,加锁通常比较影响性能
  • 如果对队列使用数组的数据结构,那么又有伪共享问题

而Disruptor的高效体现到以下几个方面:

  • 属性填充,避免了位共享
  • 无锁,全采用的CAS方式
  • 使用的环形数组,计算数组存放下标
  • 基于事件驱动的生产者消费者模型(观察者模式)

相关文章:

CPU缓存架构+Disruptor内存队列

文章目录CPU缓存架构Disruptor内存队列CPU缓存架构介绍缓存一致性问题缓存一致性协议MESI协议伪共享问题高性能内存队列DisruptorCPU缓存架构Disruptor内存队列 CPU缓存架构 介绍 cpu与内存的交互数据之间,有一个高速缓存层。有些处理器有3层缓冲,有些…...

Spark SQL join操作详解

一、 数据准备 本文主要介绍 Spark SQL 的多表连接,需要预先准备测试数据。分别创建员工和部门的 Datafame,并注册为临时视图,代码如下: val spark SparkSession.builder().appName("aggregations").master("lo…...

设计模式-day04

5,结构型模式 5.6 组合模式 5.6.1 概述 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,…...

线段树的学习(2023.4.5)

今天我来学习线段树 首先它是树有着树的结构,线段树由于本身是专门用来处理区间问题的 它的作用可以处理区间的问题拥有更快的速度. 对于每一个子节点而言,都表示整个序列中的一段子区间;对于每个叶子节点而言,都表示序列中的单个元素信息…...

Java 实现excel、word、txt、ppt等办公文件在线预览功能

相信大家在开发的过程中都会遇到在线预览功能,有没有想过如何通过java来实现excel、word、txt、ppt等办公文件在线预览功能?今天我们就来解决这一疑问! 其实,网上还是有些公司对这一功能提供了收费服务。那么,如何实现…...

《Vue3实战》 第九章 路由

1、安装路由 cnpm install vue-router42、router-link应用 2.1、创建views/OrderList.vue组件 <template> <h1>订单列表页面......</h1> </template> <script> export default{name: OrderList,data(){return{arr:[4,2,5]} } …...

ToBeWritten之物联网Zigbee协议

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…...

【万象奥科】RZ/G2UL网关内存压力测试

测试目的 内存压力测试的目的是测试系统内存的稳定性和可靠性&#xff0c;以便确定系统是否能够在各种负载情况下正常运行。其主要目的有&#xff1a; 测试内存的正确性&#xff1a;通过模拟各种内存负载情况&#xff0c;例如写入随机数据、重复写入相同数据、使用指定的模式…...

C++中的继承

面向对象的三大特性 封装继承多态 继承的概念和定义 继承的本质就是类层次的复用。 继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段.它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xf…...

SpringRetry接口异常优雅重试机制

场景&#xff1a; 某些场景下&#xff0c;如果接口出现异常需要进行重试&#xff0c;例如网络抖动、调用接口超时等并非接口代码导致的报错&#xff0c;此时可以进行接口重试机制 1、导入 spring retry 重试依赖 <!-- spring retry --><dependency><groupId>…...

2023年全国最新高校辅导员精选真题及答案46

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 27.充沛的精力和顽强的毅力是教师意志品质的体现。 答案&#xff1a;正确 28.规范与约束…...

程序员为了女朋you进了华为,同学去了阿里,2年后对比收入懵了

什么样的工作才是好工作&#xff1f;每当遇到这个问题&#xff0c;我们的答案总是出奇的一致&#xff1a;钱多事少离家近。 然而现实总是残酷的&#xff0c;日前&#xff0c;有网友在某社交论坛发帖称&#xff1a;自己为了女朋友留在了成都进入华为工作&#xff0c;而自己的同…...

Linux中的算法分离手段

0. 简介 参数分离对于绝大多数算法开发来说收益是非常大的&#xff0c;因为我们都知道&#xff0c;随着平台的更替&#xff0c;很多时候如果说数据流和算法交叠在一起&#xff08;即接口与实现合在一起&#xff09;。这将有可能会导致在迁移平台时候会导致代码难以维护&#x…...

机器学习实战:Python基于Logistic逻辑回归进行分类预测

目录1 前言1.1 Logistic回归的介绍1.2 Logistic回归的应用2 iris数据集数据处理2.1 导入函数2.2 导入数据2.3 简单数据查看3 可视化3.1 条形图/散点图3.2 箱线图3.3 三维散点图4 建模预测4.1 二分类预测4.2 多分类预测5 讨论1 前言 1.1 Logistic回归的介绍 逻辑回归&#xff…...

Leetcode.404 左叶子之和

题目链接 Leetcode.404 左叶子之和 easy 题目描述 给定二叉树的根节点 root&#xff0c;返回所有 左叶子 之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以…...

Android 11.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(二)

1.前言 在11.0的系统rom定制化开发中,在原生系统SystemUI下拉状态栏的下拉通知栏的背景默认是白色四角的背景, 由于在产品设计中,在对下拉通知栏通知的背景需要把四角背景默认改成圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景, 然后通过systemui的通知…...

C语言CRC-16 IBM格式校验函数

C语言CRC-16 IBM格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同厂家通过对输入数…...

Maven高级-聚合和继承

Maven高级-聚合和继承3&#xff0c;聚合和继承3.1 聚合步骤1:创建一个空的maven项目步骤2:将项目的打包方式改为pom步骤3:pom.xml添加所要管理的项目步骤4:使用聚合统一管理项目3.2 继承步骤1:创建一个空的Maven项目并将其打包方式设置为pom步骤2:在子项目中设置其父工程步骤3:…...

如何写出10万+ Facebook 贴文?

想要创作一篇优秀的Facebook贴文&#xff0c;首先要考虑以下几个问题&#xff1a; 1.文案特点 一篇清晰简洁的文案有助于受众在有限的浏览时间内快速了解你想要展示的信息。根据以往经验&#xff0c;文案内容最好保持在20个汉字以内&#xff0c;加上链接描述最好也不要超过50…...

图像处理数据集

BSDS500 Berkeley Segmentation Dataset 500 是第一个用于评估超像素算法的数据集。对于参数优化&#xff0c;使用了验证集。 500张数据集200训练集train100验证集val200测试集test 每张图像有 5 个不同的高质量地面真值分割&#xff08;groundTruth,是.mat文件&#xff09; …...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...