CSAPP(第三版)第六章优储存器层次结构学习笔记
存储技术
随机访问存储器
1.静态RAM
SRAM将每个位存储在一个双稳态的存储器单元里。每个单元是用一个六晶体管来实现的。
2.动态RAM
DTAM将每个位存储为对一个电容的充电。
3.传统的DRAM
DRAM芯片中的单元被分成d个超单元,每个超单元都由w个DRAM单元组成。
每个DRAM芯片被链接到某个称为内存控制器的电路,这个电路可以一次传送w位到每个DRAM芯片或一次从每个DRAM芯片传出w位。
4.内存模块
DRAM芯片封装在内存模块中,它插到主板的扩展槽上。
5.增强的DRAM
- 快页模式:允许对同一行连续的访问可以直接从行缓存区得到服务,从而改进了这一点。
- 扩展数据输出:FPM DRAM的一个增强的形式,它允许各个CAS信号在时间上靠的更紧密一点。
- 同步DRAM:他们与内存控制器通信使用一组显式的控制信号来说,常规的,FPM和EDO DRAM都是异步的。
- 双倍数据速率同步DRAM:DDR SDRAM是对SDRAM的一种增强,它通过使用两个时钟沿座位控制信号,从而使DRAM的速度翻倍。
- 视频RAM:用于图形系统的帧缓冲区,与FPM DRAM的区别:VRAM的输出是通过对内部缓冲区的移位得到的,VRAM允许对内存并行地读和写。
6.非易失性存储器
如果断电,DRAM和SRAM都会丢失信息,从这点来说他们是易失的。而非易失性存储器(Nonvolatile Memory)即使断电后,也会保存信息,该类存储器称为只读存储器(Read-Only Memory,ROM),但是现在ROM中有的类型既可以读也可以写了,可以根据ROM能够重编程的次数以及对它们进行重编程所用的机制进行区分,包括:
- 可编程ROM(PROM):可以编程一次
- 可擦写PROM(EPROM):可以批量擦除
- 闪存(Flash Memory):具有部分(块级)擦除功能,大约擦除十万次后会耗尽
存储在ROM设备中的程序称为固件(Firmware),包括BIOS、磁盘控制器、网卡、图形加速器和安全子系统等。当计算机系统通电后,会运行存储在ROM中的固件。
7.访问主存
数据流通过称为总线的共享电子电路在处理器和DRAM主存之间来来回回。每次CPU和主存之间的数据传送都是通过一系列步骤来完成的,这些步骤称为总线事务。读事务从储存传送数据到CPU,写实物从CPU传送数据到主存。
磁盘存储
磁盘(Disk)是被用来保存大量数据的存储设备,但是读信息的速度比DRAM慢10万倍,比SRAM慢100万倍。
磁盘构造
磁盘是由多个叠放在一起的盘片(Platter)构成,每个盘片有两个覆盖着磁性记录材料的表面(Surface)。每个表面由一组称为磁道(Track)的同心圆组成,每个磁道被划分为若干扇区(Sector),每个扇区包含相同数量的数据位(通常为512位)作为读写数据的基本单位。扇区之间通过间隙(Gap)分隔开来,间隙不保存数据信息,只用来表示扇区的格式化位。通常会使用柱面(Cylinder)来描述不同表面上相同磁道的集合,比如柱面k就是6个表面上磁道k的集合。盘片中央会有一个可以旋转的主轴(Spindle),使得盘片以固定的旋转速率(Rotational Rate)旋转,单位通常为RPM(Revolution Per Minute)。
磁盘容量
一个磁盘上可以记录仪的最大位数称为它的最大容量,或者简称为容量。磁盘容量是由以下技术因素决定的:
记录密度(Recording Density):一英寸的磁道中可以放入的位数
磁道密度(Track Density):从盘片中心出发,沿着半径方向一英寸,包含多少磁道
面密度(Areal Density):记录密度和磁道密度的乘积
磁盘容量计算公式:
磁盘操作
磁盘读/写头来读写存储在磁性表面的位,而读写头连接到一个传动臂一端。
如上图所示,磁盘通过一个连接在传动臂(Actuator Arm)上的读/写头(Read/Write Head)来进行读写,对于有多个盘面的磁盘,会用多个位于同一柱面上的垂直排列的读/写头。对于扇区的访问时间(Access Time)由以下几部分构成:
1.寻道时间:为了读取到目标扇区,会先控制传动臂将读/写头移动到该扇区对应的磁道上,该时间称为寻道时间。
影响因素:依赖于读/写头之前的位置,以及传动臂在盘面上移动的速度。
通常为3~9ms,最大时间可为20ms。
2.旋转时间:当读/写头处于目标磁道时,需要等待目标扇区的第一个位旋转到读/写头下。
影响因素:目标扇区之前的位置,以及磁盘的旋转速度。
3.传送时间:当读/写头处于目标扇区的第一位时,就可以进行传送了
影响因素:磁盘旋转速率,以及每条磁道的扇区数
可以发现:寻道时间和旋转时间是主要影响部分,并且两者大致相等,通常可以寻道时间乘2来估计访问时间。
逻辑磁盘块
由于磁盘构造的复杂性,现代磁盘将其抽象为B个扇区大小的逻辑块序列,编号为0,1,...,B-1,通过磁盘中的磁盘控制器来维护逻辑块号和实际扇区之间的映射关系。为此需要通过磁盘控制器对磁盘进行格式化:
- 会用表示扇区的信息填写在扇区之间的间隙
- 表示出表面有故障的柱面,并且不进行使用
- 在每个区会预留一组柱面作为备用,没有映射为逻辑块。当损坏时,磁盘控制器会将数据复制到备用柱面,则磁盘就可以继续正常工作了。
当从磁盘读取数据到主存,需要以下步骤:
- 操作系统发送一个命令到磁盘控制器,读取某个逻辑块号
- 磁盘控制器上的固件执行快速表查找,得到该逻辑块号翻译成一个三元组(盘面,磁道,扇区)
- 磁盘控制器解释三元组信息,将读/写头移动到对应的扇区
- 将读取到的信息放到磁盘控制器的缓冲区中
- 将缓冲区中的数据保存到主存中。
连接I/O设备
- 通用串行总线(Universal Serial Bus,USB)控制器:USB总线是一个广泛使用的标准,连接许多外围I/O设备,而USB控制器作为连接到USB总线的设备的中转站。
- 图形卡(或适配器):包含硬件和软件逻辑,负责CPU在显示器上画像素。
- 主机总线适配器:用于将一个或多个磁盘连接到I/O总线,使用主机总线接口定义的通信协议,磁盘接口包括SCSI和SATA,通常SCSI磁盘比SATA磁盘速度更快更昂贵,且SCSI主机总线适配器可以支持多个磁盘驱动器,而SATA只能支持一个。
- 网络适配器:可以通过将适配器插入到主板上空的插槽,从而连接到I/O总线。
访问磁盘
固态硬盘
固态硬盘(Solid State Disk,SSD)是一种基于闪存的存储技术,在某些情况下是传统旋转磁盘的极有吸引力的替代产品。
如上图所示是一个SSD的基本结构。它由闪存和闪存翻译层(Flash Translation Layer)组成
- 闪存翻译层是一个硬件/固件设备,用来将对逻辑块的请求翻译成对底层物理设备的访问。
- 闪存的基本属性决定了SSD随机读写的性能,通常由B个块的序列组成,每个块由P页组成,页作为数据的单位进行读写。通常页大小为512字节4KB,块中包含32128页,则块的大小有16KB~512KB。
SSD的优缺点: - 优点:由于闪存是半导体存储器,没有移动的部件,所以速度比磁盘更快且磨损小,能耗低
- 缺点:SSD每字节比磁盘贵大约30倍,所以常用的存储容量比磁盘小100倍左右。
存储技术趋势
从我们队存储技术的讨论中,可以总结出几个很重要的思想:
- 不同的存储技术有不同的价格和性能这种。
- 不同存储技术的价格和性能属性以截然不同的速率变化着。
局部性
一个便携良好的计算机程序常常具有良好的局部性。
局部性通常有两种不同的形式:时间局部性和空间局部性。
对程序数据引用的局部性
存储器的层次结构
前面2节描述了存储技术和计算机软件的一些基本的和持久的属性:
- 存储技术:不同存储技术的访问时间差异很大。速度快的技术每字节的成本比速度慢的技术高,且容量小。并且CPU和主存之间的差距在变大。
- 计算机软件:一个便携良好的程序倾向于展示出良好的局部性。
两者存在一定的互补,由此可以得到一种组织存储器系统的方法,存储器层次结构(Memory Hierarchy)。
如上图所示是一种经典的存储器层次结构,会使用基于SRAM的高速缓存存储器来解决CPU和DRAM主存之间的鸿沟,通常还可以在DRAM主存和本地磁盘之间添加一层SSD,来弥补两者之间的差距。通常还可以在本地磁盘下方添加一个本地磁带,提供成本更低的存储。
存储器层次结构中的缓存
高速缓存(Cache)是一个小而快速的存储设备,用来作为存储在更大更慢设备中的数据对象的缓冲区域。而使用高速缓存的过程称为缓存(Caching)。
存储器层次结构的中心思想是让层次结构中的每一层来缓存低一层的数据对象,将第k层的更快更小的存储设备作为第k+1层的更大更慢的存储设备的缓存。
该结构之所以有效,是因为程序的局部性原理。相比于第k+1层的数据,程序会倾向于访问存储在第k层的数据。如果我们访问第k+1层存储的数据,我们会将其拷贝到第k层,因为根据局部性原理我们很有可能将再次访问该数据,由此我们就能以第k层的访问速度来访问数据。而且因为我们不经常访问第k+1层的数据,我们就可以使用速度更慢且更便宜的存储设备。
上图展示的是存储器层次结构的基本缓存原理。每一层存储器都会被划分成连续的数据对象组块,称为块(Block),每个块都有一个唯一的地址或名字,并且通常块的大小都是固定的。第k层作为第k+1层的缓存,数据会以块大小作为传送单元(Transfer Unit)在第k层和第k+1层之间来回赋值,使得第k层保存第k+1层块的一个子集的副本。通常存储器层次结构中较低层的设备的访问时间较长,所以较低层中会使用较大的块。
命中缓存
当程序需要第k+1层的某个数据对象d时,会现在第k层的块中搜索d,如果d刚好缓存在第k层中,则成为缓存命中(Cache Hit),则该程序会直接从第k层中读取d。根据存储器层次结构,可以知道第k层的读取速度更快,因此缓存命中会使得程序更快。
缓存不命中
如果第k层没有缓存数据对象d,则称为缓存不命中(Cache Miss),则会从第k+1层中取出包含d的块,然后第k层的缓存会执行某个放置策略(Placement Policy)来决定该块要保存在第k层的什么位置
缓存不命中的准备
空缓存称为冷缓存。
缓存管理
对于每层存储器,都会有某种形式的逻辑来管理缓存:将缓存划分成块、在不同层之间传递块、判断缓存是否命中并进行处理。
- 编译器管理寄存器文件,当寄存器文件中不含有数据时出现不命中,它会决定何时发射加载操作,以及确定用哪个寄存器来存放数据。
- SRAM高速缓存是DRAM主存的缓存,由内置在缓存中的硬件逻辑管理的。
- 在有虚拟内存的系统中,DRAM主存是本地磁盘的缓存,由操作系统软件和CPU上的地址翻译硬件共同管理。
- 在具有分布式文件系统的机器中,本地磁盘作为缓存,由运行在本地机器上的客户端进程管理。
高速缓存存储器
通用高速缓存存储器组织结构
容量C为所有块的大小之和。
C=SEB
直接映射高速缓存
1.直接映射告诉缓存中的组选择
2.直接映射告诉缓存中的行匹配
3.直接映射高速缓存中的字选择
4.直接映射高速缓存中不命中时的行替换
5.综合:运行中的直接映射告诉缓存
6.直接映射高速缓存中的冲突不命中。
组相联高速缓存
1.组相联高速缓存中的组选择
2.组相联高速缓存中的行匹配和字选择
3.组相联告诉缓存中不命中时的行替换
全相联高速缓存
1.全相联高速缓存中的组选择
2.全相联高速缓存中的行匹配和字选择
一个真实的缓存层次结构的解剖
高速缓存参数的性能影响
有许多指标来衡量高速缓存的性能:
- 不命中率,在一个程序执行或程序的一部分执行期间,内存引用不命中的比率。计算规则:不命中数量/引用数量
- 命中率,命中的内存引用比率。等于1-不命中率
- 命中时间。从高速缓存传送一个字到CPU所需的时间,包括组选择,行确认和字选择的时间。
- 不命中处罚。
1.高速缓存大小的影响
2.块大小的影响
3.相联度的影响
4.写策略的影响
编写高速缓存的友好的代码
1.让最常见的情况运行的最快。
2.尽量减小每个循环内部的缓存不命中数量。
综合:高速缓存对程序性能的影响
存储器山
一个程序从存储系统中读数据的数率称为读吞吐量,或者有事称为读宽带。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)