ARM(4)缓存一致性

目录

一、缓存一致性问题

二、一致性实现方案

2.1 目录一致性协议

2.2 嗅探一致性协议

三、CHI协议

3.1 cache state

3.2 snoop维护一致性

四、其他一致性协议

4.1 MSI协议

4.2 MESI 协议

4.3 MOESI协议


本文介绍以下内容:

  1. 缓存一致性问题
  2. 一致性实现方案
  3. CHI协议
  4. MESI协议

一、缓存一致性问题

cache一致性的问题是什么呢?下图cpu,cache给标了一个号

假设现在所有的cache都没有数据

  1. cpu0从DDRC读了一个数据到L00,这个数据地址是0x0010,数据是0x1111。那么L2,L10,L00都有这个数据了!
  2. 然后CPU0对这个地址数据改写了,把这个地址数据改成0x2222,写回到L00 。那么现在,L00里面地址0x0010的数据是0x2222. L10,L2,DDRC里面这个地址的数据是0x1111.
  3. 然后CPU1也要读一个数据,地址还是这个0x0010,请问!!我CPU读到这个地址的数据是什么呢,应该是L10里的0x1111,还是L00里面的0x2222呢!
  4. CPU2,CPU3读这个地址应该读到什么数据呢?

    cache一致性问题是什么:不同的cpu或进程,读同一个地址,读到的数据不一样,这就是cache一致性的问题。

    导致这个问题的原因:是因为多个cache的存在!同一个物理地址只能存一个数据,多级cache的存在造成了同一个物理地址的数据在不同的cache中可能有不同的数据。

    cache一致性的目标,是要让所有的CPU都读到最新更新的0x2222这个数据,而不是0x1111这个旧数据。

二、一致性实现方案

 缓存一致性是为了保证在多核或多处理器系统中,各个处理器或核心之间共享的数据的一致性。以下是常见的缓存一致性实现方法:

  1. 目录(Directory)一致性协议
  2. 嗅探(snoop)一致性协议

2.1 目录一致性协议

目录协议使用一个共享的目录来记录内存块的状态和所在的缓存位置。目录跟踪每个内存块是否被缓存、缓存块的状态以及所在的处理器。当一个处理器对内存进行操作时,它需要先向目录发送请求,并根据目录的响应来决定如何更新缓存。

单纯的Directory没有具体使用过,就不多展开了,可以参考这个链接:

《内存一致性与缓存一致性》笔记(八):目录一致性协议 - 知乎

2.2 嗅探一致性协议

对于soc维持一致性的,一般有两种:

1)基于总线的Snoop机制。

一种是HN只要收到一个请求,就snoop到所有的节点,假设cpu1有数据就回,如果snoop到cpu2,cpu2没有数据,那就不用回数据了,优点是HN不用搞个directory记录各个cacheline的状态。缺点也很明显,所有的请求你都要完整地snoop到各个节点,带宽啥的,有点笨。这种呢,就适合少节点的,要是2,3个节点那你就随便snoop吧,其实现在一般的消费者级别的芯片都是这种,ACE(协议)啥的。

 2)基于目录表的Snoop机制。CHI使用这种,HN要搞个directory记录着各个cacheline,所以来了一个请求,我HN是知道哪个cpu有这个地址的数据的,所以每来一个请求,HN就查directory,查到哪个节点有数据,什么状态,就精准的往对应节点发snoop。

 所以CHI协议,是基于directory和snoop机制来维持cache一致性的一个系统。

 Snoop Filter(嗅探过滤器)是一种用于缓存一致性协议的硬件结构,用于减少嗅探(snoop)操作对总线带宽和处理器性能的影响

  1. Snoop Filter 通常位于ICN的Home节点,每个处理器也会记录cacheline的状态。
  2. 记录缓存行在其他处理器的状态信息,例如是否被修改、是否是共享等。
  3. Snoop Filter 通过查询确定是否需要执行嗅探操作,从而减少嗅探操作的广播范围和总线带宽开销。
  4. Snoop Filter 可以记录全地址,也可以采用哈希表等结构来实现,以提供高效的查询和更新操作。

snoop如何维护一致性详见本文3.2

三、CHI协议

3.1 cache state

  • I:Invalid,该cacheline的数据不在当前cache中;
  • UC:Unique Clean,该cacheline的数据只在当前cache中,且和memory的数据一致,可以不知会其它RN就对该cacheline的数据进行修改。在收到snoop请求时,该cacheline不需要返回数据给HN或fwd data给RN;
  • UCE:Unique Clean Empty,该cacheline的数据只在当前cache中,但是所有的数据都是无效的,可以不知会其它RN就对该cacheline的数据进行修改。在收到snoop请求时,该cacheline必须不能返回数据给HN或fwd data给RN;
  • UD:Unique Dirty,该cacheline的数据只在当前cache中,且和memory的数据不一致,已经被修改过了;如果该cacheline的数据不用了,那需要写回到下级cache或memory;可以不知会其它RN就对该cacheline的数据进行修改。在收到snoop请求时,该cacheline必须返回数据给HN或fwd data给RN;
  • UDP:Unique Dirty Partial,该cacheline的数据只在当前cache中,且和memory的数据不一致,部分被修改且有效;如果该cacheline的数据不用了,那需要和下级cache或memory的数据组成一个完成有效的cacheline;可以不知会其它RN就对该cacheline的数据进行修改。在收到snoop请求时,该cacheline必须返回数据给HN,但不能直接将数据fwd给Requester;
  • SC:Shared Clean,其它cache可能也存在该cacheline的拷贝;该cacheline可能已经被修改了;当不需要该cacheline数据时,cache没有义务必须将该数据写回到memory;必须对其它cache的该cacheline进行无效后,获得U态才能将该cacheline进行改写;在收到snoop请求时,该cacheline在RetToSrc没有置位时不需要返回数据,如果RetToSrc置位,则需要返回数据,可以直接fwd数据给Requester;
  • SD:Shared Dirty,其它cache可能也存在该cacheline的拷贝;该cacheline相对于memory已经被修改了;当该cacheline不需要的时候,cache需要将它写回下游cache或memory;必须对其它cache的该cacheline进行无效后,获得U态后才能将该cacheline进行改写。在收到snoop请求时,该cacheline必须返回数据给HN和fwd data给Requester;

---CHI协议的更多内容请参见本专栏的其他文章。

3.2 snoop维护一致性

        CHI定义了cache state,要求不管哪个PE想要对一个地址写,必须要先获取Unique状态,也就是确保整系统中,其他cache都没有这个数据。也就是独占这个地址,才可以操作这个地址。

下面画个时空图描述下:

具体步骤:

假设某时刻有3个RNF拥有某cacheline,状态都是SC态,RNF-0想要更新该cacheline:

  1. 1. RNF0发出一个Store请求(CleanUnique)
  2. 2. HNF收到Store请求,查询Snoop Filter,发现RNF1和RNF2都有该cacheline的副本,然后HNF分别向RNF1和RNF2发出使cacheline无效掉的snoop事务(SnpCleanInvalid)。
  3. 3. RNF1和RNF2收到SnpCleanInvalid后,将cacheline置为无效I态,并返回snoop响应(SnpResp_I)。
  4. 4. HNF收到RNF1和RNF2的snoop响应之后,表明目前系统中只有RNF0才有该cacheline,那么向RNF0返回响应(Comp_UC)。
  5. 5. RNF0收到Comp_UC的响应,表示RNF0已经独占该地址了,就可以进行数据更新。

  1. 四、其他一致性协议

        一致性协议除了上面说的CHI,还有开始使的MSI协议,然后进化到MESI,再到MOESI。这里简单补充一下。

4.1 MSI协议

MSI协议是最基础的协议,只定义了三种状态:

  1. Modified(修改)
  2. Shared(共享)
  3. Invalid(无效)

这是最初级的缓存一致性协议,在现代处理器中已经很少使用了。

Modified:

当前缓存行的数据已被本地处理器修改,并且与内存中的数据不同。如果其他处理器请求这个数据,拥有这个数据的处理器需要将数据写回内存,并且将自己的缓存行标记为Shared。

Shared:

当前缓存行的数据没有被修改,并且可能被其他处理器缓存。

Invalid:

当前缓存行的数据是无效的。

4.2 MESI 协议

MESI协议是最常见的协议之一,它定义了四种状态:

  1. Modified(修改)
  2. Exclusive(独占)
  3. Shared(共享)
  4. Invalid(无效)

每个缓存行都标记为其中一种状态,根据处理器对该行的操作状态会改变。

Modified:

当前缓存行的数据已被本地处理器修改,并且与内存中的数据不同。如果其他处理器请求这个数据,拥有这个数据的处理器需要将数据写回内存,并且将自己的缓存行标记为Shared。

Exclusive:

当前缓存行的数据没有被修改,并且只有本地处理器有这个数据的缓存。

Shared:

当前缓存行的数据没有被修改,并且可能被其他处理器缓存。

Invalid:

当前缓存行的数据是无效的。

通俗的讲一下。MESI协议是一种常见的缓存一致性协议,用于处理多处理器系统中的数据共享和一致性问题。它定义了四种状态,分别是修改(Modified)、独享(Exclusive)、共享(Shared)和无效(Invalid)。

想象一下,你和你的朋友都有一本书的副本。这本书代表着一个共享的数据块。

修改(Modified):当你想要修改书中的内容时,你拥有该书的独家访问权,并且你的朋友的副本已过时。因此,你可以自由地修改书中的内容,而不必担心其他人看到旧版。

独享(Exclusive):当你只是独自拥有这本书的副本,并且它与主要来源(例如图书馆)保持一致。你可以读取书中的内容,但不能修改它。其他人可能也有相同的书,但与你的副本是独立的,没有冲突。

共享(Shared):当你和你的朋友都有这本书的副本时,它是共享的。这意味着你们都可以读取书中的内容,而且它们应该是一致的。如果你想要修改书中的内容,你需要先将它标记为修改状态,并通知其他人停止使用他们的副本。

无效(Invalid):当你的朋友告诉你他们有一本书的新副本时,你的副本就变得无效了。这意味着你的副本已过时或不再可用。你需要丢弃你的副本,并从他们那里获取最新的副本。

MESI协议通过这些状态的管理和转换,确保多个处理器之间共享数据的一致性。当一个处理器想要修改共享数据时,它必须将其状态设置为修改(Modified),同时通知其他处理器使其副本无效。其他处理器在访问共享数据时,会检查自己的副本状态,以确定是否需要更新或共享。这样,数据的一致性得以维护,避免了冲突和不一致的情况。

MESI协议是一种用于处理多处理器系统中缓存一致性的协议。通过定义不同的状态和相应的转换规则,它确保共享数据的一致性,使多个处理器能够正确地访问和更新数据。类比于你和朋友共享一本书的副本,你需要协调修改和访问的顺序,以保证数据的正确性和一致性。

4.3 MOESI协议

MOESI协议在MESI的基础上增加了一个Owner状态,用于解决在多个处理器都缓存了同一个块的数据时,数据更新的问题。

  •  M,Modified, Unique Dirty, 只存在于当前cache中(unique),并且该cache line上的数据与下一级存储单元中的数据不同(dirty)。换言之,cache line中最新的数据位于当前cache,其他cache中没有备份 ,cache line中的内容与主存中的不一致。
  • OOwnedShared Dirty,描述一个cache line为dirty,并且可能存在于多个cache中(不止一个)。一个 Owned 状态的cache line保存着 最新的 而且 正确的(new and correct) 的数据。只有一个core的cache 可以将数据保存为 Owned 状态,其他core 为 shared 状态。
  • E,Exclusive, Unique Clean,数据只存在于当前cache line中,并且为clean的。cache中cache line中的数据于主存中的一致,并且其他core中的cache没有该地址的数据 备份,只存在一个cache中。
  • S,Shared, Shared ,cache line中的data不一定与主存中的一致,与 Owned状态的cache line相对应,将Owned里的数据复制到shared的cache line中,因此 shared cache line中的数据也是最新的。
  • I,Invalid,无效的数据。 

下面是状态转换图:

参考链接:

CHI到底有啥用 保证Cache一致性 2.1 Cache一致性问题是啥_chi一致性维护-CSDN博客

CHI到底有啥用 保证Cache一致性 2.1 Cache一致性问题是啥_chi一致性维护-CSDN博客

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

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

相关文章

设计模式之前端控制器模式

想象一下,你的Java Web应用是个交响乐团,每个功能模块是乐手,而用户请求就像是一首首待演绎的曲目。在这场音乐盛宴中,谁来保证演出的流畅与协调?答案就是——前端控制器模式!它如同乐队的指挥,…

java中如何判断一个数是不是素数(质数)

相关概念 质数就是大于1的自然数字中&#xff0c;只能被1和它自己整除的数。 题目 求101~200之间的质素的个数 代码实现 判断一个数是不是质数 for (int j 2; j < i; j) {if(i % j 0){flag false;break;}}if(flag){System.out.println("当前数字是质数");…

【动态规划】:路径问题_地下城游戏

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本专栏是关于各种算法的解析&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构专栏&…

Python的Web框架Flask+Vue生成漂亮的词云图

生成效果图 输入待生成词云图的文本&#xff0c;点击生成词云即可&#xff0c;在词云图生成之后&#xff0c;可以点击下载图片保存词云图。 运行步骤 分别用前端和后端编译器&#xff0c;打开backend和frontend文件夹。前端运行 npm install &#xff0c;安装相应的包。后端…

电脑缺失opencl.dll怎么办,轻松解决opencl.dll的多种方法分享

当我们在操作电脑过程中遇到系统提示“由于找不到opencl.dll&#xff0c;无法继续执行代码”&#xff0c;这个错误会导致软件应用无法正常运行。OpenCL.dll作为一个与Open Computing Language&#xff08;开放计算语言&#xff09;相关的动态链接库文件&#xff0c;它在执行需要…

Baidu Comate——基于AI的智能代码生成让你的编码更快、更好、更简单!

目录 Baidu Comate智能编码助手介绍 支持的编程语言 支持的 IDE 支持的操作系统 System 安装 Baidu Comate 核心场景 智能推荐 单行推荐 多行推荐 智能生成 注释生成代码 增强生成代码 生成单元测试 代码生成注释 生成文档注释 生成行间注释 代码解释 长函…

因表别名引用错误导致查询SQL执行时间长未出结果

问题描述&#xff1a; 项目组人员反馈在执行一条提取数据SQL时执行很慢&#xff0c;每次执行一段时间就报超时&#xff0c;要求帮忙提取下。 解决过程&#xff1a; 项目组人员发来SQL后&#xff0c;看了下SQL&#xff0c;没什么问题&#xff0c;就在客户端上执行了下&#xff0…

测试必备工具 —— Postman实战教程!

01、接口测试 &#xff08;1&#xff09;服务器端&#xff08;server&#xff09;&#xff1a;在使用别人的服务器上&#xff0c;例如微信APP客户端&#xff0c;服务端在腾讯的服务端上&#xff0c;微信上的账号信息&#xff0c;聊天记录均存储在服务端上&#xff1b;用户A发送…

1010: 折半查找的实现

解法&#xff1a; #include<iostream> #include<vector> using namespace std; void solve() {int n;cin >> n;vector<int> vec(n);for (int& x : vec) cin >> x;int x;cin >> x;int l 0, r n-1, cnt 0;while (l < r) {cnt;int…

C语言进阶 文件操作知识(下)

一. 文本文件和二进制文件 根据数据的组织形式&#xff0c;数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的形式存储&#xff0c;如果不加转换的输出到外存&#xff0c;就是二进制文件。 如果要求在外存上以ASCII码的形式存储&#xff0c;则需要在存储前转换。…

java爬虫代理ip(java爬虫代码示例)

java爬虫代理ip 在编写java爬虫时&#xff0c;经常会遇到需要使用代理IP来访问目标网站的情况。这时候&#xff0c;我们就需要编写代码来实现代理IP的功能。接下来&#xff0c;我们将为大家介绍如何在java爬虫中使用代理IP&#xff0c;以及给出相应的代码示例。 首先&#xff…

腾讯游戏海外扩张,增持芬兰游戏开发商股份持股比例增至14.8%

易采游戏网5月8日消息&#xff0c;近日腾讯再次出手&#xff0c;大幅增持了芬兰知名游戏开发商Remedy Entertainment的股份&#xff0c;持股比例猛增至14.8%。这一举动引起了业界和投资者的广泛关注。 据了解&#xff0c;腾讯此次增持是在2024年4月24日完成的。根据芬兰法律规…

TCP通信并发:

上次的程序只能保持&#xff0c;单线程或者进程 多进程并发服务器 进程的特点&#xff08;有血缘关系&#xff09; 创建子进程&#xff1a;fork&#xff08;&#xff09;&#xff1b; 虚拟地址空间被复制 &#xff0c;从一份变成两份&#xff08;用户区和内核区&#xff09…

JVM垃圾回收详解

一、基本概念 1、HotSpot VM &#xff1a;是由 Oracle 公司开发的一种 Java 虚拟机&#xff08;JVM&#xff09;&#xff0c;是 Java SE 平台上最广泛使用的虚拟机之一。它是 OpenJDK 的一部分&#xff0c;也是 Oracle JDK 的基础之一。使用即时编译&#xff08;Just-In-Time …

使用ROW_NUMBER()分组遇到的坑

1、再一次清洗数据时&#xff0c;需要过滤重复数据&#xff0c;使用了ROW_NUMBER() 来分组给每组数据排序号 在获取每组的第一行数据 with records as(select cc.F_Id as Id,REPLACE(cc.F_CNKITitle,char(10),1) as F_CNKITitle,REPLACE(REPLACE(cc.F_Special,专题&#xff1…

Kubernetes——基础认识

目录 前言 什么是云原生 云元素 K8s与中间件以及微服务之间的关系 Kubernetes发展历史 一、简介 1.Kubernetes是什么 2.为什么要使用Kubernetes 3.Kubernetes特性 3.1自我修复 3.2弹性伸缩 3.3自动部署和回滚 3.4服务发现和负载均衡 3.5集中化配置管理和密钥管理…

车载测试系列:车载测试流程

车载测试流程是保证软件质量的重要支撑&#xff0c;优秀的团队都必须拥有规范的流程体系支撑&#xff0c;它能够约束测试人员的测试行为&#xff0c;约束测试环境的测试精度&#xff0c;提升测试的覆盖度&#xff0c;保证团队成员工作的协调性。 该测试流程建立的依据&#xf…

书生浦语训练营第2期-第7节笔记

一、为什么要研究大模型的评测&#xff1f; 首先&#xff0c;研究评测对于我们全面了解大型语言模型的优势和限制至关重要。尽管许多研究表明大型语言模型在多个通用任务上已经达到或超越了人类水平&#xff0c;但仍然存在质疑&#xff0c;即这些模型的能力是否只是对训练数据的…

二分查找向下取整导致的死循环69. x 的平方根

二分查找向下取整导致的死循环 考虑伪题目&#xff1a;从数组arr中查找出目标元素target对应的下标&#xff0c;如果数组中不存在目标元素&#xff0c;找 到第一个元素值小于target的元素的下标。 编写二分查找算法如下&#xff1a; Testvoid testBinarySearch(){int[] arr n…

Web 功能以及源码讲解

Web 功能以及语言讲解 培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;624032112 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 移动应用开发群&#xff1a;548238632 短视频制作群&#xff1a; 744125867极…