存储器

存储器的层次化结构

  • 层次:略
  • 主存与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