🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥专栏:CSAPP笔记||书籍网课笔记
🔥温馨提示:划到文末发现专栏彩蛋
🔥本篇概览:
目录
存储技术
存储器山
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!!!
📚愿大家都能学有所得,功不唐捐!