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,一经查实,立即删除!

相关文章

从原始边列表到邻接矩阵Python实现图数据处理的完整指南

​​本文分享自华为云社区《从原始边列表到邻接矩阵Python实现图数据处理的完整指南》,作者: 柠檬味拥抱。 在图论和网络分析中,图是一种非常重要的数据结构,它由节点(或顶点)和连接这些节点的边组成。在Py…

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

想象一下,你的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;安装相应的包。后端…

Java中常用类String的实例化详解

Java中常用类String的实例化详解 在Java编程中&#xff0c;String类是一个基础且非常重要的类&#xff0c;用于表示和操作字符序列。了解如何正确地实例化String对象&#xff0c;对于初学者来说是非常必要的。本文将详细解释如何在Java中实例化String对象&#xff0c;并提供带…

java加密生成签名

package demo;import java.util.Arrays; import java.util.Map;import com.google.common.collect.Maps; import org.apache.commons.lang3.StringUtils; import org.apache.commons.codec.digest.DigestUtils;/*** 加密生成签名*/ public class Encrypt {public static void m…

电脑缺失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 核心场景 智能推荐 单行推荐 多行推荐 智能生成 注释生成代码 增强生成代码 生成单元测试 代码生成注释 生成文档注释 生成行间注释 代码解释 长函…

2024OD机试卷-分披萨 (java\python\c++)

题目:分披萨 题目描述 "吃货"和"馋嘴"两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的 服务员 将披萨切成了每块大小都完全不同奇 数块,且肉眼能分辨出大小。 由于两人都想吃到最多的披萨,他们…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷1(容器云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

因表别名引用错误导致查询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…

API已成为攻击者首要目标,企业如何保护API安全?

随着云计算、移动互联网、物联网的蓬勃发展&#xff0c;越来越多的应用开发深度依赖于API之间的相互调用。特别是疫情常态化后&#xff0c;协同办公、在线教育、直播短视频等线上应用蓬勃发展&#xff0c;API在其中既能够起到连接服务的功能&#xff0c;又可以用来传输数据&…

SSD (Pytorch)复现 Ubuntu20.04

源码地址&#xff1a;https://github.com/bubbliiiing/ssd-pytorch 二、环境配置 1、创建环境 使用anaconda进行环境配置&#xff0c;创建一个ssd的环境&#xff1a; conda create -n ssd python3.8 -y2、进入环境 激活anaconda环境&#xff1a; conda activate ssd3、torch安…

使用PyMuPDF(fitz)提取PDF文件文本内容

安装PyMuPDF库&#xff08;如果还没有安装的话&#xff09;&#xff1a; pip install pymupdf使用以下Python脚本来提取指定页面的文本&#xff1a; import fitz # 导入PyMuPDF库def extract_text_from_specific_page(file_path, page_number):# 打开PDF文件doc fitz.open(…

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

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

大模型RAG应用与LangChain4初探

RAG指的是一种名为“检索增强生成”(Retrieval-Augmented Generation)的模型架构 引言 大模型(LLM)具备的知识只局限于它被训练的数据,如果我们直接向大模型问一个特定的问题,大模型都会做出一个回答,但是这个回答可能是大模型的幻觉,对于特定领域的问题,大模型的表现…

MY SQL 实验二:

实验2 创建实验用的数据库 一、实验目的 通过实验掌握使用Mysql数据库管理系统中建立数据库和用SQL定义基本表、修改基本表和删除基本表的方法。 二、实验原理 数据库定义&#xff1a; &#xff08;一&#xff09;创建数据库&#xff08;模式&#xff09; CREATE {DATABASE | …