图解直接映射(Direct mapped)、全相联(Fully-associative)和组相联(Set-associative)cache缓存基本原理

news2025/2/27 12:11:50

图解直接映射(Direct mapped)、全相联(Fully-associative)和组相联(Set-associative)cache

  • 一,直接映射缓存(Direct mapped caches)
    • 1.1 直接映射示例
    • 1.2 直接映射原理
    • 1.3 cache颠簸(cache thrashing)
  • 二,全相联映射(Fully-associative)
    • 2.1 全相联映射示例
    • 2.2 全相联映射原理
  • 三,组相联映射(Set associative caches)
    • 3.1 组相联映射示例
    • 3.2 组相联映射原理
  • 四,直接映射、全相联和组相联的优缺点以及应用范围
    • 4.1 直接映射优缺点
    • 4.2 全相联映射优缺点
    • 4.3 组相联映射优缺点
  • 五, 参考文档

一,直接映射缓存(Direct mapped caches)

在介绍直接映射、全相联和组相联映射之前,我们以停车场停车作为例子,先把这三种结构的特点简单地概括出来,便于读者了解。

  • 停车场 - cache
  • 停车 - linefill
  • 取车 - read cache line

1.1 直接映射示例

假如所有人的车都被赋予了一个独一无二的车牌号A(A=0,1,2,…,100,101,…),现在有一个共N=10个车位的停车场,每个车位号从0开始依次递增。现在规定车牌号为A的车子只能停在 停车位 n = A % N = A%10 的位置。如下图所示,车牌号为2的车子停在2号车位,车牌号为5的车子停在5号车位。按照这种规则,如果又来了一辆车牌号为102的车子,即使其他车位上还有空位,102号车子也只能停2号车位,如果2号车位已经有2号车占了,按照直接映射的规则,102车(newer)会把2号车(older)给驱逐(evict)出去。
在这里插入图片描述
上图描述了按照直接映射规则停车的过程,下图则是车主取车的过程(也就是从cache 中读取数据)。
假设我是102号车主,通过简单计算停车位 n =102%10 =2,很容易知道我的车子停在2号车位。

总结:直接映射规则下的停车场,每个车位都与车牌号直接对应,即使停车场还有大量空位,2号车和102号车也只能停2号车位。并按照后来者居上的原则,102号车会把2号车给驱逐出去,如果又来一辆52号车,102号车也会被52号车挤出去。所以驱逐现象(eviction)会频繁发生。
直接映射其优势在于车主很容易就知道自己的车子停在哪个车位,不用进行look-up来确认是否 miss还是hit。

在这里插入图片描述

1.2 直接映射原理

在众多的cache实现方式中,直接映射方式是最简单的。主存中的每个地址都能在cache中找到对应的cache line,不过主存空间是远远大于cache的存储空间的,所以它必须按照上述直接映射停车场的规则:n= A % N,将所有满足n= A % N的地址A放入cache下边为n的cache line。如下图所示的cahce,N=4,一个cache line大小为4个word,主存地址为0x0、0x40、0x80、…、的数据都将放在该cache的第0个cache line,以此类推。
在这里插入图片描述
我们可以推算出一个主存的地址如何被划分成 cache 地址,如下图所示,

  • 由于该cache只有4个cache line,所以只需2个bit即可描述cache line的index(0b00 \ 0b01 \ 0b10 \ 0b11),这里我们使用地址的bits [5:4]。
  • 一个cache line有4个word,也只需2个bit即可描述每个word的具体位置(0b00 \ 0b01 \ 0b10 \ 0b11),这里我们使用地址的[3:2]。
  • 地址的bits [31:6]我们用作Tag 信息,即告诉cache controler该地址来自主存的何处,用于判断hit or miss。
    在这里插入图片描述

当CPU读写一个地址时,cache controler会将该地址按照上图结构划分,并且进行如下操作:

  1. 首先抽取该地址的index位,直接去找cache中对应index的cache line。
  2. 然后抽取该地址的tag信息,如果与当前cache line里的tag一致,并且该cache line的valid bit为1(该cache line里的数据有效),即说明发生了 hit。如果valid bit为1,但是tag信息不一致,说明当前cache line保存的数据是其他地址的,接着需要将当前cache line里的数据驱逐到下一级内存中,并将新的地址上的数据填充进来。
  3. 如果是hit,接着把该地址的Line偏移量,可能还有bytes偏移量取出,在对应的cache line中提取数据。
    **所以内存中所有地址的bits [5:4] 相同的地址,都会映射到同一个位置的cache line。**但是在某个时刻,同一个cache line只能存放其中一个地址的数据,就像车位上某个时刻只能停一辆车一样。

1.3 cache颠簸(cache thrashing)

直接映射的一大副作用就是cache颠簸(cache thrashing),下面笔者用一个示例来解释这种现象。
有如下函数:

void add_array(int *data1, int *data2, int *result, int size)
{
int i;
for (i=0 ; i<size ; i++) {
result[i] = data1[i] + data2[i];
}
}

功能很简单,传入三个int类型指针:int *data1, int *data2, int *result,并在有限的size个循环内求和:result[i] = data1[i] + data2[i]。
假如传入如下参数:

add_array(0x40, 0x80, 0x00, 16);

即:

int *data1 =  0x40
int *data2 = 0x80
int *result = 0x00
int size = 16

在一个直接映射cache实现下会发生什么呢,完成求和运算result[i] = data1[i] + data2[i],会经过如下步骤:

  1. 假设当前 i=0, 首先会读取data1[0],也就是 0x40上的数据,先发生 read miss,然后linefill,将0x40 到0x4F一个cache line大小的数据填充到 cache的第0行。
    在这里插入图片描述
  2. 首先会读取data2[0],也就是 0x80上的数据,地址0x80按照规则,其数据也将放在第0个cache line。先发生 read miss,由于第0行已经存放了0x40的有效数据,所以会先进行evict,然后再把0x80上的数据替换进来:
    在这里插入图片描述
  3. 最后进行求和操作data1[0] + data2[0],并将结果保存在result[0],也就是地址0x00,0x00其数据也将放在第0个cache line。先发生 write miss,由于第0行已经存放了0x80的有效数据,所以还会先进行evict,然后再把求和结果0x00上的数据写进cache line。
    在这里插入图片描述

我们可以发现,仅仅是在一个求和result[i] = data1[i] + data2[i]循环中,就发生了2次eviction。cache里同一个cache line里的数据经常被写入写出(linefill and evict),这就是cache thrashing。这样的现象会严重影响系统的性能,因此在ARM系列处理器中,直接映射类型的主缓存基本上没有,但是可以在一些,比如ARM1136 处理器的分支目标地址缓存中看到直接映射缓存。

二,全相联映射(Fully-associative)

2.1 全相联映射示例

全相联映射规则下的停车场类似与现实生活中的停车场。如下图所示,任意车牌号的车可以停任何车位,有空位就可以停。
在这里插入图片描述
假设当前车位0,1,2都有车子占了,2号车子来了,它会按照一定的策略(replacement policy)来找空车位,本示例中是按照顺序查找。当它发现3号车位是空的时候,就把车子进去。102号车也是如此,停在了4号车位。
在这里插入图片描述
问题随之而来,当车主想要取车时,并不知道自己的车子停在了哪个车位。在最坏的情况下,需要遍历整个停车场(比较9次)才能找到自己的车。

总结: 全相联映射规则停车场的优势在于停车方便,车位利用率高,只要有空车位就能停进去。缺点是取车时比较困难,有可能需要遍历整个停车场才能找到自己的车。

在这里插入图片描述

2.2 全相联映射原理

主存中的任意一个地址可被映射进cache中的任意cache line,这就是全相联映射。正如上面的全相联映射停车场一样,虽然cache的利用率提高了,但是CPU 读写一个地址时,cache controler需要进行cache look-up才能知道是否发生hit 或者miss。在最坏的情况下,需要遍历整个cache,逐一比较才能得出是否hit的结论。
在这里插入图片描述

三,组相联映射(Set associative caches)

3.1 组相联映射示例

直接映射和全相联映射其实很好理解,铺垫了这么久其实是为了让同学们更加深刻地理解组相联映射的工作原理。直接映射是找车方便,全相联映射是停车方便。而组相联映射正是直接映射和全相联映射的组合解决方案。如下图所示,为一个组相联映射的停车场示意图。组相联映射有set 和way的概念,我们先简单理解为set就是行,way就是列。
组相联映射的停车规则如下:

  1. 停车时先选行,再选列。
  2. 行号n = 车牌号A % 停车场总行数 N。(直接映射规则)
  3. 确定了行号n后,车子可以停在n行的任意一列。(全相联映射规则)

下图中,车牌号为2的车子只能停在set2,但是在set2里,可以任意选择一个way,即way0,way1,way2,way3中只要有空位又可以停。同理,车牌号为5的车子也只能停在set5。
在这里插入图片描述
当2号车停在了set2+way1的位置,102号车按照规则必须停在set2,所以102号车可以停在way0、way2和way3中的任意位置。
在这里插入图片描述
不同于直接映射的停车场,同一个set中甚至可以把所有way都填满,才会发生驱逐现象。如下图所示,72号车会根据替换策略,随机选择一个way,将这个way上的车子驱逐出去,然后停进来。
在这里插入图片描述
当要找车时,2号车的车主,根据直接映射规则直接去set2里找,虽然他不知道车子在哪个way中,但是即使是最坏的情况,车主也只需比较4次(停车场的列数)即可发现自己的2号车在不在当前停车场(hit 或者miss)。
在这里插入图片描述

3.2 组相联映射原理

如下图所示,为一个组相联cache的结构,其中有三个概念需要理解:

  • way: 组相联cache 将cache分成几个大小相等的几片,每一片称为一个way,下图为一个 4-way的cache。
  • index:cache 的index其实就是cache line的行号。
  • set:index相同的cache line的集合称为一个set。比如way0、way1、way2和way3中index等于0的cache line称为set0。
    在这里插入图片描述
    上文组相联映射停车场示例中提到过,组相联映射实际上是直接映射与全相联映射的组合实现。也需要将一个地址分成如下三部分,其中地址的index部分就是该地址在cache中所在的set 号。主存中index相同的地址将映射到同一个set(直接映射),但是一个set内有多个位于不同way的cache line,地址上的数据可以放入任意一个way中的cache line(全相联映射)。
    在这里插入图片描述

如下图所示为一个2 way的cache结构。假设主存中地址 0x00、0x40、0x80的index都为0,按照组相联映射规则,0x00、0x40、0x80上的数据必须要存放在set0,但是可以在way0和way1中任意选择:
在这里插入图片描述

四,直接映射、全相联和组相联的优缺点以及应用范围

4.1 直接映射优缺点

  • 优点: 硬件实现简单,成本低.
  • 缺点: 灵活性差。每个主存块只有一个固定的行可以存放,因此即便cache中有大量空闲cache line可用,某个cache line上的data仍可能被替换出去。如果cache容量比较小,则非常容易发生冲突,频繁替换(cache trashing),效率大大降低。
  • 适用范围:直接映射方式一般用于大容量的cache中。

4.2 全相联映射优缺点

  • 优点: 全相联映射方式比较灵活,主存的地址可以映射到Cache的任一cache line中,Cache的利用率高,cache line冲突概率低。
  • 缺点: 硬件成本高,Cache比较电路的设计和实现比较困难。
  • 适用范围:只适合于小容量Cache。

4.3 组相联映射优缺点

  • 优点:cache line的冲突概率比较低,比较的硬件电路比全相联方式简单些,而且空间利用率比直接映射方式要高。
  • 缺点:实现难度和造价要比直接映射方式高。
  • 适用范围:绝大部分cache都采用这种折中方案。

五, 参考文档

cache地址映射,全相连、直接、组相联
主存到Cache直接映射、全相联映射和组相联映射

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

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

相关文章

人类认知的贝叶斯与机器的贝叶斯

贝叶斯原理是一种基于概率的分析方法&#xff0c;可以用来估计一个事件发生的概率。在人类认知和机器学习领域中&#xff0c;都有对应的贝叶斯原理。 人类认知的贝叶斯原理&#xff1a; 在人类认知研究中&#xff0c;贝叶斯原理被认为是一种重要的思维方式。人类的认知过程通常…

算法、数据结构、计算机系统、数据库MYSQL、概率论、数学实验MATLAB、数学建模、马原、英语、杂项、QT项目

算法 冒号表达式 &#xff08;condition&#xff09;&#xff1f;x&#xff1a;y 可以三个条件 以此类推 &#xff08;condition1&#xff09;&#xff1f;x&#xff1a;&#xff08;condition2&#xff09;&#xff1f;y&#xff1a;z 判断三角形最简单的办法 bool canFormTr…

使用 K 均值聚类进行颜色分割

介绍 颜色分割是计算机视觉中使用的一种技术,用于根据颜色识别和区分图像中的不同对象或区域。聚类算法可以自动将相似的颜色分组在一起,而不需要为每种颜色指定阈值。当处理具有大范围颜色的图像时,或者当事先不知道确切的阈值时,这非常有用。 在本教程中,我们将探讨如何…

修炼离线:(三)sqoop插入hbase 报错权限问题

一&#xff1a;报错现象。 二&#xff1a;解决方式。 方法一&#xff1a;修改文件所有者。 切换hadoop用户&#xff1a;export HADOOP_USER_NAMEhdfs hadoop fs -chown -R root:root /方法二&#xff1a;修改权限 切换hadoop用户&#xff1a;export HADOOP_USER_NAMEhdfs ha…

现今主流物联网无线通信技术分类详解

无线技术正在迅速发展&#xff0c;并在人们的生活中发挥越来越大的作用。 而随着无线应用的增长&#xff0c;各种技术和设备也会越来越多&#xff0c;也越来越依赖于无线通信技术。 本文盘点下物联网中无线通信主要的技术。 一、无线通信技术的几大主流分类 1.美国通信委员会…

Fork() 函数:“父” 与 “子” 进程的交互(进程的创建)

阅读导航 前言一、fork函数初识1. 基本概念2. fork函数返回值 二、fork函数的写时拷贝三、总结温馨提示 前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&#xff0c;并且讲了有关C的一些知识&#xff0c;也学习了一些Linux的基本操作&#xff0c;也了解并…

CDN内容分发系统

CDN 分发系统的架构。CDN 系统的缓存&#xff0c;也是一层一层的&#xff0c;能不访问后端真正的源&#xff0c;就不打扰它。 在没有 CDN 的情况下&#xff0c;用户向浏览器输入 www.web.com 这个域名&#xff0c;客户端访问本地 DNS 服务器的时候&#xff0c;如果本地 DNS 服务…

单片机第三季-第三课:STM32开发板原理图、配置、浮点运算单元

目录 1&#xff0c;开发板原理图 2&#xff0c;浮点运算单元&#xff08;FPU&#xff09; 1&#xff0c;开发板原理图 课程视频比较早&#xff0c;介绍了三款开发板。观看视频时用的开发板说和51单片机共板的STM32核心板&#xff0c;将51单片机从底座拆下来后&#xff0c;安…

HiEV独家 | 接棒余承东,华为光产品线总裁靳玉志出任车BU CEO

作者 | 德新 编辑 | 王博 HiEV从多个信息源获悉&#xff0c;华为光产品线总裁靳玉志已于近期接任智能汽车解决方案BU CEO一职&#xff0c;而余承东担任智能汽车解决方案BU&#xff08;以下简称「车BU」&#xff09;董事长一职。 华为光产品线又称华为光传输与接入产品线&#…

基于Uniapp+SpringBoot+Vue的电影交流平台小程序设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

flink集群与资源@k8s源码分析-集群

0 介绍 本文是flink集群与资源@k8s源码分析系列的第二篇-集群 1 场景 下面详细分析各用例 2 启动k8s集群 k8s集群支持session和application模式,job模式将会被废弃,本文分析session模式集群 Configuration作为配置容器,几乎所有的构建需要从配置类获取配置项,这里不显示…

CSS浮动、定位

三种网页布局方式&#xff1a;普通流、浮动、定位 普通流&#xff1a;浏览器默认方式&#xff0c;块元素从上到下排序&#xff0c;行内元素从左到右排序&#xff08;碰到父元素的边界会自动换行&#xff09; 浮动 让一行内容纳多个盒子 核心&#xff1a;脱离普通流的控制 fl…

莱佛士设计学院 | 服装设计毕业作品欣赏(一)

这期给大家介绍了我们莱佛士学生suyao的服装设计毕业作品&#xff08;毕业设计研讨与创作课题&#xff09;——自我认同。 相信很多朋友都有看过《千与千寻》&#xff0c;这部电影以上世纪90年代日本泡沫经济时代为背景&#xff0c;千寻和她的父母误入了诡异世界后&#xff0c;…

华为数通方向HCIP-DataCom H12-831题库(单选题:81-100)

第81题 关于结构化的网络故障排除流程中的确认故障阶段的描述,正确的是? A、应关注如何更好的解决故障而不论该故障是否属于自己的负责范围。 B、应重视用户的意见,以用户的判断为依据来判断故障问题 C、应使影响最小化,尽量不让其他人知道网络出现了故障。 D、应确认排障…

make riscv.obj on x86: 交叉编译

0. 前言 最近泰晓社区捐了几块 RISCV 的开发板给 JLULUG&#xff0c;作为 JLULUG 的最菜的萌新&#xff0c;被社团领导指派来试水。我们拿到的开发板是 MILKV-DUO&#xff0c;上面跑着一个几乎极简的 buzybox linux&#xff0c;ssh 服务端用的是 dropbear。 本文内容旨在介绍…

复杂问题问答

复杂问题问答 写在最前面复杂问题问答问答系统分类 知识图谱现存问题 论文1分类 写在最前面 希望通过了解&#xff0c;找到目标应用场景的方法具体属于哪一个分支&#xff0c;并初步实现 通过阅读文献&#xff0c;找到了另一个研究方向&#xff0c;所以这个就先这样吧hh 参考…

开源媒体浏览器Kyoo

什么是 Kyoo &#xff1f; Kyoo 是一款开源媒体浏览器&#xff0c;可让您流式传输电影、电视节目或动漫。它是 Plex、Emby 或 Jellyfin 的替代品。Kyoo 是从头开始创建的&#xff0c;它不是一个分叉。一切都将永远是免费和开源的。 软件特性&#xff1a; 管理您的电影、电视剧…

代码随想录Day1 数组基础

本文详细说明和思路来源于: 代码随想录 视频讲解: 手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查找_哔哩哔哩_bilibili Leetcode T 704 题目链接 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 题目概述1: 思路: 1.因…

Python 数据分析学习路线

Python 数据分析学习路线 第一阶段&#xff1a;Python语言基础第二阶段&#xff1a;数据采集和持久化第三阶段&#xff1a;数据分析第四阶段&#xff1a;数据挖掘与机器学习书籍介绍参与方式 第一阶段&#xff1a;Python语言基础 在学习数据分析之前&#xff0c;首先需要掌握P…

机器人还可以支持呼入?

呼入机器人是指一种能够接听电话并进行自动语音交互的人工智能软件系统。与传统的人工客服不同&#xff0c;呼入机器人可以根据预设的逻辑和语音识别技术进行自动回复和处理来电者的问题或需求&#xff0c;无需人工干预。这种软件通常能够帮助办公室工作人员更加高效地完成日常…