首页 > 其他分享 >缓存一致性协议MESI

缓存一致性协议MESI

时间:2024-02-28 11:33:48浏览次数:25  
标签:状态 缓存 Cache cacheline MESI 内存 一致性 数据 CPU

从 Cache 说起

如今的多核计算机往往包含多个 CPU 核心,其中每个 CPU 有自己独立的 Cache L1、Cache L2,同时多个 CPU 共享主存。

  • 由于 CPU 获取指令数据的速度远快于主存,所以通过一级缓存、二级缓存等等来降低 CPU 从主存获取数据的频率,提升性能。
  • CPU 不会每需要一次数据就从主存读取一次数据,而是一次读满一个 CacheLine(大小为 2的幂次方,16B ~ 256B)。
  • 如果 CPU 访问 Cache发现数据不存在,就会触发 Cache Miss,需要从主存加载数据。此时 CPU 必须等待;
  • 如果 Cache Miss 触发需要替换现有 Cache 中的数据,而此时 Cache 正好满载,就会触发 Capicity Miss;在这之后又访问了 Cache Line,就会触发 Associativity Miss

MSI协议

现在有两个CPU,假设 CPU-1 更改了自己 cacheline 中变量值时,其它也拥有这个共享变量的 cacheline 的 CPU-2 会执行 write invalidate 操作,就是将自己的 cacheline 状态置为 invalid,这样如果再次访问这个 cacheline,就需要刷新 CPU-1 的 cacheline 值到内存,同时 CPU-2 重新访问内存获取最新值并保存到 cacheline。

MSI 协议的名称是指 cacheline 可能处于的状态(Modified、Shared、Invalid)。

当一些 CPU 从内存读取数据到自己的 cacheline,这些 CPU 中这些 cacheline 数据都是一致的,cacheline 处于 shared状态。

如果 P2 将 cacheline 中变量修改为13,P2-cacheline 的状态就会变为 Modified 状态,其它 CPU-cahceline 状态变为 invlidate。

此时 P1 试图读取 cacheline 中数据,由于是 invalidate 状态,就会触发 read-miss。P2 会将自己 cacheline 中的数据写回到内存,供 P1 从内存读取最新值,读取完毕后 P1-cacheline、P2-cacheline 都会变为 Shared 状态。

上面讨论的是读写操作,如果是写写操作,P1-cacheline 会由 Shared——>Modified 状态;其它 CPU-cacheline 会由 Shared——>Invalidate 状态。

总的来说无论什么时候,某个内存位置和它对应的 cacheline 中,最多只有一个 CPU-cacheline 可以处于 Modified 状态,它代表着最新的数据。


MESI协议

在 MSI 协议的基础上,又出现了 MESI 协议,新增了 Exclusive 状态,各状态含义解释如下:

  • Modified:这行数据有效,数据被修改了,和内存中数据不一致,数据只存在于本 Cache中;
  • Exclusive:这行数据有效,数据和内存中一直,数据只存在于本 Cache中;
  • Shared:这行数据有效,数据和内存中一致,数据存在于多个 Cache中;
  • Ivalid:数据无效;

  • E 状态:

  • S 状态:

  • M 和 I 状态:

MESI状态变迁

  • local-read:本内核读取本 Cache 中值;
  • local-write:本内核写本 Cache 中值;
  • remote-read:其它内核读其它 Cache 中值;
  • remote-write:其它内核写其它 Cache 中值;

标签:状态,缓存,Cache,cacheline,MESI,内存,一致性,数据,CPU
From: https://www.cnblogs.com/istitches/p/18039806

相关文章

  • 基于实车在环(ViL)的自动驾驶功能一致性评估
    【引言】  自动驾驶功能的开发和评估在汽车行业内已经很常见了。尤其是自动泊车功能,其低速和小范围操作使得更容易用自动方式实现。但是,想要让使用者满意,这些功能必须能够顺畅地执行,至少要与人类驾驶员一样快。本文将介绍德国MdynamiX及其合作伙伴联合实现的适用于实验室开发......
  • SpringBoot 1x 系列之(八)Spring Boot与缓存
    SpringBoot与缓存JSR-107、Spring缓存抽象、整合Redis缓存:加速系统访问,提升系统性能热点数据、临时数据(如验证码)1.JSR-1071.1背景统一缓存的开发规范及提升系统的扩展性,J2EE发布了JSR-107缓存规范1.2JSR107简介CacheManager与Cache的关系,类比连接池与连接涉及的包ja......
  • 解析Spring中的循环依赖问题:再探三级缓存(AOP)
    前言在之前的内容中,我们简要探讨了循环依赖,并指出仅通过引入二级缓存即可解决此问题。然而,你可能会好奇为何在Spring框架中还需要引入三级缓存singletonFactories。在前述总结中,我已经提供了答案,即AOP代理对象。接下来,我们将深入探讨这一话题。AOP在Spring框架中,AOP的实现是通......
  • SWR " stale-while-revalidate " 立即使用缓存数据 + 后台异步刷新
    在软件开发中,SWR是"stale-while-revalidate"的首字母缩写,这是一种在网络应用(尤其是Web应用)中用于数据获取和缓存的策略。这个策略最早由Next.js团队提出并在其数据获取库next/swr中实现了这个思想。SWR的工作原理如下:立即使用缓存数据:当页面首次加载或数据需要更......
  • 缓存设计
    分流:到达服务之前,减少服务处理的请求数。并发:到达服务之后,提升服务处理的请求数。缓存设计导流:将原本复杂的操作请求(sql大堆),引导到简单的请求上。前人栽树后人乘凉。缓存:空间换时间的一个做法。redis,memcached,localcacheguava,客户端缓存user_info_xxxx:姓名,年龄,xx......
  • 【进阶篇】使用 Redis 实现分布式缓存的全过程思考(一)
    目录前言一、关于缓存二、基本数据结构三、缓存注解3.1自定义注解3.2定义切点(拦截器)3.3AOP实现3.4使用示例四、数据一致性4.1缓存更新策略4.2缓存读写过程五、高可用5.1缓存穿透5.2缓存击穿5.3缓存雪崩5.4Redis集群六、文章小结前言写在前面,让我们从3个问题开始今天的文章:......
  • 项目开发中 Redis 缓存和数据库一致性问题及解决方案
    引入Redis缓存提高性能如果公司的项目业务处于起步阶段,流量非常小,那无论是读请求还是写请求,直接操作数据库即可,这时架构模型是这样的:但随着业务量的增长,你的项目业务请求量越来越大,这时如果每次都从数据库中读数据,那肯定会有性能问题。这个阶段通常的做法是,引入缓存来提高读性......
  • 解析Spring中的循环依赖问题:初探三级缓存
    什么是循环依赖?这个情况很简单,即A对象依赖B对象,同时B对象也依赖A对象,让我们来简单看一下。//A依赖了BclassA{publicBb;}//B依赖了AclassB{publicAa;}这种循环依赖可能会引发问题吗?在没有考虑Spring框架的情况下,循环依赖并不会带来问题,因为对象之间相互依赖......
  • 【性能测试】Redis中的缓存雪崩、缓存击穿、缓存穿透问题详解
    一.什么是缓存雪崩当我们提到缓存系统中的问题,缓存雪崩是一个经常被讨论的话题。缓存雪崩是指在某一时刻发生大量的缓存失效,导致瞬间大量的请求直接打到了数据库,可能会导致数据库瞬间压力过大甚至宕机。尤其在高并发的系统中,这种情况会导致连锁反应,整个系统可能会崩溃。1.......
  • ELKF日志系统搭建(二)进阶——使用 Kafka 作为日志消息缓存
    说明:在一些比较大的业务使用场景中,因为应用繁多,需要收集的日志也很多,通过filebeat或者logstash收集上来的日志如果全都直接发送给ES,那么就会对ES集群产生一定的压力,为了避免出现日志接收不过来的问题,于是引入了消息队列作为缓存,比如常见的使用Redis或Kafka作为消息缓存......