小林图解系统-二.硬件结构 2.4CPU缓存一致性

CPU Cache的数据写入

CPU和内存的访问性能越差越大,于是在CPU内部嵌入CPU Cache(高速缓存)。

CPU Cache由Cache Line组成,Cache Line由头标志Tag+数据块Data Block组成。

如果数据写入Cache,内存和Cache相对应的数据将不同,需要同步,什么时机才把Cache中的数据写回到内存呢?

两种针对写入数据的方法:写直达(Write Through),写回(Write Back)

写直达

保存内存与Cache一致性最简单的方式,把数据同时写入内存和Cache中

写入前会先判断是否已经在CPU Cache里面:

如果数据已经在Cache里面,先将数据更新到Cache里面,再写入到内存里面;

如果数据没有在Cache里面,就直接把数据更新到内存里面。

写回

既然写直达由于每次操作都会把数据写回内存,导致影响性能,为了减少数据写回内存的频率,出现了写回方法。

当发生写操作时,新的数据仅仅被写入到Cache Block里,只有当修改过的Cache Block[被替换过]才需要写到内存里,减少了数据写回内存的频率,提高性能。

  • 当发生写操作时,数据已经在CPU Cache里的话,把数据更新到CPU Cache里,标记CPU Cache里的这个Cache Block为(Dirty)的,代表这个时候,CPU Cache里面的Cache Block的数据和内存是不一致的,这种情况不用把数据写到内存里;
  • 当发生写操作时,数据所对应的Cache Block里存放的是[别的内存地址的数据]的话,检查这个Cache Block里的数据有没有被标记为脏的:

        如果是脏的,把这个Cache Block里的数据写回到内存,然后再把当前要写入的数据,先从内存读到Cache Block,然后把要写入的数据写入到Cache Block,最后也标记为脏的。

        如果不是脏的,把当前要写入的数据先从内存读入到Cache Block,接着将数据写入到这个Cache Block里,再把这个Cache Block标记为脏的。

写回这个方法,把数据写入到Cache的时候,只有在缓存不命中同时数据对应的Cache中的Cache Block为脏标记的情况下,才会将数据写到内存中。而在缓存命中情况下,只需要把该数据对应的Cache Block标记为脏即可。

好处是,如果大量操作可以命中缓存,大部分时间里的CPU都不需要写入内存,性能就会提升。

为什么缓存没命中,还要定位Cache Block?此时要判断数据即将写入到Cache Blcok 里的位置,是否被[其他数据]占了此位置,如果这个[其他数据]是脏数据,就要帮忙把它写回到内存


缓存一致性问题

 L1/L2 Cache是多个核心各自独有的,就会带来多核心的缓存一致性(Cache Coherence)的问题。

A  B两个核心,A执行i++语句,为了考虑性能使用写回策略,先把值为1的执行结果写入到L1 L2Cache,然后把L1/L2 Cache标记为脏的,这时候其实没有被同步到内存,因为只有Cache Block要被替换的时候,数据才会写入到内存里。

如果此时B核心尝试从内存读取i的值,则是错误的,因为A号核心更新i值还没写入到内存,内存中的值依然是0。这个就是所谓的缓存一致性问题,A号核心和B号核心的缓存,在这个时候是不一致的,从而会导致执行结果的错误。

同步:

第一:某个CPU核心的Cache数据更新时,必须传播到其他核心的Cache,称为写传播(Write Propagation)

第二:某个CPU核心里对数据的操作顺序,必须在其他核心看起来顺序是一样的,称为事务的串行化(Transaction Serialization),要做到两点:CPU核心对于Cache中数据的操作需要同步给其他核心;要引入锁概念,如果两个CPU核心里有相同数据的Cache,那么对于这个Cache数据的更新,只有拿到了锁,才能进行对应的数据更新。


总线嗅探

写传播:当某个CPU核心更新了Cache中的数据,要把该时间广播通知到其他核心。最常见实现方式是总线嗅探(Bus Snooping)

A号CPU核心修改了L1 Cache中i变量的值,通过总线把这个时间广播通知给其他所有核心,然后每个CPU核心都会监听总线上的广播事件,并检查是否有相同的数据在自己的L1 Cache里面,如果B号CPU核心的L1Cache中有该数据,那么也需要把该数据更新到自己的L1 Cache。

总线嗅探不管别的核心的Cache是否缓存相同的数据,都需要发出一个广播事件,加重总线负载。

另外,总线嗅探只是保证了某个CPU核心的Cache会更新数据这个事件被其他知道,但不能保证事务串行化

于是,有一个协议基于总线嗅探机制实现了事务串行化,也用状态机机制降低了总线带宽压力,这个协议就是MESI协议,这个协议就做到了CPU缓存一致性。


MESI协议

Modified,已修改

Exclusive,独占

Shared,共享

Invalidated,已失效

这个状态来标记Cache Line四个不同状态。

[已修改]状态是脏标记,代表该Cache Block上的数据已经被更新过,但是还没有写到内存里。而[已失效]状态,表示的是这个Cache Block里的数据已经失效了,不可以读取该状态的数据。

[独占][共享]状态代表Cache Block里的数据是干净的,也就是说,这个时候Cache Block里的数据和内存里面的数据是一致性的。

差别在于,独占,数据只存储在一个CPU核心的Cache里,而其他CPU河西你的Cache没有该数据。如果向独占Cache写数据,就可以直接自由地写入,不需要通知其他CPU核心,因为只有你有这个数据,不存在缓存一致性。

独占下的数据,如果有其他核心从内存读取了相同的数据到各自的Cache,这个时候,独占状态下的数据就会变成共享状态。

那么,[共享]状态代表着相同的数据在多个CPU核心的Cache里都有,所以当我们要更新Cache里面的数据的时候,不能直接更改,需要向其他CPU核心广播一个请求,要求先把其他核心的Cache中对应的Cache Line标记为[无效]状态,然后再更新当前Cache里面的数据。

所以当Cache Line状态是[已修改]和[独占]状态时修改更新其数据不需要发送广播给其他CPU核心,这在一定程度上减少了总线带宽压力


总结

CPU 在读写数据的时候,都是在 CPU Cache 读写数据的,原因是 Cache 离 CPU 很近,读写性能相比内存高出很多。对于 Cache 里没有缓存 CPU 所需要读取的数据的这种情况,CPU 则会从内存读取数据,并将数据缓存到 Cache 里面,最后 CPU 再从 Cache 读取数据。

而对于数据的写入,CPU 都会先写入到 Cache 里面,然后再在找个合适的时机写入到内存,那就有「写直达」和「写回」这两种策略来保证 Cache 与内存的数据一致性:

  • 写直达,只要有数据写入,都会直接把数据写入到内存里面,这种方式简单直观,但是性能就会受限于内存的访问速度;
  • 写回,对于已经缓存在 Cache 的数据的写入,只需要更新其数据就可以,不用写入到内存,只有在需要把缓存里面的脏数据交换出去的时候,才把数据同步到内存里,这种方式在缓存命中率高的情况,性能会更好;

当今 CPU 都是多核的,每个核心都有各自独立的 L1/L2 Cache,只有 L3 Cache 是多个核心之间共享的。所以,我们要确保多核缓存是一致性的,否则会出现错误的结果。

要想实现缓存一致性,关键是要满足 2 点:

  • 第一点是写传播,也就是当某个 CPU 核心发生写入操作时,需要把该事件广播通知给其他核心;
  • 第二点是事物的串行化,这个很重要,只有保证了这个,才能保障我们的数据是真正一致的,我们的程序在各个不同的核心上运行的结果也是一致的;

基于总线嗅探机制的 MESI 协议,就满足上面了这两点,因此它是保障缓存一致性的协议。

MESI 协议,是已修改、独占、共享、已失效这四个状态的英文缩写的组合。整个 MSI 状态的变更,则是根据来自本地 CPU 核心的请求,或者来自其他 CPU 核心通过总线传输过来的请求,从而构成一个流动的状态机。另外,对于在「已修改」或者「独占」状态的 Cache Line,修改更新其数据不需要发送广播给其他 CPU 核心。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排序(3)【归并排序】【计数排序】【排序算法度及其稳定性分析】

一.归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有…

CCAA质量管理【学习笔记】​​ 备考知识点笔记(六)质量改进系统方法与工具

第七节 质量改进系统方法与工具 1 质 量 改 进 方 法 概 述 可以说几乎每种质量管理领域的方法与工具都可以用于质量改进,但是一个组织在改进的整体推进中,往往不是采用单一的方法,会涉及多种改进的工具和手段,并依据一定的模式…

虹科免拆诊断案例 | 2022款问界M5增程式混合动力车充电口盖指示灯不工作

故障现象 一辆2022款问界M5增程式混合动力车,搭载1.5T发动机和发电机作为增程器,累计行驶里程约为3.6万km。该车因尾部受到碰撞进厂维修,维修后进行慢充,发现充电口盖指示灯不点亮(图1),但仪表…

开放式运动耳机哪个品牌音质好用又实惠?五款2024高口碑产品精选力荐!

​开放式运动耳机在如今社会中已经迅速成为大家购买耳机的新趋势,深受喜欢听歌和热爱运动的人群欢迎。当大家谈到佩戴的稳固性时,开放式耳机都会收到一致好评。对于热爱运动的人士而言,高品质的开放式运动耳机无疑是理想之选。特别是在近年来…

要颜值有颜值,有性价比有性价比,华硕天选键、鼠组合分享

作为ROG产品的忠实粉丝,用过不少ROG 相关的产品,近期华硕天选TX98和天选MINI 鼠标的发布,独特配色令我眼前一亮。 华硕天选TX98键盘,作为新品,从看上的第一眼就觉得这款键盘是非常值得推荐。 它完美地诠释了潮玩新次元…

联想618收官:以69亿销售额勇夺15冠王

随着6月19日零点钟声的响起,今年的618年中大促正式落下帷幕。在这个备受瞩目的购物狂欢节里,联想凭借出色的产品表现和市场策略,再次展现了其强大的品牌实力和市场号召力。 数据显示,在今年618活动期间,联想全网销售额…

关于微信小程序(必看)

前言 为规范开发者的用户个人信息处理行为,保障用户的合法权益,自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则…

elasticsearch的安装和配置

单节点安装与部署 我们通过docker进行安装 1.docker的安装 如果以及安装了docker就可以跳过这个步骤。 首先更新yum: yum update安装docker: yum install docker查看docker的版本: docker -v此时我们的docker就安装成功了。 2.创建网络 我们还需要部署kiban…

计算机专业毕设-springboot论坛系统

1 项目介绍 基于SSM的论坛网站:后端 SpringBoot、Mybatis,前端thymeleaf,具体功能如下: 基本功能:登录注册、修改个人信息、修改密码、修改头像查看帖子列表:按热度排序、按更新时间排序、查看周榜月榜查…

SSMP整合案例

黑马程序员Spring Boot2 文章目录 1、创建项目1.1 新建项目1.2 整合 MyBatis Plus 2、创建表以及对应的实体类2.1 创建表2.2 创建实体类2.2.1 引入lombok,简化实体类开发2.2.2 开发实体类 3、数据层开发3.1 手动导入两个坐标3.2 配置数据源与MyBatisPlus对应的配置3…

创建第一个Springboot项目(环境准备、环境存在的问题、启动时存在的问题、启动的方式)

一、环境准备 专业版创建springboot,直接有一个选项可以选择 社区版,需要下载一个spring的插件 不要直接点 install 因为这个插件是付费的,直接点安装只有30天使用期限 在里面找免费版本的下载 然后安装 安装完成后,这个插件名会变…

记一次生产事故,来来回回搞了一个月

🍅我是小宋,关注我,带你轻松过面试 读源码。提升简历亮点(14个demo) 🌏号:tutou123com。拉你进专属群。 记一次生产事故,来来回回搞了一个月 背景 我们的主要业务是台湾省的一个小…

免费分享:2014-2021年OSM中国POI数据(附下载方法)

OpenStreetMap(OSM)是一个全球性的开源协作地图项目,允许任何人编辑和分享地理信息,旨在创建自由、准确且可广泛使用的世界地图。POI是“Point of Interest”的缩写,意为“兴趣点”。 OSM POI矢量数据是OpenStreetMap项…

通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 通过MATLAB实现PID控制器,积分分离控制器以及滑模控制器。通过对比三个算法可知,采用滑模控制算法,其具有最快的收敛性能,较强的鲁棒性&…

安装idea后配置的全局配置

1、打开IDEA应用:Customize→All settings...,如果启动IDEA后,默认打开的是之前的项目,可以关闭当前项目:File→Close Project,就退到全局配置界面了。 2、打开全局配置界面:Editor→File Encod…

zustand 状态管理库的使用 结合TS

zustand 是一个用于React应用的简单、快速且零依赖的状态管理库。它使用简单的钩子(hooks)API来创建全局状态,使得在组件之间共享状态变得容易。 React学习Day10 基本用法 安装:首先,你需要安装zustand库。 npm insta…

Java阻塞队列:DelayQueue

Java阻塞队列:DelayQueue 在Java的并发编程中,阻塞队列是一种非常有用的数据结构,它不仅提供了线程安全的队列操作,还在必要时会自动阻塞获取操作,直到队列变得不为空。本文将重点介绍一种特殊的阻塞队列——DelayQue…

亲测:无影云电脑免费三个月已经缩短为1个月

亲测:无影云电脑免费三个月已经缩短为1个月,大家不要再找3个月的无影云电脑,已经没有了,目前最新消息是1个月。以前可以领3个月,现在只能领1个月,在阿里云免费中心 https://free.aliyun.com/ 大家自己看吧&…

中国各区域人口密度可视化图

原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247674303&idx1&sn830304f80a0429406c4a5e38dc7750ec&chksmfa777682cd00ff9434e4660bb52ab2bf19913b6732083de061664401a9ac0fa46581cd9e5e86&token1445576002&langzh_CN&scene21#we…

StarkNet System Architecture 系统架构

文章目录 Starknet架构排序器,证明器和节点、验证者、Starnet Core排序器 Sequencer证明器 Prover节点验证者StarkNet Core工作原理TransactionsStarknet架构 原文链接: https://david-barreto.com/starknets-architecture-review/#more-4602 StarkNet 有五个组成部分。分别…