存储器概述

存储器的分类

按在计算机中的作用(层次)分类

  • 主存储器/主存/内存储器/内存

    用来存放计算机运行期间所需的程序和数据

    CPU 可直接随机地对其进行访问,也可以和高速缓冲存储器(Cache)及辅助存储器交换数据

    特点:容量较小、存取速度较快、每位的价格较高

  • 辅助存储器/辅存/外存储器/外存

    用来存放当前暂时不用的程序和数据,以及一些需要永久保存的信息

    辅存的内容需要调入主存后才能被 CPU 访问

    特点:容量大、存取速度较慢、单位成本低

  • 高速缓冲存储器 Cache

    位于 CPU 和主存之间,用来存放当前 CPU 经常使用的指令和数据,以便 CPU 能高速地访问它们

    存取速度可与 CPU 的速度相匹配

    特点:存储容量小、价格高,现代计算机通常将它们制作在 CPU 中

按存储介质分类

  • 磁表面存储器(磁盘、磁带)

  • 磁芯存储器

  • 半导体存储器

    1. MOS 型半导体存储器(读写速度慢、集成度高、功耗小)

      SRAM、DRAM、非易失型 MOS 存储器(ROM)

    2. 双极型半导体存储器(读写速度快、集成度低、功耗大)

  • 光存储器(光盘)

按存取方式分类

  • 随机存储器 RAM (Random Access Memory)

    存储器任一单元的内容都可随机存取,且存取时间与存储单元的物理位置无关

    优点:读写方便、使用灵活(主要用作主存或 Cache)

    又分为静态随机存储器 SRAM 和动态随机存储器 DRAM

    同步动态随机存储器 SDRAM 是现在最常用的一种 DRAM

  • 串行访问存储器(Serial Access Memory)

    与 RAM 相对,访问存储单元时需按其物理位置的先后顺序寻址。又分为:

    1. 顺序存取存储器 SAM (Sequential Access Memory)

      其内容只能按某种顺序存取,存取时间的长短与信息在存储体上的物理位置有关

      存取速度慢

      如磁带

    2. 直接存取存储器 DAM (Direct Access Memory)

      存取方式介于 RAM、SAM 之间,存取时通常先寻找整个存储器中的某个小区域,再在小区域内顺序查找

      如磁盘、光盘 CD-ROM

    只读型光盘存储器 CD-ROM (Compact Disc ROM):只能写入一次,不属于 ROM

  • 只读存储器 ROM (Read-Only Memory)

    特点:

    1. 只能读(随机读,RAM 和 ROM 都采用随机存取方式进行信息访问)
    2. 一旦写入就固定不变
    3. 断电内容不丢失

    用途:

    1. 通常用于存放固定不变的程序、常数和汉字字库等
    2. 与 RAM 可共同作为主存的一部分,统一构成主存的地址域

    广义上的 ROM 已可通过电擦除等方式进行写入,失去“只读”特性,保留了断点内容保留、随机读取特性,但写入比读取慢得多

按信息的可保存性分类

  • 易失性存储器

    断电后存储信息即消失,如 RAM

  • 非易失性存储器

    断电后信息仍然保持,如 ROM、磁表面存储器、光存储器

破坏性读出:某个存储单元所存储的信息被读出时,原存储信息被破坏(不会被破坏则称为非破坏性读出)

具有破坏性读出性能的存储器,每次读出操作后,必须紧接一个再生的操作,以便恢复被破坏的信息

存储器的性能指标

设计存储器系统所追求的目标:大容量、高速度、低成本

存储容量

存储容量 = 存储字数 × 字长

存储字数表示存储器的地址空间大小,字长表示一次存取操作的数据量

存储速度

  • 存取时间 $T_a$

    从启动一次存储器操作到完成该操作所经历的时间

    分为读出时间和写入时间

    读出时间:从主存接收到有效地址开始到数据稳定为止的时间

    写入时间:从主存接收到有效地址开始到数据写入被写单元为止的时间

  • 存取周期/读写周期/访问周期 $T_m$

    存储器进行一次完整的读/写操作所需的全部时间,即连续两次独立访问存储器操作(读或写操作)之间所需的最小时间间隔

    DMA 传送方式中的周期挪用方式中,I/O 设备挪用的就是存取周期。对 DMA 请求的响应,可以发生在指令执行过程中的任何两个存取周期之间

    存取时间 ≠ 存储周期

    对任何一种存储器,在读写操作后总有一段恢复内部状态的复原时
    对于破坏性读出的存储器,恢复时间比较长,甚至等于存取时间

  • 带宽/数据传输率 $B_m$

    每秒从存储器进出信息的最大数量

    主存带宽 = 数据总线宽度/存取周期

单位成本

每位价格 = 总成本/总容量

多级层次的存储系统

为解决存储系统大容量、高速度和低成本相互制约的矛盾,在计算机系统中通常采用多级存储器结构

  • 多级存储器结构

  • 三级存储系统的层次结构

    实际上存储系统层次结构主要体现在两个层次上:

    1. Cache-主存

      主要解决 CPU 和主存速度不匹配的问题

      数据调动由硬件自动完成,对所有程序员透明

    2. 主存-辅存

      主要解决存储系统的容量问题

      数据调动由硬件和操作系统共同完成,对应用程序员透明

      形成了虚拟存储系统,在这个系统中程序员编程的地址范围与虚拟存储器的地址空间相对应。对于具有虚拟存储器的计算机系统而言,编程时可用的地址空间远大于主存空间

    这两个层次中,上层内容只是下层内容的副本,即 Cache(主存)中的内容只是主存(辅存)中的内容的一部分

    主存与 CPU、Cache、辅存都能交换信息,辅存则要通过主存与 CPU 交换信息

    现代计算机系统几乎都采用这种三级存储系统

  • 存储器层次结构的主要思想

    上一层的存储器作为低一层存储器的高速缓存

    以“Cache-主存”层次为例,从 CPU 的角度看,该层速度接近于 Cache,容量和位价却接近于主存 ,这就解决了速度、容量、成本三者之间的矛盾

主存储器

SRAM 芯片和 DRAM 芯片

Cache 由 SRAM 实现,主存由 DRAM 实现

SRAM 比 DRAM 贵是因为制造 SRAM 需要更多的硅

存储元:存储器最基本构件,存放一个二进制位的物理器件

地址码相同的多个存储元构成一个存储单元

若干存储单元的集合构成存储体

存储器芯片的内部结构

存储体芯片由存储体、I/O 读写电路、地址译码和控制电路等部分组成

存储体:存储单元的集合,由行选择线(X)和列选择线(Y)来选择所访问存储单元

采用行列地址可减少单个译码器的选通线的数量,使电路简单清晰

地址译码器:将地址转换为译码输出线上的高电平,以便驱动相应的读写电路

I/O 控制电路:控制被选中的单元的读出或写入,具有放大信息的作用

读写控制信号:根据 CPU 给出的是读命令还是写命令,控制被选中单元进行读或写

读写控制线可能有一根,也可能分开两根

片选控制信号:在访问某个字时,用以“选中”该存储字所在的芯片

驱动器:保持电信号稳定

DRAM 的工作原理

存储元通常只使用一个晶体管(MOS 管)

利用存储元电路中栅极电容上的电荷存储信息

读出 1:MOS 管接通后,电容放电,数据线上产生电流(电容内存储了电荷)

读出 0:MOS 管接通后,数据线上无电流(电容内未存储电荷)

电容放电信息被破坏,属于破坏性读出

读出后应有重写操作,也称“再生”。重写导致读写速度更慢

相对于 SRAM 来说,DRAM 具有容易集成、位价低、容量大和功耗低等优点,但存取速度比 SRAM 慢,一般用于大容量的主存系统

采用地址复用技术,地址线、地址引脚数量减半,地址信号分行、列两次先后传送

刷新:栅极电容上的电荷一般只能维持 1~2ms,即使不断电,信息也会自动消失,为此每隔一段时间必须对全部存储元电路进行刷新

  • 通常间隔 2ms 刷新一次,称为刷新周期
  • 刷新单位是行,由芯片内部自行生成行地址
  • 刷新对 CPU 透明,即刷新不依赖于外部的访问
  • 刷新类似于读操作(将原存内容重写一遍),一次刷新占用一个存储器存取周期(≠ 访存,因为没有在总线上输入输出)
  • 刷新时不需要选片,即整个存储器中的所有芯片同时被刷新

常用刷新方式(以刷新周期 2ms、存取周期 0.5μs、128×128 矩阵的存储芯片为例):

  1. 集中刷新

    在一个刷新周期内,利用一段固定的时间,依次对存储器的所有行进行逐一再生

    在此期间停止对存储器的读写操作,称为“死时间”,又称访存“死区”

    优点:读写操作时不受刷新工作的影响

    缺点:在死区不能访问主存

  2. 分散刷新

    把对每行的刷新分散到各个工作周期中,即每个存取周期后绑定一次刷新

    存取芯片的存取周期为 0.5 μs,系统的存取周期为 1 μs

    优点:没有死区

    缺点:加长了系统存取周期,降低了整机的速度(刷新频率太高)

  3. 异步刷新

    每行每隔 2ms(刷新周期)刷新一次,即每隔 $\frac{刷新周期}{行数}=\frac{2000}{128}$μs 刷新一行

    优点:缩短死区(每 15.6μs 有 0.5 μs 的死区),避免使 CPU 连续等待过长的时间;减少刷新次数,从根本上提高了整机的工作效率

SRAM 的工作原理

存储元使用双稳态触发器(6 个 MOS 管)来记忆信息

双稳态:0(A 低 B 高)、1(A 高 B 低)

读出数据,触发器状态保持稳定,属于非破坏性读出,无需重写,读写更快

SRAM 集成度低,容量小,地址位数比较少,因此不采用地址复用,行列地址是同时送的

SRAM 的存取速度快,但集成度低,功耗大,价格昂贵,一般用于高速缓冲存储器

SRAM 和 DRAM 的比较

DRAM 芯片的读写周期

读周期

读出时间 $t_A$:从给出有效地址开始,到读出所选中单元的内容并在外部数据总线上稳定地出现所需的时间

读周期时间 $t_{RC}$:存储芯片进行两次连续读操作所必须间隔的时间(≥ 读出时间)。在读周期内读写控制信号 $\overline{WE}$ 为高电平

片选的保持时间 $t_{CO}$:地址片选信号 $\overline{CS}$ 必须保持低电平到数据稳定输出

为使芯片能正确接收行列地址,行地址、列地址分别需要在行选通信号 $\overline{RAS}$、列选通信号 $\overline{CAS}$ 有效前送到芯片的地址引脚。其中,$\overline{CAS}$ 滞后 $\overline{RAS}$ 一段时间

$\overline{RAS}$、$\overline{CAS}$ 应至少保持 $t_{RAS}$ 和 $t_{CAS}$ 的时间

$\overline{WE}$ 要在 $\overline{CAS}$ 有效前建立

写周期

滞后时间 $t_{AW}$:地址有效后,必须经过 $t_{AW}$ 的时间,$\overline{WE}$ 才能有效(低电平)

写入时间 $t_W$:$\overline{CS}$ 和 $\overline{WE}$ 相与的宽度至少为 $t_W$(都为低电平)

写恢复时间 $t_{WR}$:$\overline{WE}$ 无效后,经 $t_{WR}$ 时间后地址才能改变,否则也可能错误地写入

写周期时间/地址有效时间 $t_{WC}$:连续两次写操作之间的最小时间间隔。$t_{WC}=t_{AW}+t_{W}+t_{WR}$

$t_{DW}$:写入数据必须在写无效之前 $t_{DW}$ 时间就送到数据总线上

写周期中行列选通的时序关系和读周期相同。为了保证数据可靠地写入,写数据必须在 $\overline{CAS}$ 有效前在数据总线上保持稳定

即写数据必须在 $\overline{CAS}$ 有效前、$\overline{WE}$ 无效前 $t_{DW}$ 时间在数据总线上保持稳定

存储器芯片的引脚

引脚组成:电源线、接地线、数据线、地址线、控制线

DRAM 芯片引脚数量:

  • 电源线 ×1
  • 接地线 ×1
  • 数据线数量 = 存储单元位数
  • 地址线数量 = $\frac{\log_{2}存储单元数量}{2}$
  • 控制线:行通选线 ×1(代替片选线)、列通选线 ×1、读写控制线(默认 ×2)

SRAM 芯片引脚数量:

  • 电源线 ×1
  • 接地线 ×1
  • 数据线数量 = 存储单元位数
  • 地址线数量 = $\log_{2}存储单元数量$
  • 控制线:片选线 ×1、读写控制线(默认 ×2)

只读存储器

ROM 特点

结构简单,位密度比可读写存储器的高

具有非易失性,可靠性高

ROM 类型

  • 掩模式只读存储器 MROM (Mask ROM)

    厂家按客户要求,在芯片生产过程中直接写入信息,之后任何人不可重写(只能读出)

    优点:可靠性高,集成度高,价格便宜

    缺点:灵活性差

  • 一次可编程只读存储器 PROM (Programmable ROM)

    允许用户利用专门的设备(编程器)写入,一旦写入,内容无法改变

  • 可擦除可编程只读存储器 EPROM (Erasable Programmable ROM)

    可进行多次改写

    无法取代 RAM,因为 EPROM 编程次数有限,且写入时间过长

  • 紫外可擦除可编程只读存储器 UVEPROM (Ultra-Violet Erasable Programmable ROM)

    用紫外线照射 8~20 分钟,擦除所有信息

  • 电可擦除可编程只读存储器 EEPROM (Electrically Erasable Programmable ROM)

    用电擦除重写

  • 闪存(Flash Memory)

    EEPROM 的变种,能在字节水平上进行删除和重写(EEPROM 是整个芯片擦写),且擦除重写的速度快

    兼有 ROM 和 RAM 的优点,可在不加电的情况下长期保存信息,又能在线进行快速擦除与重写

    每个存储元只需单个 MOS 管,位密度比 RAM 高

    写入前要先擦除,因此写比读慢

  • 固态硬盘 SSD (Solid State Drives)

    用固态电子存储芯片阵列制成的硬盘,由控制单元和存储单元(Flash 芯片)构成,与闪存的主要区别在于控制单元不一样

    保留了 Flash 存储器长期保存信息、快速擦除与重写的特性,对比传统硬盘也具有读/写速度快、低功耗的特性

    缺点是价格较高

    手机辅存也使用 Flash 芯片,但相比 SSD 使用的芯片集成度更高、功耗更低、价格更贵

  • BIOS (Basic Input/Output System) 芯片

    主板上的 BIOS 芯片(ROM)存储了自举装入程序

    逻辑上,主存由 RAM+ROM(BIOS) 组成,且二者常统一编址

不难看出,很多 ROM 也具有随机存取的特性。但不意味着它们可以作为随机存取存储器(写入时间过长,且改写次数有限)

主存储器的基本组成

MAR 和 MDR 理论上属于主存,但现代计算机绝大多数集成于 CPU 中

注意上图中有两个地址寄存器:主存地址寄存器 MAR 和主存中的地址寄存器(图源:袁书)

DRAM 芯片容量较大,地址位数较多,为了减少芯片的地址引脚数,通常采用地址引脚复用技术,行地址和列地址通过相同的引脚分先后两次输入,这样地址引脚数可减少一半

多模块存储器

属于空间并行技术

思想:CPU 的读写速度比主存快很多,若能同时从主存中访问多条数据或指令,就可充分利用 CPU 资源,提高运行速度

单体多字存储器

存储体还是一个,但每个存储单元存储了 $m$ 个字,如此就能在一个存取周期内从同一地址取出 $m$ 个字(一次并行读出 $m$ 个字)。当然,这要求总线宽度也为 $m$ 个字

优点:增大了存储器的带宽,提高了单体存储器的工作速度

缺点:

  1. 指令和数据在主存内必须是连续存放的。一旦遇到转移指令,或操作数不能连续存放,这种方法的效果就不明显
  2. 不能单独取某个字

多体并行存储器

多体并行存储器由多体模块组成(就是多根内存条)

各模块容量和存取速度(主频)相同

不同也不是不行,只是不能完全实现并行和发挥性能(木桶效应)

各模块都有独立的读写控制电路、地址寄存器和数据寄存器

分为高位交叉编址和低位交叉编址两种

高位交叉编址(顺序方式)

高位地址为体号,低位地址为体内地址

理论上多个存储器可以并行访问,但通常都是连续访问,实际效果相当于单纯的扩容,存取方式仍是串行存取,因此这种存储器仍是顺序存储器

低位交叉编址(交叉方式)

低位地址为体号,高位地址为体内地址

$m$ 个模块按“模 $m$”交叉编址

程序连续存放在相邻模块中,因此称采用此编址方式的存储器为交叉存储器

可在不改变每个模块存取周期的前提下,采用流水线方式并行存取(宏观),提高存储器的带宽

各模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作(看存储器总线宽度)

存取周期为 $T$,总线周期为 $r$,为使流水线不间断,应保证模块数 $m ≥ T/r$

宏观上,一个存取周期内,$m$ 体交叉存储器可以提供的数据量为单个模块的 $m$ 倍

访存冲突:在某个模块上一个存取周期尚未结束的情况下进行再次访问。在 $m = T/r$ 的情况下体现为,给定的访存地址在相邻的 $m$ 次访问中出现在同一个存储模块内

采用低位交叉编址的多模块存储器时,存储体数应 $\geq T/r$

特别注意

408 默认:交叉编址方式 = 低位交叉编址

另外低位交叉编址还有两种不同启动方式:

之前描述的是轮流启动,408 默认 $m = T/r$

同时启动:

考试要判断是轮流启动还是同时启动!区别很大!如果每个存储模块存储字位数和存储器总线中的数据位数相等,则是轮流启动;若所有存储模块一次并行读写的总位数正好等于存储器总线中的数据位数,则可以采用同时启动方式

存取周期/存取时间与总线周期没有必然联系,前者是对于存储器而言,后者是对于总线而言
从大小上说,一般是存取周期 > 总线周期 > 存取时间的,这就使得 CPU 不能连续得存取数据,只能等待
想让 CPU 连续存取,一般是采用多存储器并行或交叉工作的方式

双端口 RAM

属于时间并行技术

作用:优化多核 CPU 访问一根内存条的速度

需要有两组完全独立的数据线、地址线、控制线,CPU、RAM 中也要有更复杂的控制电路

允许两个独立的控制器同时异步地访问存储单元,但不允许同时写同一个单元,不允许同时一个读、一个写同一个单元

解决方法:置“忙”信号 $\overline{BUSY}$ 为 0,由判断逻辑决定暂时关闭一个端口(即被延时)。未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问(类比于 OS 中的信号量)

多通道存储器

现在的计算机中可以有多条存储器总线同时进行数据传输,支持两条总线同时进行传输的内存条插槽为双通道内存插槽,还有三通道、四通道内存插槽,其总线的传输带宽可以分别提高到单通道的两倍、三倍和四倍(一般是相同颜色的插槽可以并行传输)

主存储器与 CPU 的连接

连接原理

  • 主存和 CPU 的连接

    主存通过数据总线、地址总线和控制总线与 CPU 连接

    数据总线的位数与工作频率的乘积正比于数据传输率

    地址总线的位数决定了可寻址的最大内存空间

    控制总线(读/写)指出总线周期的类型和本次输入/输出操作完成的时刻

  • 单个芯片的容量不可能很大,往往通过存储器芯片扩展技术,将多个芯片集成在一个内存条上,然后由多个内存条及主板上的 ROM 芯片组成计算机所需的主存空间,再通过总线与 CPU 相连

  • 存储器芯片的输入输出信号

主存容量的扩展

单个存储芯片的容量有限,它在字数或字长方面与实际存储器的要求都有差距,因此需要在字和位两方面进行扩充才能满足实际存储器的容量要求

32K × 16 位存储芯片,意味着该芯片存储字数 32K、存储字长 16 位
若题目在说明存储芯片不是以“字数 × 字长”形式给出的,如 16KB,且根据题干和选项也推测不出时,则默认存储字长为 8 位,即 16K × 1B

位扩展法

用多个存储器件对字长进行扩充,增加存储字长

当 CPU 的系统数据线数多于存储芯片的数据位数时,必须对存储芯片扩位,使其数据位数与 CPU 的数据线数相等

连接方式:各芯片的地址线、片选线和读/写控制线与系统总线相应并联;各芯片的数据线单独引出,分别连接系统数据线。各芯片同时工作

仅采用位扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,在某一时刻选中所有的芯片,所以片选信号 $\overline{CS}$ 要连接到所有芯片

字扩展法

对存储字的数量进行扩展,而存储字的位数满足系统要求(系统数据线位数等于芯片数据线位数,系统地址线位数多于芯片地址线位数)

连接方式:各芯片的地址线与系统地址线的低位对应相连;由系统地址线的高位译码得到各芯片的片选信号;各芯片的数据线和读/写控制线与系统总线相应并联。各芯片分时工作

优点:地址空间可连续

缺点:电路复杂

字位同时扩展法

既增加存储字的数量,又增加存储字长,是前两种扩展的组合

连接方式:将进行位扩展的芯片作为一组,各组的连接方式与位扩展的相同;由系统地址线高位译码产生若干片选信号,分别接到各组芯片的片选信号

存储芯片的地址分配和片选

片内字选通常是由 CPU 送出的 $N$ 条低位地址线完成的,它们直接接到所有存储芯片的地址输入端($N$ 由片内字数 $2^N$ 决定)

片选信号的产生分为线选法和译码片选法

线选法

用除片内寻址外的高位地址线直接(或经反相器)分别接至各个存储芯片的片选端

这些片选地址线每次寻址只能有一位有效(为 0 有效),这样才能保证每次只选中一个芯片或芯片组

优点:不需要地址译码器,线路简单

缺点:地址空间不连续,选片的地址线必须分时为低电平(否则不能工作),不能充分利用系统的存储器空间,造成地址资源的浪费

译码片选法

用除片内寻址外的高位地址线通过地址译码器芯片产生片选信号

补充:译码器

存储器与 CPU 的连接

合理选择存储芯片

主要指存储芯片的类型(RAM 或 ROM)和数量的选择

通常选用 ROM 存放系统程序、标准子程序和各类常数,RAM 则是为用户编程而设置的

在考虑芯片数量时,要尽量使连线简单、方便

地址线的连接

CPU 的地址线数往往比存储芯片的地址线数要多

通常将 CPU 地址线的低位与存储芯片的地址线相连,以选择芯片中的某一单元(字选)。这部分的译码是由芯片的片内逻辑完成的

CPU 地址线的高位则在扩充存储芯片时使用,用来选择存储芯片(片选)。这部分译码由外接译码器逻辑完成

实际的主存容量不能代表 MAR 的位数,考虑到存储器扩展的需要,MAR 应保证能访问到整个主存地址空间,因此是 MAR 的位数决定了主存地址空间的大小

数据线的连接

CPU 的数据线数与存储芯片的数据线数不一定相等

在相等时可直接相连,在不等时必须对存储芯片扩位,使其数据位数与 CPU 的数据线数相等

读/写命令线的连接

读/写命令线为一根时直接与存储芯片的读/写控制端相连,通常高电平读、低电平写

读/写命令线分开时,读为 $\overline{RD}$,写为 $\overline{WE}$,均为低电平有效,此时 CPU 的读命令线与存储芯片的允许读控制端相连,写命令线与存储芯片的允许写控制端相连

片选线的连接

存储器由许多存储芯片叠加而成,哪一片被选中完全取决于该存储芯片的片选控制端 $\overline{CS}$ 是否能接收到来自 CPU 的片选有效信号

片选有效信号与访存控制信号 $\overline{MREQ}$​ 有关(低电平有效),因为只有当 CPU 要求访存时才要求选中存储芯片

若 CPU 访问 I/O,则 $\overline{MREQ}$ 为高,表示不要求存储器工作

CPU 可使用译码器的使能端控制片选信号的生效时间

外部存储器

磁盘存储器

优点:

  1. 存储容量大,位价格低
  2. 记录介质可重复使用
  3. 记录信息可长期保存而不丢失,甚至可脱机存档
  4. 非破坏性读出,读出时不需要再生

缺点:存取速度慢,机械结构复杂,对工作环境要求较高

磁盘存储器

磁盘设备的组成
  • 硬盘存储器的组成:磁盘驱动器 + 磁盘控制器 + 盘片

  • 磁盘驱动器

    核心部件是磁头组件和盘片组件,温彻斯特盘是一种可移动磁头固定盘片的硬盘存储器

  • 磁盘控制器

    硬盘存储器和主机的接口,主流的标准有 IDE、SCSI、SATA 等

  • 存储区域

    一块硬盘含有若干记录面,每个记录面划分为若干磁道,每条磁道划分为若干扇区,扇区是磁盘读写的最小单位

  • 磁头数(Heads):即记录面数

    柱面数(Cylinders):表示硬盘每面盘片上有多少条磁道。在一个盘组中,不同记录面的相同编号(位置)的各磁道构成一个圆柱面

    扇区数(Sectors):表示每条磁道上有多少个扇区

磁盘的性能指标
  • 记录密度

    盘片单位面积上记录的二进制的信息量,通常以道密度、位密度和面密度表示

    道密度:沿磁盘半径方向单位长度上的磁道数

    位密度:磁道单位长度上能记录的二进制代码位数

    面密度:位密度和道密度的乘积

    磁盘所有磁道记录的信息量一定是相等的,并不是圆越大信息越多,故每个磁道的位密度都不同,越内侧的磁道位密度越大

  • 磁盘容量

    一个磁盘所能存储的字节总数,有非格式化容量和格式化容量之分

    非格式化容量:磁记录表面可以利用的磁化单元总数,由道密度和位密度计算而来

    格式化容量:按照某种特定的记录格式所能存储信息的总量

    格式化后的容量比非格式化容量要小

  • 平均存取时间

    平均存取时间 = (磁盘控制器延迟)+ 寻道时间 + 旋转延迟时间 + 传输时间

    寻道时间取决于磁盘调度算法,旋转延迟时间和传输时间与磁盘转速线性相关

    由于寻道和找扇区的距离随机,故寻道时间和旋转延迟时间通常都取平均值

    题目没给旋转延迟时间的话,默认转半圈

  • 数据传输率 $D_r$

    磁盘存储器在单位时间内向主机传送数据的字节数

    $D_r=rN$(磁盘转速 r 转/秒,每条磁道容量为 N 字节)

  • 磁盘地址

  • 磁盘的工作过程

    硬盘主要操作是寻址、读盘、写盘,每个操作对应一个控制字

    硬盘工作时,第一步是取控制字,第二步是执行控制字

    硬盘属于机械式部件,其读写操作是串行的,不可能在同一时刻既读又写,也不可能在同一时刻读/写两组数据

磁盘阵列

  • 独立冗余磁盘阵列 RAID (Redundant Array of Independent Disks)

    将多个独立的物理磁盘组成一个独立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性

  • RAID0(无冗余和无校验的磁盘阵列)

    只实现了条带化和并行访问

    优点:数据存取快;容量大,充分利用磁盘空间,利用率为 100%

    缺点:不提供数据冗余,存在单点故障;不可靠,无数据检验,不能保证数据的正确性

    磁盘条带化:把连续多个数据块交替地存放在不同物理磁盘的(相同位置的)扇区中,几个磁盘交叉并行读写,不仅扩大了存储容量,还能将 I/O 的负载均衡到多个物理磁盘上,提高磁盘数据存取速度
    原理上感觉和主存的低位交叉编址很像

  • RAID1(镜像磁盘阵列)

    每个磁盘都具有一个对应的镜像盘

    磁盘与其镜像盘同时进行读写,互为备份

    磁盘阵列中单位成本最高,磁盘利用率最低,但提供了很高的数据安全性和可用性

  • RAID2(采用纠错的海明码的磁盘阵列)

    RAID0 优化版本,采用海明码校验(纠正一位错误并检测双位错误)

  • RAID3(位交叉奇偶校验的磁盘阵列)

    类似于 RAID2,采用位交叉奇偶检验,只需一个冗余的校验磁盘

  • RAID4(块交叉奇偶校验的磁盘阵列)

    采用块奇偶检验,类似于 RAID3,不同的是,在数据分割上 RAID3 对数据的访问按位进行,而 RAID4 以数据块为单位

  • RAID5(无独立校验的奇偶校验磁盘阵列)

    类似于 RAID4,不同之处在于 RAID5 把奇偶校验条带分布在所有磁盘中

  • RAID6

    与 RAID5 相比,增加了第二个独立的奇偶校验信息块,双重奇偶校验(P+Q)


除 RAID0 外,无论何时有磁盘损坏,都可以拔出受损的磁盘再插入好的磁盘,而数据不会损坏,提高了系统的可靠性

总之,RAID 通过同时使用多个磁盘,提高了存储容量和传输率;通过在多个磁盘上并行存取来大幅提高存储系统的数据吞吐量;通过镜像功能,提高安全可靠性;通过数据校验,提供容错能力

固态硬盘

见 CO7

高速缓冲存储器

程序访问的局部性原理

在程序的执行过程中,对信息的访问是不均匀的

时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息

空间局部性:在最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是临近的,因为指令通常是顺序存放、顺序执行的,数据一般也是以向量、数组等形式簇聚在一起的

高速缓冲技术利用程序的局部性原理,把程序中正在使用的部分存放在一个高速的、容量较小的 Cache 中,使 CPU 的访存操作大多数针对 Cache 进行,从而大大提高程序的执行速度

Cache 的基本工作原理

  • 整个过程全部由硬件实现

  • 每次读入的主存块,若 Cache 不命中时会同时调入 Cache

  • Cache 和主存都被划分为相等的块,每块由若干字节组成(Cache 中的块也称为行)

    Cache 仅保存主存中最活跃的若干块的副本

    行长太小,不能充分利用程序访问的空间局部性;行长太大,失效损失变大(若未命中,则需花更多时间从主存读块)

    CPU 与 Cache/主存间信息交互的单位是字,而 Cache 与主存间信息交互的单位是块/行

  • Cache 的命中率:CPU 欲访问的信息已在 Cache 中的比率 $H$

  • Cache-主存系统的平均访问时间 $T_a$ 的计算

    设 $t_c$ 为访问一次 Cache 所需时间,$t_m$ 为访问一次主存所需时间

    不同的访问方式有着不同的计算公式:

    1. 先访问 Cache,发现未命中再访问主存

      $T_a=Ht_c+(1−H)(t_c+t_m)$

    2. 同时访问 Cache 和主存,若 Cache 命中则停止访问主存

      $T_a=Ht_c+(1−H)t_m$

  • 行长与命中率的关系

    行长较大,可以充分利用程序访问的空间局部性,使一个较大的局部空间被一起调到 Cache 中,因而可以增加命中机会

    但行长过大会使得 Cache 行数过少,命中的可能性反而降低,同时行长大使失效损失变大,也就是说,若未命中,则需花更多时间从主存读块

Cache 和主存的映射方式

把主存地址空间映射到 Cache 地址空间,即把存放在主存中的信息按照某种规则装入 Cache

  1. 给每个 Cache 行增加一个标记,指明它是主存中哪一块的副本
  2. 每个 Cache 行还需要一个有效位,以说明该行中的信息是否有效

地址映射的方法有三种:

直接映射

Cache 行号 = 主存块号 mod Cache 总行数

Cache 地址 = 行号 + 行内地址

对于容量为 $2^n$ 字节、总行数为 $2^m$ 行的 Cache,主存地址的低 $n$ 位为 Cache 地址,而这 $n$ 位地址的高 $m$ 位为 Cache 行号

标记位数 = $\log_{2}{\frac{主存容量}{Cache 容量}}$

显然,主存中的每一块映射到 Cache 中的位置是唯一的

不命中:标记不相等或有效位为 0

优点:实现简单,对于任意一个地址,只需对比一个标记,速度最快;标记所占的额外空间开销最少

缺点:不够灵活,Cache 存储空间利用不充分(即使 Cache 的其他地方空着也不能占用),块冲突概率最高,空间利用率最低,命中率最低

比较器:1 个(因为每个主存块只能映射到唯一的 Cache 行)

比较器:位数等于标记字段的位数,用于比较主存地址中的标记字段和 Cache 行标记字段。比较器查找块的过程是一种“按内容访问”的存取方式,因此比较器是一种“相联存储器”

全相联映射

主存中的每一块可以装入 Cache 中的任何位置,每行的标记用于指出该行取自主存的哪一块

优点:比较灵活,Cache 块的冲突概率低(只要有空闲 Cache 行,就不会发生冲突),空间利用率高,命中率高

缺点:标记的比较速度最慢,有可能需要对比所有行的标记;实现成本较高,需要设置较多的比较器(相联存储器价格昂贵)。时间开销和硬件开销都较大,不适合大容量 Cache

比较器:每个 Cache 行都设置一个比较器

组相联映射

N 路组相联映射:每 N 个 Cache 行为一组,实质是将 N 个 Cache 行合并,组内采用全相联方式,组间采用直接映射方式

Cache 组号 = 主存块号 mod Cache 组数

N 路组相联映射可以映射到 N 行

优点:另外两种方式的折中,综合效果较好

路数越大,即每组的行数越大,发生块冲突的概率越低,但相联比较电路也越复杂。选定适当的数量,可使成本接近直接映射,同时性能上接近全相联映射

比较器:N 个

一组只有一行 = 直接映射


当 Cache 大小、主存块大小一定时:

  1. 直接映射的命中率最低,全相联映射的命中率最高
  2. 直接映射的判断开销最小、所需时间最短,全相联映射的判断开销最大、所需时间最长
  3. 直接映射标记所占的额外空间开销最小,全相联映射标记所占的额外空间开销最大

Cache 中主存块的替换算法

Cache 满后,对 Cache 块进行替换或淘汰的策略

  • 随机 RAND 算法

    随机选一行替换

    优点:实现简单

    缺点:完全没考虑局部性原理,命中率低,实际效果很不稳定

  • 先进先出 FIFO 算法

    选最早被调入的行替换

    优点:比较容易实现

    缺点:没有遵循局部性原理,效果差

  • 近期最少使用 LRU 算法

    选近期内最久没有被访问的行替换。是堆栈类算法

    基于局部性原理,近期被访问过的主存块在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的

    实现:每行设置一个计数器,用于记录多久没被访问。行总数为 $2^n$ 时,计数器位数为 $n$

    计数器的变化规则:

    1. 未命中且还有空闲行时,新装入的行的计数器置 0,其余非空闲行全加 1
    2. 未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的计数器置 0,其余全加 1
    3. 命中时,所命中的行的计数器清零,值比其低的计数器加 1,其余不变(值比其高的计数器加 1 也可以,但没必要,不加的话还能使计数器位数不超过 $n$)

    若被频繁访问的主存块数量 > Cache 行的数量,则有可能发生“抖动”

    LRU 算法实际运行效果优秀,Cache 命中率高

  • 最不经常使用 LFU 算法

    将一段时间内被访问次数最少的行换出

    实现:每行设置一个计数器,用于记录被访问过多少次。新调入的块计数器为 0,之后每被访问一次计数器加 1。需要替换时,选择计数器最小的一行;若有多个计数器最小的行,可按行号递增或 FIFO 策略进行选择

    并没有很好地遵循局部性原理,曾经被经常访问的主存块在未来不一定会用到,因此实际运行效果不如 LRU

    LFU 中计数器的位数应该与时间段长度有关

注意:Cache 和主存的映射方式为直接映射时,无须使用替换算法。因为在直接映射方式中,主存中的每一块只能装入 Cache 中的唯一位置。若这个位置已有内容,则产生块冲突,原来的块将无条件地被替换出去。另外,组相联映射方式下的替换范围应该是同组的

Cache 写策略

目标:既保证主存块和 Cache 块的数据一致性,又尽量提升效率

写命中时

  • 写回法/回写法(write-back)

    只修改 Cache 的内容,而不立即写入主存,只有当此块被换出时再写回主存

    需对每行增加一个脏位,以表示是否被修改过

    减少了访存次数,但存在数据不一致的隐患

  • 全写法/写直通法(write-through)/直写法

    数据同时写入 Cache 和主存

    优点:实现简单,能随时保持主存数据的正确性

    缺点:增加了访存次数,降低了 Cache 的效率

    可在 Cache 和主存之间加一个写缓冲(Write Buffer,SRAM 实现的 FIFO 队列),CPU 同时写数据到 Cache 和写缓冲中,写缓冲再在专门的控制电路控制下逐一写回主存,以减少直接写入主存的时间损耗

    但若出现频繁写时,会使写缓冲饱和而发生溢出/阻塞

写不命中时

  • 写分配法(write-allocate)

    把主存中的块调入 Cache,在 Cache 中修改

    试图利用程序的空间局部性,但缺点是每次写不命中都需要从主存中读一块

    通常搭配写回法使用

  • 写不分配法/非写分配法(not-write-allocate)

    只写入内存,不进行调块

    通常搭配全写法使用

多级 Cache

现代计算机常采用多级 Cache(通常为 3 级),离 CPU 越远,访问速度越慢,容量越大

各级 Cache 间常采用“全写法 + 写不分配法”;Cache 和主存间常采用“写回法 + 写分配法”(速度差太多,避免写缓冲饱和)


  • 综上,Cache 的总容量包括:

    1. 存储容量

    2. 标记阵列/地址映射表容量

      每个 Cache 行对应一个标记项/表项。标记项/表项的内容有:

      有效位(1)、标记 Tag、一致性维护位/脏位(1)(写回法)、替换算法控制位/计数器(LRU/LFU)

  • 指令 Cache 和数据 Cache 分离(也称哈佛 Cache)

    取指和取数分别到不同的 Cache 中寻找,使指令流水线中取指部分和取数部分很好地避免冲突,即减少了指令流水线的冲突

    允许 CPU 在同一个 Cache 存储周期内同时提取指令和数据,可以保证不同的指令同时访存

    而且分离的指令和数据 Cache 还可以充分利用指令和数据的不同局部性来优化性能

Cache 读缺失处理

整个过程全部由硬件实现

读数据 Cache 缺失

  1. 对主存进行读操作(以 Cache 块为单位)

  2. 将包含有所需数据的块写入 Cache 中,并更新有效位和标记位

    若 Cache 已满,则先对 Cache 行进行替换

取指令 Cache 缺失

  1. 程序计数器恢复当前指令的值

  2. 对主存进行读操作(以 Cache 块为单位)

  3. 将包含有所需指令的块写入 Cache 中,并更新有效位和标记位

    若 Cache 已满,则先对 Cache 行进行替换

  4. 重新执行当前指令

虚拟存储器

虚拟存储器基本概念

虚拟存储器将主存和辅存的地址空间统一编址,形成一个庞大的地址空间

对应用程序员而言,虚拟存储器是透明的

虚拟存储器的 3 个地址空间:

页式虚拟存储器

页表

快表

又称相联存储器 TLB,是具有并行查找能力的高速缓冲存储器,位于 CPU,属于 SRAM。基于局部性原理,存放有若干页表项,以减少访问内存的次数

采用相联存储器件组成,按内容查找,查找速度快

相联存储器的基本原理是把存储单元所存内容的某一部分作为检索项(即关键字项)去检索该存储器,并将存储器中与该检索项符合的存储单元进行读取或写入,所以它是按内容指定方式和地址指定方式相结合进行寻址的存储器

和主存的映射方式通常采用全相联或组相联方式

TLB 项内容 = TLB 标记字段 + 页表项内容 。在全相联方式下,TLB 标记字段为虚页号;组相联方式下,虚页号高位部分为 TLB 标记字段,低位部分为 TLB 组索引

具有 TLB 和 Cache 的多级存储系统

TLB 冗余了活跃的页表项(原本在内存中),用于虚拟地址转换为物理地址时;Cache 则是冗余了活跃的内存块,用于通过物理地址访问内存时

TLB 和 Cache 的访问过程

TLB 满了同样需要采用替换策略

带 TLB 虚拟存储器的 CPU 访存过程

在一个具有 Cache 和 TLB 的虚拟存储系统中,CPU 一次访存操作可能涉及 TLB、页表(主存)、Cache、主存和磁盘的访问,相应地,CPU 访存过程中存在三种缺失情况:

  1. TLB 缺失:要访问的页面的页表项不在 TLB 中
  2. Cache 缺失:要访问的主存块不在 Cache 中
  3. Page 缺失:要访问的页面不在主存中

这三种缺失的可能组合情况为:

注意:TLB 命中则 Page 必然命中

Cache 缺失处理由硬件完成;缺页处理由软件完成(操作系统通过缺页异常处理程序来实现);TLB 缺失既可以用硬件又可以用软件来处理

段式虚拟存储器

段表比基本段式存储器多了个装入位

段页式虚拟存储器

每个程序对应一个段表,每段对应一个页表,段的长度必须是页表的整数倍,段的起点必须是某一页的起点

虚拟存储器与 Cache 的比较

相同之处

  1. 最终目标都是为了提高系统性能,两者都有容量、速度、价格的梯度
  2. 都把数据划分为小信息块,并作为基本的传递单位,虚存系统的信息块更大
  3. 都有地址的映射、替换算法、更新策略等问题
  4. 依据程序的局部性原理应用“快速缓存的思想”,将活跃的数据放在相对高速的部件中

不同之处

  1. Cache 主要解决系统速度;虚拟存储器为了解决主存容量
  2. Cache 全由硬件实现,是硬件存储器,对所有程序员透明;而虚拟存储器由 OS 和硬件共同实现,是逻辑上的存储器,对系统程序员不透明,对应用程序员透明
  3. 虚拟存储器系统不命中时对系统性能影响更大(主存和硬盘速度差太多:CPU 速度约为 Cache 的 10 倍,主存的速度为硬盘的 100 倍以上)
  4. CPU 与 Cache 和主存都建立了直接访问的通路,而辅存与 CPU 没有直接通路。也就是在 Cache 不命中时主存能和 CPU 直接通信,同时将数据调入 Cache;而虚拟存储器系统不命中时,只能先由硬盘调入主存,而不能直接和 CPU 通信