06存储器层次结构
存储技术
易失性存储器/随机访问存储器(RAM)
断电后丢失它们的信息
静态RAM(SRAM)
更快、更贵、更稳定、功耗更大
SRAM将每个位存储在一个双稳态的存储器单元里
每个单元是用一个六晶体管电路实现,可以无限期地保持在两个不同的电压配置或状态之一,其它任何状态都是不稳定的——从不稳定状态开始,电路会迅速转移到两个稳定状态中的一个
即使有干扰,当干扰消除时,电路就会恢复到稳定值
动态RAM(DRAM)
DRAM将每个位存储位对一个电容的充电(大约只有)
每个单元是用一个电容和一个访问晶体管组成,DRAM存储器可以制造的非常密集
对干扰非常敏感,当电容的电压被扰乱之后,永远不会恢复
很多原因会导致漏电,使得DRAM单元在毫秒时间内失去电荷时(钟周期时纳秒来衡量),存储器系统必须周期性通过读出,然后重写来刷新存储器的每一位
传统DRAM
DRAM芯片中的单元(位)被分成了个超单元
每个超单元都由个DRAM单元组成。一个的DRAM总共存储了位信息
超单元被组织称一个行列的阵列,,来降低芯片上地址引脚的数量,但是增加了访问时间
信息通过引脚的外部连接器流入和流出芯片,每个引脚携带一个1位的信号
每个DRAM芯片被连接到某个成为存储控制器的电路,这个电路可以一次传送位到每个DRAM芯片或一次从每个DRAM芯片传出位
行地址称为行访问选通脉冲(RAS)请求,列地址称为列访问选通脉冲(CAS)请求,RAS和CAS请求共享相同的DRAM地址引脚
存储器模块
DRAM芯片包装在存储器模块中,它是插到主板扩展槽上的
常见的包装包括168引脚的双列直插存储器模块(DIMM),以64位为块传送数据,72引脚的单列直插存储器模块(SIMM),以32位为块传送数据
增强的DRAM
-
快页模式DRAM(FPM DRAM)
允许对同一行连续地访问可以直接从行缓冲区的到服务
-
扩展数据输出DRAM(EDO DRAM)
FPM DRAM增强形式,允许单独的CAS信号在时间上靠的更紧密
-
同步DRAM(SDDRAM)
与存储控制器通信使用一组显示的控制信号,能够比异步存储器更快地输出超单元内容
-
双倍数据速率同步DRAM(DDR SDRAM)
SDRAM的增强形式,使用两个时钟沿作为控制信号,使DRAM速度翻倍
不同类型DDR SDRAM是用提高有效带宽的很小的预取缓冲区的大小来划分的:DDR(2位)、DDR2(4位)、DDR3(8位)
-
Rambus DRAM(RDRAM)
私有技术,最大带宽比DDR SDRAM更高
-
视频RAM(VRAM)
用在图形系统的帧缓冲区
输出是通过依次对内部缓冲区的整个内容的移位得到,允许并行地读和写
非易失性存储器/只读存储器(ROM)
关电后,仍然保存它们的信息
由于历史原因,ROM中有的类型既可以读,也可以写
-
可编程ROM(PROM)
只能被编程一次
PROM每个存储器单元有一种熔丝,只能用高电流熔断一次
-
可擦写可编程ROM(EPROM)
有一个透明的石英窗口,紫外线光照射过窗口,EPROM单元被清除为0
使用特殊设备完成
EPROM被擦除和重编程的次数数量级达1000次
-
电子可擦写可编程ROM(EEPROM)
类似于EPROM,不需要独立的编程设备,可以直接在印制电路卡上编程
EEPROM被擦除和重编程的次数数量级达100000次
-
闪存(flash memory)
基于EEPROM
固态硬盘是一种新型的基于闪存的磁盘驱动器
存储在ROM设备中的程序通常称为固件
磁盘
磁盘组成
磁盘由盘片(platter)构成
盘片有两个表面(surface),*有一个可旋转的主轴(spindle)
表面有一组称为磁道(track)的同心圆组成
柱面(cylinder)是所有盘片表面到主轴中心距离相等的磁道的集合
磁道被划分成一组扇区(sector),扇区之间由间隙(gap)隔开
每个扇区包含相等数量的数据位
磁盘容量
磁盘读写时间
-
寻道时间
平均值为ms
-
旋转时间
最大旋转延迟
平均旋转时间
平均旋转时间大致和寻道时间相等
-
传送时间
平均传送时间
远小于寻道时间
逻辑磁盘快
使用磁盘控制器维护逻辑块号和实际磁盘扇区之间的映射关系
控制器上的固件执行快速表查找,将逻辑块号翻译成一个(盘面,磁道,扇区)三元组,唯一标识了对应的物理扇区
连接到I/O设备
- 通用串行总线(USB)
- 图形卡(适配器)
- 主机总线适配器
磁盘访问
CPU使用存储器映射I/O的技术向I/O设备发出命令,地址空间中有一块地址是为与I/O设备通信保留的,每个地址称为一个I/O端口
使用直接存储器访问(DMA)可以不需要CPU干涉读和写总线事务
固态硬盘(SSD)
基于闪存的存储技术
一个SSD包括一个或多个闪存芯片和闪存翻译层
闪存芯片代替传统的旋转磁盘中的机械驱动器
闪存翻译层是一个硬件/固件设备,扮演与磁盘控制器相同的角色,将对逻辑块的请求翻译成对底层物理设备的访问
顺序读比顺序写稍微快一点,随机读比随机写块一个数量级,但都比顺序慢
局部性
-
时间局部性
被引用过一次的存储器位置很可能在不远的将来再被多次引用
-
空间局部性
被引用过一次附近的存储器位置很可能在不远的将来被引用
有良好局部性程序比局部性差的程序运行得更快
简单原则
- 一个连续的向量中,每隔个元素进行访问,被称为步长为的引用模式。越小,空间局部性越好
- 重复引用一个变量的程序有良好的时间局部性
缓存
访问命中与不命中
当程序需要的第层的某个数据对象时,首先在当前存储在第层的一个块中找,如果刚好缓存在第层,就说缓存命中,否则缓存不命中
覆盖一个现存块的过程称为替换或驱逐,被驱逐的块称为牺牲块,由替换策略控制,常见替换策略有随机替换策略和最近最少被使用策略(LRU)
空的缓存称为冷缓存,此类不命中称为强制性不命中或冷不命中
由于限制性的防止策略引起的不明中,称为冲突不命中
写回策略
写分配加载相应位的低一层到高速缓存,然后更新高速缓存
非写分配避开高速缓存,直接在低一层修改
直写就是立即将修改后的值写回到高速缓存和紧接着的低一层,是非写分配的
写回只是在高速缓存中修改值,当替换算法要去住更新过的块时,才写到紧接着的低一层,是写分配的
缓存分类
- 只保存指令的高速缓存(i-cache)
- 只保存数据的高速缓存(d-cache)
- 既保存指令又保存数据的统一高速缓存(unified cache)
缓存的性能
衡量缓存性能的指标
- 不命中率
- 命中率
- 命中时间
- 不命中处罚
影响缓存性能的因素
- 缓存大小——命中率、命中时间
- 块大小——命中率、命中时间
- 相连度——不命中处罚
- 写策略——不命中处罚
利用高速缓存进行代码优化
基本方法
-
让最常见的情况运行的越快
注意力放在核心函数中的循环上
在每个循环内部缓存不命中数量最小,尽可能减小步长
一旦从存储器读入了一个数据对象,尽可能多的使用它