Cache学习(3):Cache地址映射(直接映射缓存组相连缓存全相连缓存)

1 Cache的与存储地址的映射

以一个Cache Size 为 128 Bytes 并且Cache Line是 16 Bytes的Cache为例。首先把这个Cache想象成一个数组,数组总共8个元素,每个元素大小是 16 Bytes,如下图:

image-20231123010312213

现在考虑一个问题,CPU从0x0654地址读取一个字节,由于Cache大小相对于主存来说,是非常小的。所以Cache只能缓存主存中极小一部分数据。如何根据地址在有限大小的Cache中查找数据呢?现在硬件采取的做法是对地址进行散列(可以理解成地址取模操作)。分为如下多种映射方式,他们各有优劣,同时也有着继承与发展的关系

1.1 直接映射缓存(Direct Mapped Cache)

1.1.1 地址映射方式

在前文中讲解了详细的地址映射关系,这里仅做简单的回顾

image-20231126110101981

上面的例子中,直接映射缓存的地址映射分配方式如下:

  • Cache Size是128 Byte
  • Cache Line size是16 Byte-----offset:4bit
  • 共计8个Cache Line-------------index:3bit
  • 假设地址宽度是16 bit-----------tag:9bits

根据直接映射缓存的工作方式,可以计算出不同主存地址段和对应的Cache

地址段Cahce Line Index
0x0000-0x000F,0x0080-0x008F,…0
0x0010-0x001F,0x0090-0x009F,…1
0x0020-0x002F,0x00A0-0x00AF,…2
0x0030-0x003F,0x00B0-0x00BF,…3
0x0040-0x004F,0x00C0-0x00CF,…4
0x0050-0x005F,0x00D0-0x00DF,…5
0x0060-0x006F,0x00E0-0x00EF,…6
0x0070-0x007F,0x00F0-0x00FF,…7

可以看到,地址0x0000-0x007F地址(0x0000-0x000F~0x0070-0x007F)处对应的数据可以覆盖整个Cache。0x0080-0x00FF地址的数据也同样是覆盖整个Cache。

image-20231126112711045

1.1.2 直接映射缓存的优缺点

优点:

  • 优点1:直接映射缓存在硬件设计上会更加简单
  • 优点2:因为优点1,所以成本上也会较低

缺点:

  • 容易出现Cache颠簸(Cache thrashing)

针对这个问题,在后面的文章中引入多路组相连缓存优化规避这一问题。(首先介绍学习两路组相连缓存)

1.2 两路组相连缓存(Two-way Set Associative Cache)

1.2.1 地址映射方式

依然使用本章的例子(Cache Size 128 Bytes ,Cache Line 16 Byte),引入新的概念路(Way),将Cache平均分成多份,每一份就是一路。因此,两路组相连缓存就是将Cache平均分成2份,每份64 Bytes。将所有索引一样的Cache Line组合在一起称之为组(下图中用绿色的框表示)。所以当Way=2时候,Set=4(Set*Way = Cache Line Count)。如下图所示。

image-20231126123440587

  • Cache Size是128 Byte
  • Cache Line size是16 Byte-----Offset:4bit(与直接映射缓存相同,因为Cache Line Size 没有变)
  • 共计4个Set----------------------Index:2bit(因为被平均分成了2 Way,每一个Set有2个Cache Line,共计4个Set,只需要2bit即可完成索引)
  • 假设地址宽度是16 bit-----------Tag:10bits(索引处少了一位,所以tag处需要多1 bit)

依然假设从地址0x0654地址读取一个字节数据。在上述例子中,会有如下操作:

  • 根据Index=01找到第2行Cache Line,第2行对应2个Cache Line,分别对应Way 0和Way 1。因此Index也可以称作Set Index(组索引)。
  • 将Set Index=01的组内的所有Cache Line对应的tag取出来和地址中的tag部分对比,如果其中一个相等就意味着命中。

因此,两路组相连缓存较直接映射缓存最大的差异就是:

  • 某一地址数据可以存储于对应组内的2个Cache Line,而直接映射缓存一个地址只对应一个固定的Cache Line

1.2.2 两路组相连缓存的优缺点

**缺点:**硬件成本相对于直接映射缓存更高:因为其每次比较tag的时候,开销更大。根据Set Index索引到对应组之后,由于组内有两个Cache Line,所以也会对应的有两个Tag。

  • 在硬件实现角度,增加了逻辑复杂性,某些硬件可能会做并行比较,虽然增加比较速度,但进一步增加了硬件设计复杂度)。
  • 比较两个tag,也会有更大的开销,速度可能会有所下降

**优点:**有助于降低Cache颠簸可能性。

根据两路组相连缓存的工作方式,可以画出主存地址0x0000-0x00FF地址对应的Cache分布图。同时在问题“程序试图依次访问地址0x0000、0x0080、0x0100”中比较两者Cache性能。

  • 直接映射缓存:0x0000、0x0080、0x0100地址中index部分是一样的。因此,这3个地址对应的Cache Line是同一个。当分别访问三个地址的时候都会发生Cache缺失,然后数据会发生替换从主存中加载数据。出现Cache颠簸(Cache thrashing)。

  • 两路组相连缓存:0x0000、0x0080、0x0100地址中index部分也是一样的。因此,这3个地址会对应到相同的组,但是由于有两个Way,在第一个数据0x0000加载进来的情况下放置在Way 0,再访问第二个数据0x0080,也不会替换,仅是将他放在Way1 中。避免了Cache颠簸。

    • 好处1:不至于每一次有数据访问都需要发生数据替换(虽然在访问第三个数据的时候还是需要替换,但是随着Way的数量增多,可能存下的数据更多)
    • 好处2:一个组中存了若干个数据,后面可能会继续使用

因此,当Cache size一定的情况下,组相连缓存对性能的提升最差情况下也和直接映射缓存一样,在大部分情况下组相连缓存效果比直接映射缓存好。同时,其降低了Cache颠簸的频率。从某种程度上来说,直接映射缓存是组相连缓存的一种特殊情况,每个组只有一个Cache Line而已。因此,直接映射缓存也可以称作单路组相连缓存。

image-20231126113917369

1.3 全相连缓存(Full associative Cache)

1.3.1 地址映射方式

组相连的另一个极端情况,将Way的数量扩大至最大,这就是全向相连缓存,即为所有的Cache Line都在一个组内。这种缓存就是全相连缓存。

image-20231126123456580

  • Cache Size是128 Byte
  • Cache Line size是16 Byte-----Offset:4bit(与直接映射缓存相同,因为Cache Line Size 没有变)
  • 仅有1个Set----------------------Index:0bit(因为被平均分成了8 Way,每一个Set有8个Cache Line,所有的Cache Line都在1个Set内,因此地址中不需要set index部分。因为,只有一个组让你选择,不需要设置索引即可完成定位。)
  • 假设地址宽度是16 bit-----------Tag:12bits(索引处少了3位,所以tag处需要多3 bit)

1.3.2 全相连缓存优缺点

缺点:

需要根据地址中的tag部分和唯一组内的所有的Cache Line对应的tag进行比较(硬件上可能并行比较也可能串行比较)。哪个tag比较相等,就意味着命中某个Cache Line。因此,在全相连缓存中,任意地址的数据可以缓存在任意的Cache Line中。但是硬件成本上也是更高。

优点:

可以最大程度的降低Cache颠簸的频率。

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

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

相关文章

100元预算,轻松涨粉1000!腾讯运营面试秘籍大揭秘!

大家好啊!小米在这里~ 很高兴又有机会和大家见面啦!最近小米参加了一场腾讯的运营面试,遇到了一个超有趣的问题:如果让你运营一个公众号,近期需要增加1000个关注,预算100元,怎么完成…

Java(七)(Lambda表达式,正则表达式,集合(Collection,Collection的遍历方式))

目录 Lambda表达式 省略写法(要看懂) 正则表达式 语法 案例 正则表达式的搜索替换和分割内容 集合进阶 集合体系结构 Collection Collection的遍历方式 迭代器 增强for循环 Lambda表达式遍历Collection List集合 ArrayList LinkedList 哈希值 HashSet底层原理 …

每日一题2023.11.26——个位数统计【PTA】

题目要求: 输入格式: 每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。 输出格式: 对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。…

【Mybatis】预编译/即时sql 数据库连接池

回顾 Mybatis是一个持久层框架.有两种方式(这两种方式可以共存) 1.注解 2.xml 一.传递参数 以使用#{} 来接受参数为例 (以上两种方式一样适用的) 1)传递单个参数 #{} 可以为任意名称 2)多个参数 默认的参数名称就是接口方法声明的形参 3)参数为对象 默认给每个对象的每个属性都…

一、深入简出串口(USRT)通信——基本概念。

一、前言 串口到底是什么?简单来说一句话就可以解释,串口就是一种通信协议。 看到这里可能大家会觉得你这不是放屁么,说了跟没说一样。所以这里做前言来描述,大家要先对通信协议有一个下意识地认识才能在学习串口的时候不至于迷茫…

TCP/IP协议、三次握手、四次挥手

TCP/IP TCP/IP协议分层TCP头部三次握手TCP四次挥手常见问题1、什么是TCP网络分层2、TCP为什么是三次握手,不是两次或者四次?3、TCP为什么是四次挥手,为什么不能是三次挥手将第二次挥手和第三次挥手合并?4、四次挥手时为什么TIME_W…

【版本管理 | Git】Git rebase 命令最佳实践!确定不来看看?

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

java基于springboot公益帮学网站 新闻发布系统的设计与实现vue

以Java为开发平台,综合利用Java Web开发技术、数据库技术等,开发出公益帮学网站。用户使用版块:可以选择注册并登录,可以浏览信息、可以网上互动、发布文章、内容推荐等。后台管理员管理版块:以管理员身份登录网站后台…

局域网的网络ip不稳定问题

在局域网的多个设备,互相通信时好时坏,不稳定。 遭遇过的情况如下: 用两个开发板:972开发板1和2,网口同时互相ping,出现1ping 2通--此时2ping 1不通,过段时间,1ping2不通--但2ping又…

openpnp - 给底部相机加防尘罩

文章目录 openpnp - 给底部相机加防尘罩概述笔记END openpnp - 给底部相机加防尘罩 概述 设备标定完, 看着底部相机, 有点担心掉进去东西, 万一从吸嘴掉下去的料(或者清理设备台面时, 不小心掉进去东西)将顶部相机搞短路怎么办. 就想加个防尘罩, 如果有东西掉进去, 可以掉到机…

用 Addon 增强 Node.js 和 Electron 应用的原生能力

前言 Node.js Addon 是 Node.js 中为 JavaScript 环境提供 C/C 交互能力的机制。其形态十分类似 Java 的 JNI,都是通过提供一套 C/C SDK,用于在 C/C 中创建函数方法、进行数据转换,以便 JavaScript / Java 等语言进行调用。这样编写的代码通常…

网络通信基础概念介绍

网络通信基础概念介绍 局域网LAN 局域网,即 Local Area Network,简称LAN。 局域网内的主机之间能方便的进行网络通信,又称为内网;局域网和局域网之间在没有连接的情况下,是无法通信的。 局域网是指在一个相对较小的…