CPU缓存一致性

news2024/11/17 14:18:35

CPU缓存一致性

  • 写直达
  • 写回
  • 缓存一致性
  • 总线嗅探
  • MESI协议

在这里插入图片描述

CPU Cache通常分为三级缓存,L1Cache,L2Cache,L3Cache,级别越低的离CPU越近,访问速度越快,但同时容量越小,价格越贵。在多核的CPU中,每个核都有各自的L1,L2Cache,而L3是所有核共享的。

让我们先简单了解一下CPUCache的结构
CPU Cache是由很多个Cache Line组成的,CPU Line是CPU从内存读取数据的基本单位,而CPU Line是由各种标志(Tag)+数据块(Data Block) 组成

在这里插入图片描述

当我们读数据时,首先在Cache中检测数据,如果有的话,则直接从Cache中读,如果没有的话,那么先从主存中读出来,再存储在Cache中,但是,当我们在写数据时,我们将数据在Cache中修改后,那么Cache就和主存的数据不一致了,那么我们应该在什么时候把数据写回到主存呐?

写直达

写直达:在写数据时,把数据同时写入主存和Cache中

 如果数据已经在Cache中,先将数据更新到Cache里面,再写入到主存里面
 如果数据没有在Cache中,就直接把数据更新到主存中

无论数据在没在Cache中,最后都需要把数据写回到主存,因为IO操作特别慢,所以这会极大的影响效率

写回

为了减少IO操作,所以就出现了写回的方法

在写回机制中,当发生写操作时,新的数据仅仅被写入Cache 中,只有修改过的的Cache 块需要被替换时,才写回到主存中。减少了IO操作,这样可以大大提高程序的效率。

如果当发生写操作的时候,数据已经在CPU cache中,则把数据更新到CPU cache中,同时标记CPU 
cache里的 cache block为脏(Dirty)的,(代表这个时候,CPU cache里面的这个cache block的数据和
内存是不一样的)
  1. 如果当发生写操作,数据所对应的cache block里存放的是其它的地址的数据A,这个时候就要检测这个cacheblock里的A有没有标记为脏。 如果标记为脏,我们就要把A写回到内存,同时把要写入的数据写入到cache block中,并标记为脏。
  2. 如果没有的话,就直接将要写入的数据写入到cache block中,再把这个数据标记为脏。

通过写回的话,如果缓存命中的话,可以大大提高我们的性能。

缓存一致性

现在CPU都是多核的,由于L1/L2 cache都是每个核独自的,这样就会带来多核的CPU缓存一致性的问题。
在这里插入图片描述
举例:
假如core1,core2各自运行一个线程,它俩同时对一个变量i(初始值)进行操作,假如说core1对i进行++操作,按照写回策略,先把i的值写回到L1/L2 cache中,再把它标记为脏,这个时候core2对i操作的时候,直接从内存中读值,这个时候,读到的值就是错误的,因为刚才对i的操作还没有同步到内存中,这就是缓存一致性问题。

要实现CPU缓存一致性的话,我们就要保证:

1.某个CPU核心李的cache 数据更新时,必须传播到其它核心中的cache里,这就是写传播。
2.某个CPU核心里对数据的操作顺序,必须在其它核心看起来顺序是一样的,这就是事务的串行化。

我们简单解释一下事务的串行化,
![在这里插入图片描述](https://img-blog.csdnimg.cn/d57af4123a744967ae9863298e7899f3.pn
假如说有一个4核的CPU,这4个core都操作同一个变量(初始值为0),core1先把i变为100,而同一时间core2再把值变为200,根据写传播,这两个操作都会传播到core3,core4。

  1. 假如说core3先接收了core1的操作,再收到了core2的操作,那么对与core3来说,i的值此时i的值就是200。
  2. 假如说core4相反,先接收了core2的操作,再收到了core1的操作,那么对于core4来说,此时i的值就是100。

所以我们要保证所有的核心看到的都是相同顺序的变化,这样的过程就是事务的串行化。

总线嗅探

写传播最常见的方式就是总线嗅探。
实现原理:每个CPU都监听总线上的广播事件,并检查是否有相同的数据在自己的L1/L2缓存中,如果有的话,则自己也需要把该数据更新。

MESI协议

MESI协议基于总线嗅探机制实现了事务串行化,也用状态机机制降低了总线带宽压力。

MESI协议其实就是4个状态单词的开头字母缩写:

  • Modified 已修改
  • Exclusive 独占
  • Shared 共享
  • Invalidated 已失效

用这四个状态来标记cache Line四个不同的状态。

已修改状态:就是我们前面提到的脏标记,代表该cache block上的数据已经被更新过,但是还没有写到内存里。
已失效状态: 表示的是这个cache block里的数据已经失效了,不可以读取该状态的数据。

独占和共享都代表cache block里的数据是干净的(cache block和内存里面的数据是一致的)。

独占和共享的差别在于,独占状态的时候,数据只存储在一个CPU的cache中,而其它CPU cache里面没有该数据。这个时候,如果要向独占的cache写数据,就可以自由的写入,而不需要通知其它CPU core。而如果有其它core从内存读取了相同的数据到自己的cache中,那么独占的数据就会变为共享状态。

共享状态:代表着相同的数据在多个CPU核心的cache里面都有,所以当我们要修改cache里面的数据时,不能直接修改,而是要先向所有其它的core广播一个请求,要求先把其它core中cache中对应的cache line标记为无效状态,然后再更新当前cache里面的数据。

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

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

相关文章

今天大年三十,新年快乐,我在这里给大家整理了一下除夕的习俗,来看看吧

今天是大年三十,阿玥在这里祝大家,一来风水,二来平安,阖家欢乐,四季平安,五福临门,六六大顺,七星高照,八方来财,十全十美,新年好! 名字:不晓得 学习:python,c 主页:木有 今天给大家整理一下大年三十的习俗等小知识,就不更python啦 目录 除夕要做的事情有什么…

Meta CTO:真正的全天候轻量化AR眼镜,可能要到2030年

去年Meta发布了售价高达1500美元的VST头显Quest Pro,该头显与Meta的Quest 2等产品在定价、技术路径上有很大不同,其搭载了眼球追踪、彩色VST等更高端的功能,而产品发布后,外界对其反馈也褒贬不一。作为Pro产品线首个产品&#xff…

Markdown基础总结

Markdown Tools TyporaVSCode Markdown Preview Enhanced扩展 有道云笔记… 上述工具都能很好地支持markdown书写 Markdown标题 1 使用 和 - 标记一级和二级标题 和 - 标记语法格式如下: 我展示的是一级标题我展示的是二级标题 ---效果如下: 2 使用 # 号标…

Java设计模式-访问者模式、访问者模式怎么使用,具体是怎么用

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 6.10 访问者模式 6.10.1 定义 封装一些作用域某种数据结构中的各元素的操作,可以在不改变此数据结构的前提下定义作用于这些元素的新操作 6.10.2 结…

2023年新年烟花代码(背景音乐完整版)

文章目录前言烟花效果展示使用教程查看源码HTML代码CSS代码JavaScript新年祝福前言 大家过年好!新春佳节,在这个充满喜悦的日子里,愿新年的钟声带给你一份希望和期待,我相信,时空的距离不能阻隔你我,我的祝…

Solidity 中的数学(第 5 部分:指数和对数

本文是关于在 Solidity 中进行数学运算的系列文章中的第五篇。这次的主题是:指数和对数 介绍 几个世纪以来,对数被用来简化计算。在电子计算器广泛普及之前,计算尺、基于对数的机械计算器是工程师职业的标志。 对数函数连同指数函数&#x…

【matplotlib】21.多图合并【python3、numpy、pandas、matplotlib完结】

#【matplotlib】21.多图合并 2023.1.20 python3、numpy、pandas、matplotlib完结 新年快乐!! 21.1 多合一显示 21.1.1 均匀分布 方法很简单 就是一张图 分几块 第一张占几块 从哪开始;第二张… plt.subplot() # 打开一个窗口 import ma…

Redis数据类型简介

目录 1、字符串(Strings) 1.1、底层实现 1.2、基本命令 1.3、应用场景 2、列表(Lists) 2.1、底层实现 2.2、基本命令 2.3、应用场景 3、集合(Sets) 3.1、底层实现 3.2、基本命令 3.3、应用场景 4、哈希(Hashes) 4.1、底层实现 4.2、基本命令 4.3、应用场景 5、…

Caché数据库简要记录

前一阵子,实施的小伙伴找过来问我用过 Cach 数据库吗?我当时有点懵?难道是 redis、memcached 之流?后来我特意去搜索了一下,还真是有一款数据库叫做 Cach Database。 这里做一下简单的记录吧,Cach 在医疗系…

Mine Goose Duck 0.1版本发布

我本次制作了一款MC版的Goose Goose Duck模组,游戏版本是Forge 1.19.2。 1.身份物品 熟悉鹅鸭杀的朋友都知道游戏中含有许多的身份,有好人、坏人、中立三个阵营,本次我加入了原作中的一些基本角色: 1.警长 你可以杀死怪物但错…

DFS(三)电话号码的字母组合

数组版本 哈希版本: 一、17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1&#x…

Elasticsearch7.8.0版本高级查询——范围查询文档

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

Git的安装与使用

目录 一、简介 1. Git 是什么? 2. 集中式和分布式 二、Git 环境搭建 1. Linux 下安装 2. Windows 下安装 三、创建版本库 四、把文件添加到版本库 1. 添加并提交 2. 仓库状态 3. 版本回退 (1)查看提交日志 (2&#xff0…

量化交易-因子有效性分析

量化交易-因子有效性分析一、 因子的 IC 分析2. 信息系数3. 举例4. 因子处理4.1 去极值4.2 标准化4.3 市值中性化一、 因子的 IC 分析 判断因子与收益的相关性强度 分析结果 因子平均收益IC meanIC stdIC > 0.02:IC大约0.02的比例,越大越严格IR&…

leetcode刷题记录总结-1. 数组

文章目录一、二分查找[704. 二分查找](https://leetcode.cn/problems/binary-search/)题解小结[35. 搜索插入位置](https://leetcode.cn/problems/search-insert-position/)题解1:暴力解法题解2:二分法[34. 在排序数组中查找元素的第一个和最后一个位置]…

Day865.基础架构 -MySQL实战

基础架构:一条SQL查询语句是如何执行的 Hi,我是阿昌,今天学习记录的关于基础架构:一条SQL查询语句是如何执行的的内容。 经常说,看一个事儿千万不要直接陷入细节里,应该先鸟瞰其全貌,这样能够…

01-使用Camera Raw滤镜调色

1.需求展示 点击下载图片素材 原图 调色后, 具有电影感 2.操作步骤 1.打开原图 1.我使用的是ps2018, 打开原图, 图层名字可以自定义 2.拷贝底片建立一个新图层 养成好习惯, 每种操作都建立新图层来进行, 这样如果修坏了, 直接把该图层删除就行了, 还原图片比较快捷 3…

[QMT]03-让QMT支持从Tushare获取数据

QMT安装python第三方库为了兼容性,需要本地使用python3.6.8版本,因为刚刚下载的QMT python版本就是3.6.8.如果你本地有其他python版本的话,建议使用虚拟环境操作。这样不会影响你原有的python版本以及已经安装的第三方库。因为一机装多版本的…

Java设计模式-中介模式/中介模式具体怎么使用,使用场景又是什么

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 6.8 中介者模式 6.8.1 定义 调停模式,定义一个中介角色来封装一系列对象的之间交互,使元有对象之间的耦合松散,且可以独立改变…

2023年春节祝福第二弹——送你一只守护兔,让它温暖每一个你【html5 css3】画会动的小兔子,炫酷充电,字体特效

2023年春节祝福第二弹 送你一只守护兔,让它温暖每一个你! 【html5 css3】画一只会动的兔子 目录 一、送你一只守护兔,效果图 二、前言 三、代码解释及部分特效教程 (1)、css3 立体字 (2)…