首页 > 其他分享 >cache 一致性解密

cache 一致性解密

时间:2023-05-22 15:34:28浏览次数:30  
标签:状态 Cache 请求 cache 解密 Invalid 一致性 Line CPU


实际上,CPU Cache 里的最小存储单元就是 Cache Line,Intel CPU的一个 Cache Line 存储 64 个字节,每一级 Cache 都被划分为很多组 Cache Line,典型的情况是4 条 Cache Line 为一组,当 Cache 从 Memory 中加载数据时,一次加载一条 Cache Line 的数据。下图给出了 Cache 的结构。

cache 一致性解密_缓存

每个 Cache Line 的头部有两个 Bit 来表示自身的状态,总共有 4 种状态。

  • M(Modified):修改状态,其他 CPU 上没有数据的副本,并且在本 CPU 上被修改过,
    与存储器中的数据不一致,最终必然会引发系统总线的写指令,将 Cache Line 中的数
    据写回到 Memory 中。
  • E(Exclusive):独占状态,表示当前 Cache Line 中包含的数据与 Memory 中的数据一
    致,此外,其他 CPU 上没有数据的副本。
  • S(Shared):共享状态,表示 Cache Line 中包含的数据与 Memory 中的数据一致,而且
    在当前 CPU 和至少在其他某个 CPU 中有副本。
  • I(Invalid):无效状态,当前 Cache Line 中没有有效数据或者该 Cache Line 数据已经失
    效,不能再用,当 Cache 要加载新数据时,优先选择此状态的 Cache Line,此外,Cache
    Line 的初始状态也是 I 状态。

状态

cacheline 数据是否有效

其他cpu核 中是否有副本

cache 数据是否被正在被修改

cache 数据是否与Memory 中的数据一致

M(Modified)

1

0

1

不定,大概率是一致的

E(Exclusive)

1

0

0

1

S(Shared)

1

1

0

1

I(Invalid)

0

不定

不定

不定

MESI 协议是用 Cache Line 的上述 4 种状态命名的,对 Cache 的读写z操作引发了 Cache Line的状态变化,因而可以理解为一种状态机模型。但 MESI 的复杂和独特之处在于状态有两种视角:一种是当前读写操作(Local Read/Write)所在 CPU 看到的自身的 Cache Line 状态及其他CPU 上对应的 Cache Line 状态;另一种是一个 CPU 上的 Cache Line 状态的变迁会导致其他 CPU上对应的 Cache Line 的状态变迁。如下所示为 MESI 协议的状态图

cache 一致性解密_计算机原理_02

(1)结合这个状态图,我们深入分析 MESI 协议的一些实现细节。 ##### (1)某个 CPU(CPU A)发起本地读请求(Local Read),比如读取某个内存地址的变量,如果此时所有 CPU 的 Cache 中都没加载此内存地址,即此内存地址对应的 Cache Line 为无效状态(Invalid),则 CPU A 中的 Cache 会发起一个到 Memory 的内存 Load 指令,在相应的 Cache Line中完成内存加载后,此 Cache Line 的状态会被标记为 Exclusive。接下来,如果其他 CPU(CPU B)在总线上也发起对同一个内存地址的读请求,则这个读请求会被 CPU A 嗅探到(SNOOP),然后 CPU A 在内存总线上复制一份 Cache Line 作为应答,并将自身的 Cache Line 状态改为Shared,同时 CPU B 收到来自总线的应答并保存到自己的 Cache 里,也修改对应的 Cache Line状态为 Shared。

(2)某个 CPU(CPU A)发起本地写请求(Local Write),比如对某个内存地址的变量赋值,如果此时所有 CPU 的 Cache 中都没加载此内存地址,即此内存地址对应的 Cache Line 为无效状态(Invalid),则 CPU A 中的 Cache Line 保存了最新的内存变量值后,其状态被修改为 Modified。随后,如果 CPU B 发起对同一个变量的读操作(Remote Read),则 CPU A 在总线上嗅探到这个读请求以后,先将 Cache Line 里修改过的数据回写(Write Back)到 Memory 中,然后在内存总线上复制一份 Cache Line 作为应答,最后将自身的 Cache Line 状态修改为 Shared,由此产生的结果是 CPU A 与 CPU B 里对应的 Cache Line 状态都为 Shared。

(3)以上面第 2 条内容为基础,CPU A 发起本地写请求并导致自身的 Cache Line 状态变为Modified,如果此时 CPU B 发起同一个内存地址的写请求(Remote Write),则我们看到状态图里此时 CPU A 的 Cache Line 状态为 Invalid,其原因如下。CPU B 此时发出的是一个特殊的请求——读并且打算修改数据,当 CPU A 从总线上嗅探到这个请求后,会先阻止此请求并取得总线的控制权(Takes Control of Bus),随后将 Cache Line里修改过的数据回写道 Memory 中,再将此 Cache Line 的状态修改为 Invalid(这是因为其他CPU 要改数据,所以没必要改为 Shared)。与此同时,CPU B 发现之前的请求并没有得到响应,于是重新发起一次请求,此时由于所有 CPU 的 Cache 里都没有内存副本了,所以 CPU B的 Cache 就从 Memory 中加载最新的数据到 Cache Line 中,随后修改数据,然后改变 Cache Line的状态为 Modified。

(4)如果内存中的某个变量被多个 CPU 加载到各自的 Cache 中,从而使得变量对应的 Cache Line 状态为 Shared,若此时某个 CPU 打算对此变量进行写操作,则会导致所有拥有此变量缓存的 CPU 的 Cache Line 状态都变为 Invalid,这是引发性能下降的一种典型 Cache Miss 问题

当前状态

CPU(A) 发起本请求类别

下一个状态

CPU(B) 发起本请求类别

再下一个状态

备注

Invalid

Read -->>

Exclusive

read -->>

Shared

Invalid

Write -->>

Modified

read -->>

Shared

Invalid

Write -->>

Modified

Write -->>

Invalid(原因是不能同时写,要加锁,和数据库一样)

CPU B 发现之前的请求并没有得到响应,于是重新发起一次请求

Shared

Write -->>

Invalid

引发性能下降的一种典型 Cache Miss 问题

架构解密电子书下载

链接:https://pan.baidu.com/s/1FEoLtB2gxL2JXcMnTmbyZQ?pwd=hiy4
提取码:hiy4


标签:状态,Cache,请求,cache,解密,Invalid,一致性,Line,CPU
From: https://blog.51cto.com/u_15202985/6324702

相关文章

  • SM2前后端交互加解密(已联调测通)
    准备工作:后端(jar包)、前端(js文件)阿里云盘:所需文件:https://www.aliyundrive.com/s/wmYT1TMx4az  1.后端java代码SM2工具类:importcom.antherd.smcrypto.sm2.Keypair;importcom.antherd.smcrypto.sm2.Sm2;importio.netty.util.internal.StringUtil;publicclassSM......
  • 改进django rest framework中的token验证,并加入cache
        在用户验证方面用到token验证,这是一种安卓/iso/..手机客户端常用的,方便的验证方式。原理是客户端给我发一段字符串,这段字符串是用户在注册,登入的时候、服务器生成的,并关联到用户。保存到数据库,然后返回给客户端,客户端之后呢,就可以凭借这个字符串来确认“我是我,不是别人......
  • 深入理解多核处理器的缓存一致性和通信机制
    操作系统级别的上下文切换操作系统级别的上下文切换是指当一个线程在执行过程中发生某种事件(如时间片用完、发生中断等),操作系统需要暂停当前线程的执行,保存其上下文(如寄存器状态、程序计数器、堆栈指针等),并切换到另一个线程继续执行的过程。这种上下文切换是由操作系统内核......
  • 从零玩转前后端加解密之SM2-sm2
    title:从零玩转前后端加解密之SM2date:2022-08-2119:42:00.907updated:2023-03-3013:28:48.866url:https://www.yby6.com/archives/sm2categories:-加密算法-从零玩转系列tags:-加密算法-sm2前言SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密......
  • 分布式事务一致性与本地消息表
    我个人比较推崇本地消息表模式来实现最终一致性。首先本地消息表的设计不仅可以解决事务一致性的问题,对于消息队列常见问题中的消息丢失与消息幂等其实都是可以通过本地消息表来解决;其带来的好处是多重的。什么是分布式事务一致性大白话就是对数据源进行拆分后,多库多机器的多数......
  • 使用PHPCS+GIT钩子保障团队开发中代码风格一致性实践
    一、背景笔者在6月份加入新团队,新团队这边刚组建起来,基础一些东西还处于待完善状态,比如笔者组内同学约定使用PSR-2的编码风格规范,但是并不是所有人都严格按照PSR-2来提交代码。最大的原因就是口头的约束力极为有限,而团队中大家使用的编辑器不统一,有使用phpstorm,也有使用VSCode更有......
  • SRE Google 运维解密读书笔记一:SRE 方法论概述
    SREGoogle运维解密,是SRE领域的启蒙之作,讲述了Google的SRE实践,SRE就是从Google流传出来的。本文是读书笔记,第一篇,概述SRE方法论。帮大家把书读薄,当然,也加入了一些我的个人理解,希望对你有帮助。为何需要SRE传统的sysadmin的方式,偏手工运维,机器越多所需运维工程......
  • 保证数据库和缓存数据一致性
    1.修改数据接口开启事务2.修改数据接口中先修改DB,然后删除redis缓存3.如果删除redis抛异常,就回滚事务4.如果删除redis,redis没有返回结果,不确定是不是删除成功了,抛出异常,回滚事务5.后台界面可以查看数据库的值与缓存的值是否一致,界面有查看,修改数据的功能......
  • 用Rust实现DES加密/解密算法
    信息安全技术课程要求实现一下DES算法。对着一份Java代码断断续续抠了几天,算是实现出来了。这里记录一下算法思想和我的Rust实现。DES算法解析概述https://en.wikipedia.org/wiki/Data_Encryption_StandardDES是一种对称的分组加密算法,加密和解密使用同一个密钥,计算过程将数......
  • 基于多智能体系统 一致性算法 电力系统分布式经济调度
    基于多智能体系统一致性算法电力系统分布式经济调度策略关键词:一致性算法多智能体分布式调度仿真平台:MATLAB平台参考文档:中文复现,效果非常好,想看文献和运行效果加好友主要内容:代码主要做的是电力系统的分布式调度策略,具体为基于多智能体一致性算法的分布式经济调度方法,......