CSAPP笔记——第六章存储器层次结构

🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!

🔥个人主页:Ethan Yankang
🔥专栏:CSAPP笔记||书籍网课笔记 

🔥温馨提示:划到文末发现专栏彩蛋

🔥本篇概览:



目录

存储技术

存储器山

Random Access Memory(随机访问存储器)

 Static RAM(静态 RAM,SRAM)

Dynamic RAM(动态 RAM,DRAM)

DRAM Chip 

磁盘(Disk)

机械磁盘

KMGT

操作系统的机械磁盘抽象

固态磁盘

价格与性能总结与对比

Locality

时间局部性

空间局部性

 存储器中心思想

Cache

Cache的内部结构

Cache是如何工作的

为什么Cache用中间的位来作为索引,而非高位。

Cache的分类

直接映射

具体实例解释Cache的工作方式

模拟CPU执行一系列读的过程

“冲突不命中”实例

组相联/全相联高速缓存


存储技术

存储器山

Random Access Memory(随机访问存储器)

 
Static RAM(静态 RAM,SRAM)

一个比特是一个六晶体管结构


Dynamic RAM(动态 RAM,DRAM)

一个比特是一个电容和晶体管组成

两者对比

DRAM Chip 

DRAM芯片与内存控制器相连,进行读取

实际上的内存控制器与相连的8个DRAM相连,存取数据。如8个DRAM相连一次读取就是一个完整8字节数据。

磁盘(Disk)

机械磁盘

也称之为旋转磁盘

无论是DRAM还是SRAM都需要在有电的情况下才能保持数据

本节介绍的磁盘在无电的情况下也能保持数据。

所有的读写头都是垂直排列,一致行动的

KMGT

在不同的存储设备中有不同的含义及数值,具体如下:

操作系统的机械磁盘抽象

其中的逻辑块就是对应于扇区,大小是512字节

固态磁盘

是由一个又一个闪存芯片来实现的,用闪存芯片取代了传动臂+盘片的工作方式。除此之外固态硬盘还包括一个闪存控制器的功能,它的功能与磁盘控制器类似。   

都是将操作系统对逻辑块的请求翻译成对底层物理设备的访问 。

下面是闪存芯片的详细介绍

其中一个page是一512字节,甚至是1KB

优点:半导体制成,耐摔耐用

价格与性能总结与对比

注意SRAM常用于高速Cache

Locality

时间局部性

被引用的内存位置在不远的将来能被多次引用,那这就是时间局部性。

空间局部性

如果一个位置被引用了一次,那么程序很有可能在不远的将来引用附近的内存位置。

 存储器中心思想

速度更快、容量更小的存储设备作为速度更慢,容量更大的存储设备的缓存。

后面说的Cache指的是基于SRAM的高速缓存

Cache

Cache的内部结构

整个Cache被划分成一个或者多个Set,我们用S来表示Set的个数。

 每个Cache包含一个或多个Cache line(高速缓存行),用变量E来表示Cache line。

每个Cache line由三部分组成,分别是有效位(valid)、标记(tag)、数据块(Cache block)。

有效位是代表当前数据是否有效,标记位是用来表示目标数据是否存在于当前的Cache line中,而数据块就是一小部分内存数据的副本,大小用B来表示。

Cache的大小是指所有数据块的和(B的和),Cache的容量是S x E x B

元组(S,E,B,m)是用来描述缓存(cache)结构的一种方式。其中:  

**S**:表示缓存的组数,通常用2的幂次方来表示,例如S=2^2=4,表示缓存被分为4组。 - **E**:表示每组中的行数,也就是每个组中包含的缓存行的数量。

**B**:表示每行(块)的大小,以字节为单位。例如,B=2^3=8,表示每行可以存储8个字节的数据。

**m**:表示地址的位数,用于确定缓存可以寻址的范围。 通过元组(S,E,B,m),可以确定缓存的大小、组数、每行的大小以及地址的位数等关键信息,从而全面描述缓存的结构。这样的描述方式在计算机体系结构和缓存管理中经常被使用。

Cache是如何工作的

当CPU执行数据加载时,从内存数据A处读取数据,CPU将地址A发送到Cache,如果Cache中保存着目标副本,它就立即将目标数据发回给CPU。

那么Cache是如何知道自己是是否包含目标数据的副本呢?

假设目标地址是m位,这个地址参数B、S分成三个字段,具体如图所示

        

首先我们可以通过长度为s的组索引为来确定目标数据存储在哪个 set中。

知道目标数据存放在那个set中之后,接下来就需要确定目标数据放在哪一行。无额定具体的夯实通过t的标记来实现的。以上所有有效位都必须等于1。也就是说需要有效位和标记共同来确定目标数据属于哪一行。

最后我们需要长度为b的偏移量来确定目标数据在行中的确切地址。通过以上3步,Cache就能确定是否命中。

为什么Cache用中间的位来作为索引,而非高位。

假设用高位做组索引位,那么一些连续的内存块就会映射到相同的set中,如下所示就是此。

前四个内存块映射到第一个set中,第5到第8个内存块映射到第二个set中,以此内推。

如果一个程序有良好的空间局部性,当需要顺序地读取一个数组的多个元素时, 此时需要不断地更换Cache line,效率很低。

以中间位作为索引的话,相邻的内存块总是映射到不同的set中。

与高位索引相比,cache 的效率会大大的提高。

Cache的分类

根据每个set所包含的Cache line的行数不同,Cache被分为不同的类。

直接映射

E=1时,这种Cache的结构就是直接映射。

CPU获取数据的步骤:

具体讲解:

假设有这样一个系统,它包含一个CPU、一个寄存器文件、一个L1 Cache和一个内存。

当CPU执行从内存中读取指令时,首先从L1 Cache缓存中查询是否包含目标数据的副本,如果能够在L1Cache中找到目标数据,那么Cache就把目标数据直接返回给CPU,这个判断是否命中,获取目标数据的过程一共有三步——

判断均通过后,我们就可以获得目标数据的副本了。

Cache就可以将目标数据返还给CPU了。        

具体实例解释Cache的工作方式

假设有这样的实例,地址m共有4位

由于地址是4位,整个地址空间的编号可以用0~15来表示。

标记位和索引位连起来可以唯一地标识每一个地址块。每个地址块包含两个字节,例如块0是由地址0和地址1组成的。这样一来,整个内存空间就被分成了8个块,但是示例中的Cache只有4个set,因此就会出现两个内存块映射到同一个set的情况。

例如,块0和块4都分配到了set0

模拟CPU执行一系列读的过程

假设每次CPU读取的数据都是一个字节,最开始时,所有的Cache都是空的,即所有的Cache line的有效位都是等于0。图中表中的每一行都代表每一个Cache line。

第一步当CPU读取地址0处的数据时,经过组选择后发现set0的有效位为0,此时不命中。

接下来CPU从内存中取出包含目标数据的块,并把数据放在set0中,然后Cache返回位于块0处的目标数据m[0] .

第二步,当CPU读取地址1处的数据时,经过组选择后发现set0的有效位为0,此时命中。

类似地完成所有的读取。

注意这里,如果读取完block1后再读取block5,两者连续循环的话,因为两者都占用set组,需要来回切换,所以每次都会不命中,会发生“冲突不命中”的情况。

虽然整个cache还有空闲的空间,当发生交替引用时,还是会出现不命中的情况,我们把这种现象称为“冲突不命中”。实际上冲突不命中在真实的程序中是很常见的,

它会导致一些令人困惑的性能问题。

“冲突不命中”实例

如下的算法

如图每次都会发生冲突不命中。即每次都对x[i]、y[i]的引用都会导致Cache line的切换。我们把这种现象称为“抖动”。

究其原因是因为不同的块映射到了同一个set之中。

解决方法是比较简单的——例如将数组的长度变为12,在想x[0]、y[]之间插入空数据块,图中的y[0]的地址变为48,从而避免了将x[1].y[1]放在同一个Cache line中。这样每次调用就不会切换Cache了。

下面我们将介绍另外两种结构的Cache。

组相联/全相联高速缓存

在上一期视频中,我们介绍了直接映射Cache的内容,由于直接映射的每个set只有一行,因此容易发生冲突不命中。下面我们介绍的组相连cache允许每个set中包含多个Cache。

📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤ 分享👥 留言💬thanks!!!
📚愿大家都能学有所得,功不唐捐!



💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

热门专栏推荐

🌈🌈计算机科学入门系列                     关注走一波💕💕

🌈🌈CSAPP深入理解计算机原理        关注走一波💕💕

🌈🌈微服务项目之黑马头条                 关注走一波💕💕

🌈🌈redis深度项目之黑马点评            关注走一波💕💕

🌈🌈Java面试八股文系列专栏            关注走一波💕💕

🌈🌈算法leetcode+剑指offer              关注走一波💕💕


总栏

🌈🌈​​​​​​JAVA后端技术栈                          关注走一波💕💕  

🌈🌈JAVA面试八股文​​​​​​                          关注走一波💕💕  

🌈🌈JAVA项目(含源码深度剖析)    关注走一波💕💕  

🌈🌈计算机四件套                               关注走一波💕💕  

🌈🌈算法                                        ​​​​​​     ​关注走一波💕💕  

🌈🌈必知必会工具集                           关注走一波💕💕

🌈🌈书籍网课笔记汇总                       关注走一波💕💕  

🌈🌈考试复习资料                              关注走一波💕💕  

🌈🌈C/C++技术栈                              关注走一波💕💕  

🌈🌈GO技术栈                                   关注走一波💕💕  


分栏

🌈🌈JAVA后端技术栈

🌈🌈spring                                      关注走一波💕💕         ​

🌈🌈redis                                        关注走一波💕💕

🌈🌈MySQL                               ​​​     关注走一波💕💕 

🌈🌈mybatis                ​​​​​​​        ​​​​     ​​​​      关注走一波💕💕

🌈🌈mybatisplus                           关注走一波💕💕

🌈🌈MQ          ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        关注走一波💕💕

🌈🌈微服务                                     关注走一波💕💕

🌈🌈设计模式                                 关注走一波💕💕

🌈🌈分布式锁                                 关注走一波💕💕


🌈🌈JAVA八股文​​​​​​​​​​​​​​​​​​​​​JAVA面试八股文(redis、MySQL、框架、微服务、MQ、JVM、设计模式、并发编程、JAVA集合、常见技术场景)                                                          关注走一波💕💕    

                                                             


🌈🌈JAVA项目(含源码深度剖析)

🌈🌈黑马头条(微服务)             关注走一波💕💕

🌈🌈黑马点评(redis)               关注走一波💕💕


🌈🌈计算机四件套

🌈🌈计算机基础                           关注走一波💕💕

🌈🌈计算机基础                           关注走一波💕💕

🌈🌈计算机网络                           关注走一波💕💕

🌈🌈数据结构与算法                    关注走一波💕💕


🌈🌈算法

🌈🌈leetcode                              关注走一波💕💕

🌈🌈剑指offer                             关注走一波💕💕


🌈🌈必知必会工具集                   关注走一波💕💕


🌈🌈书籍网课笔记汇总

🌈🌈CSAPP笔记                        关注走一波💕💕

🌈🌈计算机科学速成课               关注走一波💕💕

🌈🌈CS自学指南                        关注走一波💕💕

🌈🌈读书笔记与每日记录           关注走一波💕💕


🌈🌈考试复习资料​​​​​​​                      关注走一波💕💕


🌈🌈C/C++技术栈                      关注走一波💕💕                           


🌈🌈GO技术栈                          关注走一波💕💕                                                    


📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值