目标是架构师,但到现在还不会MESI?

百万架构师第四十七课:并发编程的原理(二)|JavaGuide ​ 任何对象在我们 JVM 层面有一个 oop 和 oopDesc 的对应。oop.hpp会存在一个 mark 的对象头,对象头用来存储锁标志的。这个锁标志,是用来存储对应的偏向锁、轻量锁等的标志。​ 锁是存在对象头里边的。 阅读详情

最近在补充学习MESI 为了记录自己的努力成长,同时让大家和我一起成长特地把自己关于MESI的学习做成了笔记分享给大家 :

1.CPU为何要有高速缓存

CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。

在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。

  • 时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。比如循环、递归、方法的反复调用等。

  • 空间局部性(Spatial Locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。比如顺序执行的代码、连续创建的两个对象、数组等。

带有高速缓存的CPU执行计算的流程

  • 1. 程序以及数据被加载到主内存

  • 2. 指令和数据被加载到CPU的高速缓存

  • 3. CPU执行指令,把结果写到高速缓存

  • 4. 高速缓存中的数据写回主内存

目前流行的多级缓存结构

由于CPU的运算速度超越了1级缓存的数据I\O能力,CPU厂商又引入了多级的缓存结构。

多级缓存结构

       

2.多核CPU多级缓存一致性协议MESI

多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个 一致性的协议MESI。

MESI协议缓存状态

MESI 是指4中状态的首字母。每个Cache line有4个状态,可用2个bit表示,它们分别是:

缓存行(Cache line):缓存存储数据的单元。注意:对于M和E状态而言总是精确的,他们在和该缓存行的真正状态是一致的,而S状态可能是非一致的。如果 一个缓存将处于S状态的缓存行作废了,而另一个缓存实际上可能已经独享了该缓存行,但是该缓存却不会 将该缓存行升迁为E状态,这是因为其它缓存不会广播他们作废掉该缓存行的通知,同样由于缓存并没有保 存该缓存行的copy的数量,因此(即使有这种通知)也没有办法确定自己是否已经独享了该缓存行。从上面的意义看来E状态是一种投机性的优化:如果一个CPU想修改一个处于S状态的缓存行,总线事务需

要将所有该缓存行的copy变成invalid状态,而修改E状态的缓存不需要使用总线事务。

MESI状态转换

理解该图的前置说明:

1.触发事件

2.cache分类:

前提:所有的cache共同缓存了主内存中的某一条数据。

本地cache:指当前cpu的cache。

触发cache:触发读写事件的cache。

其他cache:指既除了以上两种之外的cache。

注意:本地的事件触发 本地cache和触发cache为相同

上图的切换解释:

下图示意了,当一个cache line的调整的状态的时候,另外一个cache line 需要调整的状态。

举个栗子来说:

假设cache 1 中有一个变量x = 0的cache line 处于S状态(共享)。

那么其他拥有x变量的cache 2、cache 3等x的cache line调整为S状态(共享)或者调整为 I 状态(无效)。

多核缓存协同操作

假设有三个CPU A、B、C,对应三个缓存分别是cache a、b、 c。在主内存中定义了x的引用值为0。

       

        

单核读取

那么执行流程是:

CPU A发出了一条指令,从主内存中读取x。

从主内存通过bus读取到缓存中(远端读取Remote read),这是该Cache line修改为E状态(独享).

       

        

双核读取

那么执行流程是:

  1. CPU A发出了一条指令,从主内存中读取x。

  2. CPU A从主内存通过bus读取到 cache a中并将该cache line 设置为E状态。

  3. CPU B发出了一条指令,从主内存中读取x。

  4. CPU B试图从主内存中读取x时,CPU A检测到了地址冲突。这时CPU A对相关数据做出响应。此时x 存储

  5. 于cache a和cache b中,x在chche a和cache b中都被设置为S状态(共享)。

同步数据

那么执行流程是:

  1. CPU B 发出了要读取x的指令。

  2. CPU B 通知CPU A,CPU A将修改后的数据同步到主内存时cache a 修改为E(独享)

  3. CPU A同步CPU B的x,将cache a和同步后cache b中的x设置为S状态(共享)

       

3.缓存行伪共享

什么是伪共享?

CPU缓存系统中是以缓存行(cache line)为单位存储的。目前主流的CPU Cache 的

Cache Line 大小都是64Bytes。在多线程情况下,如果需要修改“共享同一个缓存行的变 量”,就会无意中影响彼此的性能,这就是伪共享(False Sharing)。

举个例子: 现在有2个long 型变量 a 、b,如果有t1在访问a,t2在访问b,而a与b刚好在同一个

cache line中,此时t1先修改a,将导致b被刷新!

怎么解决伪共享?

Java8中新增了一个注解:@sun.misc.Contended。加上这个注解的类会自动补齐缓

存行,需要注意的是此注解默认是无效的,需要在jvm启动时设置 -XX:RestrictContended 才会生效。

到这里我们对于MESI已经有了一定的了解,除开今天分享的内容,我这里专门和几个大佬准备了一份技术进阶+项目经验+面试突击的资料,包含了十多个互联网大厂的面试题、面经汇总和20个技术栈资料合集,吃透这份资料,技术面和面试关完全不是问题!同时还有大厂项目实战的视频解析,那些你缺乏的项目经验都可以从中积累。

在这期间有面试的,可以根据下面的资料抓紧准备一下,对大厂面试、技术进阶和跳槽都非常有用!!!

 点击下方名片可以直接领取

从CY7C007AV的信号量到Linux内核:深入理解多核/多处理器间的‘锁’与通信机制 本文深入探讨了从CY7C007AV硬件信号量到Linux内核同步机制的多核/多处理器间并发控制技术。通过分析硬件信号量的电路实现与性能优势,揭示了现代操作系统同步原语如何基于处理器架构特性设计,并详细解析了Linux内核中自旋锁、mutex等同步机制的实现原理与优化策略,为开发者提供高效并发控制的实践指导。 阅读详情

相关推荐

百万架构师第四十五课:并发编程的基础|JavaGuide

​ 如果缓存在处理器缓存中的内存区域在 LOCK 操作期间被锁定,当它执行操作回写内存的时候,处理不再总线上声明 LOCK 信号,而是修改内部的缓存地址,然后通过缓存一致性机制来保证操作的原子性,因为缓存一致性会阻止同时修改两个以上处理器缓存的内存区域的数据,当其他处理器会写已经被锁定的缓存行的数据时会导致该缓存行无效。当我们获得锁的时候。​ 有的时候,我们可能需要让异步执行的线程在执行完以后,提供一个返回值到当前的主线程,主线程需要这个值进行后续的逻辑处理,那么这个时候,就需要带返回值的线程了。

weixin_60669486的博客 546

操作系统底层工作原理

内存中读取的数据会先放到L3,再将L3的数据拷贝到L2,再将L2的数据拷贝到L1,再从L1中的数据拷贝到CPU的寄存器中,CPU操作的存储空间永远是寄存器中存取。内存的发展速度远远跟不上CPU的发展速度,因此,CPU的性能远远要高于内存,由于CPU到内存中读取指令是一个很复杂的过程,效率很低。那么为了减少CPU和内存之间的交互,在CPU上设计了缓存。安装CPU的空间局部性原则,第一种的循环方式远远要高于第二种,因为CPU在按行循环的时候就将相邻的数据加载到内存中,而按列则只能一个一个加载到CPU的内存中。.

java123456111的博客 2619

系统存储机制深度剖析技术文章

本文系统解析存储系统的架构原理与核心技术。首先定义存储机制为数据全生命周期管理体系,分析其可靠性、性能、扩展性和可用性四大核心价值,梳理从机械存储到固态存储再到云存储的技术演进历程。随后深入剖析存储层次结构,对比寄存器、缓存、主存、辅存等不同层级的性能参数与成本特性,详细解读DRAM、SSD、HDD等存储设备的技术原理与应用场景。在核心机制部分,重点分析文件系统的超级块、inode等关键结构,以及缓存填充、页面调度等数据迁移机制。文章面向系统工程师和存储架构师,提供从硬件特性到软件调度的全方位技术解析,为存

1037

CPU缓存一致性(MESI)协议

CPU高速缓存(Cache Memory) CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。 在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。 时间局部性(Temporal Locality):

fangmeng1997的博客 334

MPC7450处理器深度解析:PowerPC G4微架构与缓存设计

在处理器设计中,超标量流水线和多层次缓存子系统是提升指令级并行和缓解内存墙的关键技术。超标量架构通过多条并行流水线实现指令级并行,而缓存层次则通过L1、L2、L3的协同设计平衡延迟与带宽。这些技术对于高性能计算和嵌入式系统至关重要,能显著提升数据包处理、科学计算等场景的效率。MPC7450作为PowerPC G4时代的代表,其深度七级流水线、11个独立执行单元以及创新的片上L2与片外L3缓存设计,正是这些原理的经典实践。该处理器通过AltiVec向量单元和精细的缓存策略,为网络路由器和多媒体处理提供了强大的

weixin_31211977的博客 209

用Python 绘制一个只属于你自己的世界地图

Python之所以这么流行,是因为它不仅能够应用于科技领域,还能用来做许多其他学科的研究工具,绘制地图便是其功能之一。 今天我们用matplot工具包之一的mpl_toolkits来绘制世界地图,这是一个简单的可视化工具,如果希望绘制更加复杂的地图,可以考虑使用Google Maps API,不过这不在我们今天的讨论范围之内。 1.安装 为了能够顺利开展本项目,你需要先安装以下依赖,在cmd或Terminal中输入以下命令: pipinstallnumpy pipinstallm...

qq_38887171的博客 1872

面试题大全-操作系统面试题

面试中关于操作系统相关面试题总结,持续更新,满满干货,建议收藏!

生命的意义在于创造和毁灭 1134

SAP 财务快速记账之--科目分配模型(Account assignment model )

SAP FICO 运维解决方案

lijinbao171022的博客 1773

并发编程相关面试题(持续更新)

1.juc包提供了哪些工具?用在什么场景? 2.线程池有哪些定制参数?分别有什么作用?拒绝策略有哪些?哪种拒绝策略好? 3.Executors提供了哪些类型的线程池?分别用于什么场景? 4.AQS提供了哪些扩展点? 5.AQS实现原理大概是怎么样的? 6.ReentrantLock和synchronized的区别?synchronized锁升级过程? 7.ReentrantLock如何实现synchronized不具备的公平与非公平性呢? 8.ThreadLocal实现原理是怎么样的?使用时需要注意什么?.

FDXCG_X的博客 1421

测站坐标系、地心非惯性系、经纬高互转

目录 一、经纬高转直角坐标系互转 1.1 python代码 二、wgs84转cgcs2000的转换矩阵如下 虽然cgcs2000与wgs84差别很小,但是我比较较真,还是做了两个坐标系的转换。 一、经纬高转直角坐标系互转 此处可参考链接(百度文库用手机浏览器可以打开看全部的): (1)第四章地球椭球及其数学详解 (2)第四章椭球数学变换16节 (3)大地测量学基础[1](7)(控制) 转换公式如下: LBH转XYZ: a为半长轴,e为偏心率 XYZ转LBH: a为半长轴

${王小贱}的博客 2万+

如何根据芯片手册时序图编写驱动程序

如何根据芯片手册时序图编写驱动程序 对于电子开发者来说,刚刚拿到一个芯片,常用的芯片可以参考网上的例程来做深入了解,对于一个不常用的芯片来说,Datasheet几乎是使用芯片的唯一的资料,所以根据Datasheet时序图写出对应的驱动程序就尤为重要。 本文根据一个简单的例子来阐述根据时序图来编写对应的程序过程。旨在讲解对于初学者应该怎么利用芯片的时序图编写符合要求的底层驱动程序(老鸟请跳过)。 下载芯片的Datasheet,(个人常用http://www.21icsearch.com/)如..

weixin_36447711的博客 1万+

计组--操作系统底层原理

计算机的组成 pc(程序计数器):存储的是内存中程序下一条指令的地址 Registers(寄存器): 通过PC的值,找到对应的指令,通过总线把这条数据拿到CPU中来做计算,数据从内存中拿进来存储在CPU的Registers中 ...

qq_43204550的博客 1419

高云FPGA系列教程(7):ARM GPIO外部中断

高云GN1NSR-4C共有16个GPIO,每个GPIO可配置成输入或输出模式,支持中断输入,触发方式可选择:上升沿、下降沿、高电平、低电平触发。中断优先级可通过NVIC进行设置,支持 0-7 级可编程中断优先级。

whik1194的博客 1376

大厂面试题笔记 | 目标是架构师,但到现在还不会MESI?

给大家分享一下我的 MESI 笔记~

m0_68103666的博客 116

Python爬虫实战——如何自动爬取百度搜索结果页面

本文介绍了如何使用Python爬虫抓取百度搜索结果页面的内容,包括如何构建搜索URL、获取页面HTML、解析内容、处理翻页以及存储数据等。通过该教程,您可以轻松实现批量抓取百度搜索结果,并为后续的数据分析和处理打下基础。希望本文能为您在爬虫开发、数据分析等领域提供帮助。如果您在实际应用过程中遇到问题,可以参考反爬虫应对策略,并结合实际需求进行调整。

2201_76125261的博客 1711

LM358模拟声音传感器原理图设计,已量产(声音传感器)

最近在做智能家居设备的声音触发模块时,搭了个基于 LM358 的模拟声音传感器电路 —— 不用复杂的专用芯片,靠通用运放就能把环境声音转化为可被单片机 AD 采集的电压信号,成本压得很低,实际调试下来灵敏度和稳定性都够用。今天把这个电路拆解开,聊聊每部分的设计思路。

不脱发的程序猿 475

Spring 5.x 源码之旅-85Qualifier注解三

这个方法其实就是检查候选的bean定义里有没有相关Qualifier注解,先检查下bean定义有没有添加type类型的全限定类型和短类名的对象,如果没有的话就看有没有设置type类型的对象,还没有的话就检查bean定义的工厂方法上有没有这个type注解,我们这个刚好在这上面,再没有的话就从bean装饰的定义中找注解,最后为空的话就从bean定义的目标类上去找。如果存在的话,就获取他的属性和type限定注解上的属性做匹配。最后返回是否找到或者是否匹配上。Class

smart_an的专栏 483

PCL 八叉树的使用

八叉树(Octree)是一种空间划分的数据结构,广泛应用于三维点云的处理和分析。八叉树通过将空间递归地划分为八个子区域,可以有效地组织和索引三维点数据,提升点云的查询、降采样和配准等操作的效率。

纵马踏花向自由 1659

RISC-V多核一致性:缓存一致性协议与内存屏障实战指南

RISC-V多核一致性是构建高性能多核处理器的核心技术,而缓存一致性协议与内存屏障是实现这一目标的关键机制。本文将深入探讨RISC-V RVWMO内存模型的实战应用,帮助开发者理解多核系统中的内存一致性原理和最佳实践。 ## 为什么需要RISC-V多核一致性? 🤔 在现代多核处理器设计中,每个核心都有自己的缓存,这就带来了一个关键问题:当多个核心同时访问同一内存位置时,如何确保它们看到的数据

gitblog_01095的博客 479

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

1.9软考系统架构设计师:优秀架构设计师 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析

非功能性需求分为操作性(如技术环境集成)、性能(如响应时间)、安全性(如加密控制)和文化需求(如多语言支持),体现架构师对需求权衡的全局观。数据访问对象(DAO)负责封装数据库操作逻辑,是数据持久层设计的核心组件,体现架构师对系统分层和职责分离的掌握。演化步骤包括需求归类、计划制定、构件修改、更新交互、组装测试和技术评审,强调架构师在系统迭代中的结构化思维。完整性约束(如主键、外键)是事务一致性的核心保障机制,反映架构师对数据一致性和事务管理的理解。C. 可扩展性需求、可用性需求、可靠性需求、兼容性需求。

m0_74356207的博客 1096

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

嵌入式面试总结(十一)——Cache缓存

摘要: Cache是嵌入式系统开发与面试的核心概念,作为CPU与主存间的高速缓冲,其设计直接影响性能、功耗与实时性。本文系统梳理了Cache的核心知识点,包括:基于局部性原理的工作机制;直接映射、组相联(常用)、全相联三种映射方式的优缺点对比;写直达与写回策略的选择;LRU/伪LRU替换算法;多核环境下的MESI一致性协议及监听/目录实现;性能指标(命中率、AMAT)与优化方法(数据布局、循环分块)。针对嵌入式场景,特别探讨了Cache对实时性(WCET不可预测)的挑战及解决方案(锁定/禁用Cache)。

Dr.kangder的博客 475

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ACE协议深度解读:如何用AMBA5构建高效缓存一致性系统?

本文深度解读AMBA5 ACE协议,阐述如何利用该协议构建高效的多核缓存一致性系统。文章从AXI到ACE的思维跃迁入手,剖析了窥探通道、缓存状态机及事务流等核心机制,并探讨了DVM、屏障事务等高级功能。最后,从系统设计实战角度,分析了广播与目录等互联架构选择、QoS优化策略以及ACE-Lite接口配置要点,为芯片架构师和工程师提供构建高性能、可靠一致性系统的实用指南。

ee345的博客 459

Spring 5.x 源码之旅-72事务细节分析一

作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!

smart_an的专栏 909
上一篇: 腾讯程序员跳槽,两个月面试一圈只收到了京东offer……
下一篇: 区区一个单例模式居然成了面试的重灾区……
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值