存储器
存储器的层次化结构
- 层次:略
- 主存与cache:解决主存与cpu速度不匹配的问题
- 主存与辅存:使用虚拟存储技术,解决主存容量不够的问题
- 主存与内存的关系:主存=[RAM(即内存),ROM(即BIOS)],主存中的RAM和ROM常统一编址(ROM在低地址,RAM在高地址)
性能指标
- 存储容量:容量=存储字数*字长
- 单位成本:每bit成本=总成本/总容量
- 存储速度:数据传输率=主存带宽=数据宽度/存储周期
- 存储周期=存取时间+恢复时间
内存器件原理
- MOS管:理解为电控开关,输入电压到阈值时就打开,反之关闭
- 存储元:MOS管接通时,会将高/低电压输出到电容中
- 行线:字选线,地址总线->MAR->译码器->字选线
- 二维行线:由于单元数量多,将地址分为行地址、列地址,通过输入行/列地址线(两根线)来确定选中的单元
- 假设DRAM的行列地址线为7*7,则DRAM一共有128行*128列
- 二维复用行线:由于单元数量多,将地址分为行地址、列地址,通过分两次输入地址线(一根线)来确定选中的单元
- 列线:数据线(位线),MDR->数据线
- 片选线($\overline{CS}或\overline{CE}$)
- 读写线
- 实现1:读控制线($\overline{OE}$)、写控制线($\overline{WE}$)
- 实现2:读写控制线($\overline{WE}$),低电平写,高电平读
- N*M位的存储芯片,即N个存储单元,每个单元的存储字长是Mbit
- N的计算
- 按字节寻址:假设总容量为XByte,以1Byte为一个单元,则存储单元数为X个
- 按字寻址:假设总容量为XByte,以一个字长(YByte)为一个单元,则存储单元数为X/Y个
- M的计算:M根据CPU的字长(CPU内部寄存器长度)来决定
- 地址线根数的计算:根据存储单元数来算
RAM
- RAM芯片:常用SRAM和DRAM
- 有易失性:即断电后信息消失==注意区别破坏性读出和易失性==
-
支持随机存取:即不会因为地址大就访问慢
-
SRAM用于Cache,存储元为双稳态触发器
- 是非破坏性读出,不需要定时刷新,所以整体体积大、速度快
- 行列地址同时输入(使用二维地址线)
- DRAM用于主存,存储元为栅极电容
- 是破坏性读出,需要定时刷新,所以整体体积小、速度慢
- 行列地址分两次输入(使用二维复用地址线)
-
目前的主存使用SDRAM(即DDR1)-DDR4
-
存取周期:存取时间+恢复时间(SRAM时间短,DRAM时间长)
-
DRAM需要定时刷新
- 定时刷新:即定时重写,总周期一般为2ms,可以分成若干次刷新
- 每次刷新时,先读一行单元,然后再重新写入,占用一个存取周期
- 假设总周期为2ms,一个存取周期是0.5us
- 所以刷新次数=总周期/单次刷新的存取周期=2ms/0.5us=4000次(总周期内最多支持4000行的刷新)
- 定时刷新的类型
- 分散刷新(前一个存取周期正常读写,后一个存取周期刷新):此时DRAM整体的存取周期=2*内部存取周期
- 集中刷新(一直正常读写,然后在2ms内刷新所有单元):此时DRAM整体的存取周期=内部存取周期
- 异步刷新(只要保证单行刷新周期内能刷新一行就行):单行刷新周期=总周期/行数
- 刷新时DRAM不能正常使用,称为“访存死区”
ROM
- ROM芯片:MROM(不可写)、PROM(可写一次)、EPROM/UVEPROM/EEPROM(写后可慢擦除)、Flash Memory/SSD(写后可快擦除)
- Flash Memory的每个存储元只有单个MOS管,位密度比RAM高
- SSD实际上是控制单元和Flash单元组成
- 无易失性,即断电后信息不消失
- 很多ROM也支持随机存取
提升主存速度
- 双端口RAM
- 包含两组完全独立的数据线、地址线、控制线
- 不同地址,同时读写(支持)
- 相同地址,同时读(支持)
- 相同地址,同时写(不支持)
- 相同地址,一个读一个写(不支持)
- 多模块存储器-多体并行存储器
- 时间分析:最好画图
- 高位交叉编址方案:用高位作为体号,来选择存储体;低位作为体内偏移,输入到体内的地址线
-
低位交叉编址方案:同理
- 流水线存取:顺序访问时,相邻的两个地址一定属于不同的存储体,所以每次访问时不需要等待存储体,就可以立即访问下一个地址。不等待存取周期中的恢复时间,每次只花费一个存取周期中的存取时间。
- 若存取周期为T,且存取时间(或者总线传输周期)为r,则等待时间为3r,为了使得流水线不间断,存储体个数m满足$m\ge\frac{T}{r}$
- 如果考虑成本,则存储体个数$m=\frac{T}{r}$即可
-
多模块存储器-单体并行存储器
- 每个存储单元可以存放m个字,此时总线一次取一个单元,即总线宽度为m个字
- 指令和数据在内存中必须连续存放
-
速度和多体并行存储器一致
-
增加主存存储字数
-
数据/地址线扩展
-
位扩展(数据线)
-
字扩展(地址线)
- 字位同时扩展
-
-
控制线扩展
- 线选法:会导致冲突
- 译码片选法:n条地址线->$2^n$个片选信号
外存
- 磁盘
- 优缺点:容量大价格低,长期重复使用;速度慢,机械结构复杂
- 组成(硬件上看):
- 磁盘驱动器:温彻斯特盘
- 磁盘控制器:标准有:IDE、SCSI、SATA
- 盘片
- 组成(软件上看)
- 磁头:n个盘面=n个磁头
- 柱面:1个盘面的n个磁道=n个柱面(多个记录面的磁道形成多个圆柱体)
- 扇区:1个盘面的1个磁道的n个块=n个扇区
- 性能指标
- 磁盘容量
- 非格式化容量:磁记录面可以利用的磁性单元数,是理论值
- 格式化容量:按一定格式所能存储的信息量,是实际值
- 记录密度
- 道密度:磁道数/磁盘半径(道/cm)
- 位密度:一条磁道的数据位数/磁道长度(位/cm)
- 面密度:道密度*位密度
- 注意:每条磁道(无论磁道长度)的信息量都是一样多的,所以不同半径处的磁道的位密度也是一定不同的
- 平均存取时间=寻道时间+旋转延迟时间+传输时间
- 寻道时间:从当前磁道到目标磁道的时间
- 旋转延迟时间:从当前扇区到目标扇区的时间==若没给旋转延迟,则默认是旋转半圈的时间==
- 传输时间:从扇区起始到扇区终点的时间==若每给传输时间,则默认是旋转一个扇区的时间==
- 数据传输率Dr=转速r*一条磁道的字节数N(转/s * Byte/转 = Byte/s)
- 磁盘地址
- [硬盘驱动器(多个硬盘中选择一个硬盘),柱面号(磁道号),盘面号(磁头号),扇区号(块号)]
- 工作过程:寻址、取控制字、执行控制字
- 注意:硬盘属于机械式部件,只能串行操作,无法又读又写或同时读/写两组数据
-
RAID:有RAID0~RAID5方案,可以将多个独立的物理磁盘,组成一个独立的逻辑磁盘,可以形成一个多体存储器
-
固态硬盘SSD
- 原理:基于FlashMemory,属于EEPROM
- 组成
- 存储介质
- 闪存芯片组->闪存芯片->块->页==闪存的读写单元是页==
- 注意:逻辑块号在磁盘中等价于物理块号/扇区号,在SSD中等价于物理页号,而不是物理块号
- 闪存翻译层:接收要操作的逻辑块号,翻译为固态中的物理地址,最终找到对应物理页
- 读写操作
- 以页为单位读写
- 以块为单位擦除,擦干净的块,可以写一次,读无限次
- 支持随机访问,读快写慢
- 若需要写入的块有效,则需要将有效块移动到其他无效块中,然后将当前块置为无效,再将数据写入到该无效块中
- 优缺点(与硬盘相比):SSD更快,无寻道延迟和旋转延迟;SSD更贵更耐摔,SSD的一个块被反复擦写,有可能会坏
- 磨损均衡技术:为了防止一个块被反复擦写,尽可能将擦除”平均“到每一个块上
- 动态擦除:优先擦除累计擦除次数少的块
- 静态擦除:让老的块以读为主,让新块以写为主
片内缓存Cache
- 局部性原理
- 空间局部性:未来需要用的数据,可能就在当前用的数据的附近==比如数组访问、顺序执行的代码==
- 比较外层循环和内层循环对调前后的运行时间
- 时间局部性:未来需要用的数据,可能就是现在用的数据==比如循环结构的代码==
- 性能分析:假设访问一次Cache的时间为$t_c$,访问一次内存的时间为$t_m$
- 命中率H
- 缺失率M=1-H
- Cache与内存的==平均访问时间t===$Ht_{hit}+(1-H)t_{miss}$
- 命中时间:命中就直接访问Cache(花费tc)
- 缺失时间:缺失时需要访问内存,且分配到Cache中==(若同时进行,则tm覆盖了tc,共花费tm;若先后访问,则花费tc+tm)==
- 内存分块与Cache分块
- 内存中的块也叫页、页面、页框
- Cache中的块也叫行
- 内存地址:[内存块号,块内偏移]
- 映射方式
- 全相联映射:Cache块号 = 任意映射
- 直接映射:Cache块号 = 内存块号 % Cache总块数
- 组相联映射:Cache组号 = 内存块号 % Cache组数
- 读写原理
- Cache内增加物理页号、有效位、脏位
- 读:读分配
- 写:写回写分配/写透写不分配
- 支持虚拟存储的Cache(虚拟页号物理偏移形式)
- Cache内将物理页号变为虚拟页号
- 由于Index是虚拟页号,所以需要经过MMU的页表,转换为物理页号,与物理的页内偏移组合,形成最终物理地址
- 由于MMU页表查询比较慢,所以可以增加一个页表缓存TLB(快表),先试图命中TLB的页表项目
- 支持页面替换的Cache(将内存数据与外存置换时,也需要修改Cache的内容)
- Cache内增加外存块号和访问位(访问位也叫引用位)
- 此处如果采用LRU替换策略(还有FIFO等),则访问位可以记录“使用倒计时”,当使用时更新到MAX