一、学习目标
1. 了解常见的存储技术(RAM、ROM、磁盘、固态硬盘等)
2. 理解局部性原理
3. 理解缓存思想
4. 理解局部性原理和缓存思想在存储层次结构中的应用
5. 高速缓存的原理和应用
二、学习任务
1. 阅读教材,完成课后练习(书中有参考答案)
重点:6.2 6.3 6.4 6.8 6.9 6.10 6.11 6.12 6.13
2. 考核:练习题把数据变换一下
3. 实验:需要动手的到实验楼中练习一下
三、学习资源
1. 教材:第六章《存储器层次结构》
2. 课程资料:https://www.shiyanlou.com/courses/413 实验六、七,课程邀请码:W7FQKW4Y
四、学习过程
6.1 存储技术
随机访问存储器(RAM)
1.静态RAM(SRAM):用来作为高速缓存存储器,每个位存储在一个双稳态的存储器单元里。双稳态:电路可以无限期的保持在两个不同的电压配置或者状态之一。只要供电,就会保持不变。
2.动态RAM(DRAM):用来作为主存以及图形系统的帧缓冲区。将每个位存储为对一个电容的充电,当电容的电压被扰乱之后,就永远都不会再恢复了。暴露在光线下会导致电容电压改变。
3.传统的DRAM
DRAM芯片中的单元(位)被分成了d个超单元,每个超单元都由w个DRAM单元组成, 一个d*w的DRAM共存储dw位信息。超单元被组织成一个r行c列的长方形阵列,rc=d。每个超单元的地址用(i,j)来表示(从零开始)。设计成二维矩阵是为了降低芯片上地址引脚的数量。
信息通过称为引脚的外部连接器流入/流出芯片,每个引脚携带一个1位信号。
每个DRAM信号被连接到称为存储控制器的电路,电路每次传输量为8位。行地址i,RAS请求;列地址j,CAS请求共享相同的DRAM地址引脚。
4.存储器模块
双列直插存储器模块(DIMM):168个引脚,以64位为块传入/传出数据到存储控制器。
单列直插存储器模块(SIMM):72个引脚,以32位为块传入/传出数据到存储控制器。
5.增强的DRAM
快页模式DRAM:允许对同一行连续的访问可以直接从行缓冲区得到服务,避免内部行缓冲区使用一个丢弃其他的现象。
扩展数据输出DRAM:允许单独的CAS信号在时间上靠的更紧密一点。
同步DRAM:用驱动存储控制器相同的外部时钟信号的上升沿来替代许多的异步信号,速度更快。
双倍数据速率同步DRAM:通过使用两个时钟沿作为控制信号,使得DRAM的速度翻倍。
RambusDRAM:增大了最大带宽
视频DRAM:用在图形系统的帧缓冲区中,允许对存储器并行的读和写。
6.访问主存
总线:数据流通过称为总线的共享电子电路在处理器和DRAM之间传送。是一组并行的导线,能携带地址、数据和控制信号。
总线事务:CPU和主存之间的数据传送的过程。读事务,从主存传数据到CPU;写事务,从CPU传数据到主存。
I/O桥:将系统总线的电子信号翻译成存储器总线的电子信号。系统总线连接CPU和I/O桥,控制总线连接I/O桥和主存。
非易失性存储器(ROM)
如果断电,DRAM和SRAM都会丢失信息,非易失性存储器——只读存储器:ROM。ROM是以他们能够被重编程的次数和对他们重编程的机制来区分的。
可编程ROM(PROM):只能被编程一次。PROM每个存储单元有一种熔丝,只能用高电流熔断一次。
可擦写可编程ROM(EPROM):紫外线光照射过窗口,EPROM就被清除为0,被擦除和重编程的次数为1000次。
电子可擦除ROM(EEPROM):不需要一个物理上独立的编程设备,因此可以直接在印制电路卡上编程,能够编程的次数为10^5。
闪存:基于EEPROM,为大量的电子设备提供快速而持久的非易失性存储。
磁盘存储
磁盘构造:磁盘由盘片构成,表面覆盖着磁性记录材料,中央有一个可以旋转的主轴 ,旋转速率大约为5400-15000每分钟。磁盘的每个表面是一组称为磁道的同心圆组成,每个磁道被划分为一组扇区,扇区之间由一些间隙隔开,间隙存储用来标识扇区的格式化位。
磁盘容量由以下技术因素决定:
1.记录密度(位/英寸):磁道一英寸的段中可以放入的位数。
2.磁道密度(道/英寸):从盘片中心出发半径上一英寸的段内可以有的磁道数
3.面密度(位/平方英寸):记录密度与磁道密度的乘积。
磁盘操作:磁盘用读/写头来读写存储在磁性表面的位,而读写头连接到一个传动臂 一端,通过移动转动臂将读写头定位在磁道上的机械运动称为寻道。磁盘以扇区大小的块来读写数据,对扇区的访问时间有三个主要的组成部分:
1.寻道时间:转动臂将读/写头定位到包含目标扇区的磁道上所需时间。
2.旋转时间:驱动器等待目标扇区的第一个位旋转到读/写头下的时间。最大为
pasting
平均旋转时间是Tmax的一半。
传送时间:读写并传送该扇区内容的时间。平均传送时间为:
逻辑磁盘块:现代磁盘将盘面的构造视为一个B个扇区大小的逻辑块序列,磁盘控制器维护着逻辑块号和实际磁盘扇区之间的映射关系。逻辑块号可识别为一个盘面、磁道、扇区三元组,唯一的标识了相对应的物理扇区。内存可以看成字节数组、磁盘可以看成块数组。
连接到I/O设备:所有的I/O设备都是通过I/O总线连接到CPU和主内存。有三种不同类型:
通用串行总线:一个广泛的使用标准,用于连接各种外围I/O设备。
图形卡(或适配器):包含硬件和软件逻辑,代表CPU在显示器上画像素。
主机总线适配器: 将一个或者多个磁盘连接到I/O总线,使用一个特别的主机总线接口定义的通信协议。
访问磁盘:CPU使用一种称为存储器映射I/O的技术向I/O设备发出命令,地址空间中为I/O设备通信保留的地址称为I/O端口。
固态硬盘
固态硬盘是一种基于闪存的存储技术。一个硬盘包由一个或者多个闪存芯片和内存翻译层组成,闪存芯片替代旋转磁盘中的机械驱动器,而闪存翻译层将对逻辑块的请求翻译成对底层物理设备的访问
存储技术趋势
不同的存储技术有不同的价格和性能折中。
不同存储技术的价格和性能属性以截然不同的速率变化着
DRAM和磁盘的性能滞后于CPU的性能。
6.2局部性
局部性原理:
一个编写良好的计算机程序,常常倾向于引用临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。
分类:
时间局部性
空间局部性
应用:
1.硬件层:
通过引入高速缓存存储器来保存最近被引用的指令和数据项,从而提高对主存的访问速度。
2.操作系统级:
系统使用主存作为虚拟地址空间最近被引用块的高速缓存,用主存来缓存磁盘文件系统中最近被使用的磁盘块
3.应用程序中:
Web浏览器将最近被引用的文档放在本地磁盘上。
一、对程序数据引用的局部性
步长为k的引用模式
定义:一个连续变量中,每隔k个元素进行访问,就被称为步长为k的引用模式。
步长为1的引用模式:就是顺序访问一个向量的每个元素,有时也被称为顺序引用模式,它是程序中 空间局部性常见和重要的来源。
一般来说,随着步长增加,空间局部性下降。
二、取指令的局部性
程序指令是存放在存储器中的,CPU必须取出(读出)这些指令。
但是代码区别于程序数据的一个重要属性是:在运行时它是不能被修改的。
三、局部性小结
量化评价一个程序中局部性的简单原则:
重复引用同一个变量的程序有良好的时间局部性;
对于具有步长为k的引用模式的程序,步长越小,空间局部性越好;
对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
6.3存储器层次结构
存储技术:不同的存储技术的访问时间差异很大
计算机软件:一个编写良好的程序倾向于展示处良好的局部性
存储器层次结构:硬件和软件的基础属性互相补充的完美,使人想到一种组织存储器系统的方法。
存储器层次结构中的缓存
高速缓存(cash)是一个小而快速的存储设备,使用高速缓存的过程成为缓存
最小的缓存——CPU寄存器集合
数据总是以块大小为传送单元在第k层和第k+1层之间来回拷贝。
缓存命中:当程序需要第k+1层的某个数据对象d时,它首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中的情况。
缓存不命中:第k层中没有缓存数据对象d的情况
强制性不命中或冷不命中:k层的缓存是空的——冷缓存
冲突不命中:限制性的放置策略引起的不命中
容量不命中:工作集的大小超过缓存的大小时。
替换或驱逐:替换一个现存的块的过程。
牺牲快:被驱逐的这块。
替换策略:控制决定该替换哪个块的策略
利用时间的局部性:由于时间局部性,同一数据对象可能会被多次使用。
利用空间的局部性:块通常包含有多个数据的对象。
6.4高速缓存存储器
CPU寄存器文件和主存之间插入一个小的SRAM高速缓存存储器——L1高速缓存(一级缓存)
在L1高速缓存和主存之间插入一个更大的高速缓存——L2高速缓存
比L2更大的高速缓存——L3高速缓存
通用的高速缓存存储器结构
每个寄存器地址有m位,形成M=2^m个不同的抵制
高速缓存被组织成一个有S=2^s个高速缓存组的数组
每个组包含E个高速缓存行
每个行由一个B=2^b字节的数据块组成的
一个有效位指明这个行是否包含有意义的信息
t=m-(b+s)个标记位是当前块的存储器地址的位的子集
高速缓存的大小C:指的是所有块的大小的和,标记位和有效位不包含在内,C=S×E×B
直接映射高速缓存
E=1的高速缓存称为直接映射高速缓存。
高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程:
组选择
行匹配
字抽取
如果缓存不命中,需要从存储器层次结构中的下一层取出被请求的块。然后将新的块存储在组索引位指示的组中的一个高速缓存行中。
组相联高速缓存
每个组都保存有多于一个的高速缓存行。
一个1<E<C/B的高速缓存通常称为E路组相联高速缓存。
它的组选择与直接映射高速缓存的组选择一样,组索引位标志组。
最不常使用(LFU)策略会替换在过去某个时间窗口内引用次数最少的那一行。
最近最少使用(LRU)策略会替换最后依次访问时间最久远那一行。
全相联高速缓存
由一个包含所有高速缓存行的组(E=C/B)组成的。
它只有一个组,地址中没有组索引位,地址只被划分成了一个标志和一个块偏移。
关于写的问题
如何更新w在层次结构中紧接着低一层中的拷贝:
直写:立即将w的高速缓存块写回到紧接着的低一层中。
写回:尽可能地推迟存储器更新,只有当替换算法要驱逐更新过的块时,才把它写到紧接着的低一层中。
如何处理写不命中:
写分配:加载相应的低一层的块到高速缓存中,然后更新这个高速缓存块。写回高速缓存为写分配。
非写分配:避开高速缓存,直接把这个字写到低一层中。直写高速缓存为非写分配。
i-cache:只保存指令的高速缓存
d-cache:只保存程序数据的高速缓存
统一的高速缓存:保存指令和程序数据的高速缓存。
高速缓存参数的性能影响:
不命中率:不命中数量/引用数量
命中率:1-不命中率
命中时间:从高速缓存传送一个字到CPU所需的时间
不命中处罚:由于不命中所需要的额外的时间
较大的高速缓存可能会提高命中率,但使大存储器运行得更快总是要难一些。
较大的的块能利用程序中可能存在的空间局部性,帮助提高命中率。但会损害时间的局部性比空间局部性更好的程序中的命中率,并且传送时间会变长。
较高的相联度(E的值越大)能够降低高速缓存由于冲突不命中出现抖动的可能性。但也会产生造成较高的成本。
高速缓存越往下层,越可能使用写回而不是直写。
6.5编写高速缓存友好的代码
让最常见的情况运行得快。
在每个循环内部缓存不命中数量最小。
6.6高速缓存对程序性能的影响
存储器山
读吞吐量(读带宽):一个程序从存储系统中读数据的速率
读带宽的时间和空间局部性的二维函数,称为存储器山
程序中利用局部性
将注意力集中在内循环上,大部分计算和存储器访问都发生在这里。
通过按照数据对象存储在存储器中的顺序、以步长为1的来读数据。从而使得程序中的空间局部性最大
一旦从存储器中读入一个数据对象,尽可能地使用它,从而使得程序中的时间局部性最大。
五、所遇问题
相对于前面3节,第四节高速缓存存储器比较难懂,需要再仔细研读。
六、参考blog
齐岳