第4章 存储系统
第4章 存储系统
前言:本章主要介绍存储器,包括主存储器和辅助存储器。

1、存储器概述
1)存储器的分类
①分类情况
-
存储介质
- 磁存储器
- 主要包括磁芯、磁盘、磁带存储器和机械硬盘;
- 磁盘、磁带中都包含有机械装置,因此体积大、存取速度慢、但其单位容量成本最低。
- 光存储器
- 利用介质的光学特性读出数据;
- 例如CD-ROM/DVD-ROM光盘。
- 半导体存储器
- 用半导体器件组成的存储器;
- 存取速度快、体积小、性能可靠,但单位容量成本相对较高;
- 例如内存、固态硬盘。
- 磁存储器
-
存取方式
- 顺序存储器
- 存储单元中的内容只能依地址顺序访问;
- 存取速度与存储单元的位置有关;
- 磁带存储器就是典型的顺序存储器。
- 随机存储器
- 可按给定的任何一个存储单元的地址对其内容进行存取;
- 存取速度与存储单元的位置无关;
- 早期的磁芯存储器和当前广泛使用的半导体存储器都是随机存储器。
- 直接存储器
- 不必经过顺序搜索就能在存储器中直接存取信息口;
- 兼有随机存储器和顺序存储器的访问特性;
- 典型的如磁盘存储器。由于磁盘存在机械寻道和旋转延迟,因此数据访问时间和磁头与目标扇区的距离有关。
- 顺序存储器
-
可改写性
- 读写存储器
- 既能读出也能写入信息
- 只读存储器
- 存储的内容不允许被改变,只能读出;
- 常见的有光盘存储器;
- 还有半导体只读存储器,信息只能读出、不能随意写入。主要用来存放一些不需要修改的程序(例如BIOS)和常量。
- 读写存储器
-
可保存性
- 易失性存储器
- 断电后所保存的信息会丢失;
- 例如内存,CPU内部的寄存器存储器和高速缓冲存储器。
- 非易失性存储器
- 断电后所保存的信息不丢失;
- 例如磁盘、磁带存储器、固态硬盘等。
- 易失性存储器
-
功能和存取速度
-
寄存器存储器
- CPU内部的多个寄存器(例如MAR、MDR、ACC、MQ等);
- 用于存放地址、数据以及运算的中间结果。
- 速度与CPU匹配,容量极小。
-
高速缓冲存储器
- 寄存器与主存之间的一个高速小容量存储器;
- 用于缓冲CPU与主存之间的性能差异,提高存储系统的访问速度;
- 存放内容一般是即将或经常要使用的指令和数据。
-
主存储器
- 用于存放指令和数据;
- CPU可以通过主存地址随机地读写主存;
- 存取速度低于高速缓存,但一般高于辅存;
- 容量远大于高速缓存,但一般远小于辅存。
-
辅助存储器
- 存放当前暂不参与运行的程序和数据,以及一些需要长期保存的信息。
- 容量很大,但存取速度相对较低。
-
整体情况如图所示
-
②分类总结

2)存储器性能指标与存储系统层次结构
①性能指标
-
存储容量
-
存储容量是指存储器可以存储的二进制信息的总量;
-
存储容量 = 存储字长 x 存储单元数量;
-
-
存取速度
-
存取时间
- 启动一次存储器操作到该操作完成所经历的时间。
- 读出时间和写入时间可能不同;例如闪存(读快写慢)。
-
存取周期
- 连续两次访问存储器操作(读操作或写操作)之间所需要的最短时间间隔;
- 对于主存,存取周期除包括存取时间外,还包括存储器状态的稳定恢复时间,因此存取周期略大于存取时间。
-
存储器带宽
- 单位时间内存储器所能传输的信息量(单位:b/s或B/s);
- 它是衡量数据传输速率的重要指标,与一次传输的数据位的多少和存取时间的长短有关;
- 一般而言,数据位宽越大、存取时间越短,则存储器带宽越高。
-
②层次结构
- 上层存储器可为下层存储器做缓冲,将最经常使用的数据的副本调度到上层,使得CPU只需要访问上层的快速小容量存储器即可获得大部分数据。可以有效提高存储系统的访问速度,缓解CPU与主存(内存)、主存(内存)与辅存(外存)的性能差异;
- 另外,使用大容量辅存(外存),缓解了主存(内存)容量不足的问题。

基于这种层次结构,就可构建出满足应用需求的 存储容量大、存取速度快、成本低的存储系统。
3)主存的基本结构
主存是机器指令直接操作的存储器,需要基于主存地址对其进行随机访问。
地址译码器:将MAR输入的信号进行解释,使用有效信号1作为高电平,0为低电平,选中对应的存储单元;

①CPU从主存中读取信息过程
图例中标注了执行顺序和对象

②CPU向主存写入信息过程

随着硬件技术的发展,内存都制成大规模集成电路芯片,而将MAR和MDR集成到了CPU中。
4)用于地址译码的译码结构
①单译码结构
若主存的存储体包含64个存储单元,每个存储单元只能存储1个二进制位,请给出只使用一个译码器就能寻址这64个存储单元的方案(即译码器的地址输入线和译码输出线各需要几条)。

若存储体包含64k个存储单元,则译码器的地址输入线和译码输出线各需要几条?
-
译码输出线:64k条
-
地址输入线:16条(216=64k)
单译码结构只适用于容量很小的存储芯片(例如,容量在几百个存储单元以内的存储芯片)。
②双译码结构

在大容量存储器中普遍采用双译码结构
③两种结构比较
使用双译码结构能够减少译码输出线,只需将行、列地址译码器的条数相加即可。

5)主存中数据的存放
①机器字长与存储字长
机器字长:CPU一次能够处理的二进制数据的位数。
存储字长:主存中的一个存储单元所能存储的二进制位数。
存储字长与机器字长不一定相同,例如机器字长为32位的计算机,所采用的存储字长可以是16位、32位或64位。
②地址访问模式
主存通常按字节进行编址,而存储字长(主存中的一个存储单元所能存储的二进制位数)是字节的2的整数次幂倍(例如1字节,2字节,4字节等)。
以机器字长为32位的计算机为例,对主存的访问既可以按字节访问,也可以按16位半字访问,还可以按32位字访问。因此,可将主存地址分为:
- 字节地址
- 半字地址
- 字地址

用汇编语言访问不同存储单元举例:

从上述程序可以看出,不同的地址访问模式(字节访问、半字访问、字访问)所使用的主存地址实际上都是字节地址,CPU在执行指令的时候可以将字节地址的低2位用于访问控制:
- 采用字节访问模式,字节地址的低2位用于选择字存储单元中的哪一个字节。
- 采用半字访问模式,字节地址的倒数第2位用于选择字存储单元中的哪个半字。
③大端和小端方式
- 小端方式
- 将数据的低字节保存在主存的低地址中,而数据的高字节保存在主存的高地址中。
- 这样可以将主存地址的高低与数据的位权有效地结合起来,高地址存储的数据部分的权值高低地址存储的数据部分的权值低,符合逻辑。
- 大端方式
- 将数据的高字节保存在主存的低地址中,而数据的低字节保存在主存的高地址中。
- 符合人类的正常思维

- 上述两种方式并没有绝对的优劣之分,它们在不同的处理器架构和应用场景中都有各自的适用性和优势
- 除处理器外,大小端方式还涉及外部设备设计、网络数据传输、音视频文件保存等。
- 小端与大端方式的区别不仅存在于处理器的寄存器、存储器中,在指令集、系统总线等各个层次中也可能存在差别。
④数据的边界对齐
- 主存空间通常按字节进行编址
- 高级语言中不同数据类型的变量所包含的字节数量可能不同
- 编译器在为这些变量分配主存空间时,理论上可以从主存空间的任何一个字节地址开始;
- 当一个多字节变量被编译器分布在不同的字存储单元中时,访问该变量就需要多个存取周期;
- 为了提高数据访问效率,用应该要考虑数据变量、数据结构在主存空间中的边界对齐问题。


- 边界对齐的规则
- 字节数据不存在边界对齐问题(因为主存空间就是按字节编址的)
- 半字(2字节)数据的起始字节地址的最低1位为0(即地址是2的整数倍)
- 单字(4字节)数据的起始字节地址的最低2位为00(即地址是4的整数倍)
- 双字(8字节)数据的起始字节地址的最低3位为000(即地址是8的整数倍)

例题:
1、

2、

3、

4、

2、静态随机存取存储器SRAM
1)存储元
-
静态随机存取存储器SRAM(Static Random-Access Memory)是随机存取存储器RAM的一种。
- 所谓“ 静态 ”,是指这种RAM只要保持通电,其内部所存储的数据就可以保持不变,而不需要进行周期性地刷新。相比之下,动态随机存取存储器DRAM(Dynamic Random-Access Memory)则需要。
- 目前,SRAM内部的存储元(存储1个二进制位的单元)一般采用多个金属-氧化物半导体场效应晶体管MOSFET(Metal-Oxide-Semiconductor Field-Effect Transistor)来构建,MOSFET常简称为MOS管。
一旦断电,SRAM和DRAM内部存储的数据还是会消失的,也就是说SRAM和DRAM属于易失性存储器,这与属于非易失性存储器的只读存储器ROM(Read-Only Memory)是不同的。
①存储元内部情况
- MOS管有工作管、负载管和门控管组成
- X和Y分别代表行选通和列选通,用来传输有效信号和无效信号

②存储元的状态
- 上电后初始状态(行选通X和列选通Y都为**无效信号 0 **)
- 实际上,a点和b点上升到高电平的时间不可能完全相同!本例中假设a点首先上升到高电平

-
此时,a 点高电平(1)和 b 点低电平(0),形成一个稳定状态,可用这个状态表示数据1
-
若最初 b 点先上升到高电平,则会形成另一个稳定状态,即 a 点低电平(0)和 b 点高电平(1),该状态表示数据0
-
综上所述,上电后初始状态随机(即存储元的存储内容随机)
-
读操作(行选通x和列选通Y都为**有效信号 1 **)
-
读操作不会破坏原有数据
-
将两个位线的输出信号经过差分放大器后,就可以根据电流方向的不同输出不同的数据信息了

- 写操作(行选通x和列选通Y都为**有效信号 1 **)
- b点高电平导通,a点形成低电平,表示写入比特 1
- 写操作结束后进入信息保存状态

- 信息的保持(行选通x和列选通Y都为**有效信号 0 **)
- 此时T5-T8都截止,虚线内部与位线I/O和I/O#断开
- 电源Vcc通过T3、T4持续为T1或T2提供电流以保存信息,只要不断电,存储元的状态就一直保持不变

③存储元的特点
- 上电后的初始状态随机(即存储元的存储内容随机);
- 读操作不会破坏原有数据;
- 只要不断电,信息一直保存,不需要刷新;
- 电源 V**CC 通过负载管 T3、T4 不断为工作管 T1 或 T2 提供电流,以保存信息,因此功耗大;
- 使用晶体管的数量多,占用晶圆面积,成本高,价格昂贵,因而不适合用于更高存储密度且低成本的应用,例如 PC 的内存;
- 速度快,常用于微处理器的 cache。
2)存储元扩展和存储阵列扩展
①存储元扩展
- 下方的列选通Y中T7和T8作为共享MOS管,右侧为存储元的符号表示

- 下图为存储元扩展的符号表示,当前X和Y都为无效信号 0
- 行选通线:X0 ~ Xn-1,共n条
- 列选通线:Y0 ∼ Yn−1,共n条
- 选通线合计:2n 条
- 存储元:n * n = n2个

同一时刻,只能有一条行选通线和一条列选通线输出有效信号,因此只能有一个存储元被选中,也就是一次只能访问一位数据。
- 访问数据(一次访问一个)

②存储阵列扩展
- 存储字长为4位,包含n2个存储字,下方为4个存储阵列组成存储体

3)存储器结构及其芯片示例
- 存储阵列的符号表示

①存储器结构

- 每个 64 x 64存储阵列(即64行64列)包含64 x 64=4096个存储元(每个存储元存储1位二进制数)
- 行选通线:X0 ~ X63,共64条
- 列选通线:Y0 ~ Y63,共64条
- 存储字长:4位(一次可存取的位数)
- 存储容量:4096位/片 x 4片=4096b x 4 ÷8 = 2kB
- 行、列译码器和行、列驱动器
- 行译码器的每个译码输出信号线都要同时驱动这一行上所有存储元的T5、T6两个门控管。
- 4片存储阵列并发,每个行译码输出信号线要驱动2 x 64 x 4 = 512个门控管,负载大。
- 列译码器的每个译码输出信号线都要同时驱动这一列上所有存储元共享的T7、T8两个门控管。
- 4片存储阵列并发,每个列译码输出信号线要驱动2 x 4 = 8个门控管,负载大。

- SRAM存储器还包含I/O电路、控制电路

②存储器芯片示例
- 写入控制

- 读取操作

练习:

3、动态随机存取存储器DRAM
1)存储元及其扩展
①存储元
- DRAM解决SRAM的缺陷:
- 设法尽量减少MOS管,通过引入存储电容暂存电荷 的方式来保存数据;
- 目前在内存中较为常见的结构是单MOS和电容构成的DRAM存储元。
- 图例给出的是DRAM中,给电容通电情况,当源级和栅级都处于高电平,即导通,给电容充电,充电实际上只有几纳秒的事件,非常快;电容C充满电的状态,表示二进制1

- 图例给出的是DRAM中,电容放电情况,源级S无高电平输入,无法驱动电荷保持在电容上,栅级处于高电平,则电容通过MOS管放电,当电容C为空的状态,表示二进制0

上述电容C放电过程,可看作是对存储元的读操作,可以发现读操作会导致原本存储的1读取后变成0。为避免读操作导致的数据丢失,数据1读出后应将数据1重新写入,称为数据恢复。
- MOS管不可能完美关断,电容的电荷会逐渐泄露

电容C上的电荷会逐渐泄露,数据1只能保存较短的时间。为避免数据丢失,必须定期采用类似读操作的方式对电容C补充电荷,称为刷新,这也是动态RAM(DRAM)得名的原因。
②存储元扩展
- 简易存储元扩展

- 读操作
- 对某一单位进行读操作(图1);
- 进行预充电控制工作,每一条列线都会被充电到DRAM供电电压VCC的一半的电压,停止预充电工作;
- 此时,列线上的寄生电容会保持住该电压;
- 行线输入有效信号,改行所有MOS管导通,满电状态电容放电(1),未充电电容充电(0)(图2);
- 放电和充电会导致列线电压增加减少,分别用**+δ和-δ**表示;
- δ的变化会通过灵敏读出/恢复放大器检测,判断存储元中的二进制数据(图3)



通过上述,我们可知
- 为了读取一行中某个存储元的信息,却破坏了这一行中所有存储元的信息;
- 因此,每次读操作过后,必须立即进行写操作;
- 灵敏读出/恢复放大器会根据锁存的值,将各条列线拉高到DRAM的工作电压Vcc,或拉低到GND,以恢复各存储元中电容的原本状态(即原本存储的信息)。

③DRAM读写操作流程
- DRAM读操作流程
- 预充电操作
- 访问操作
- 信号检测
- 数据恢复
- 数据输出
- DRAM写操作流程
- 预充电操作
- 访问操作
- 信号检测
- 数据恢复
- 数据输入
写操作流程需要经历与读操作前4步一样的流程,所以写入操作也可以实现和读操作一样的行刷新功能。
2)动态刷新
①基本概念
-
刷新周期
- 从数据存入DRAM开始,到数据丢失之前为止的这段时间,称为最大刷新周期
- 采用不同材料以及不同生产工艺生产的DRAM,其最大刷新周期可能不同,常见的有2ms、4ms、8ms等
- 刷新周期是DRAM实际完成两次完整刷新之间的时间间隔
- 刷新周期 ≤ 最大刷新周期
- 从数据存入DRAM开始,到数据丢失之前为止的这段时间,称为最大刷新周期
-
刷新存储元的数量
-
DRAM按行进行刷新
- 为了缩短刷新周期,可减少存储阵列的行数,增加列数
-
刷新操作由内存控制器负责
-
-
刷新与读操作的区别
- 尽管读操作也具有刷新功能,但读操作与刷新操作又有所不同
- 刷新操作只需要给出行地址,而不需要给出列地址
②刷新方式
DRAM在刷新时,是不能响应CPU的访问的,因此CPU对DRAM进行访问与内存控制器对DRAM进行刷新操作就存在内存争用问题,可采用集中刷新、分散刷新、异步刷新等刷新方式来解决。
例如:

-
集中刷新
- 读写操作期间不受刷新操作的影响,因此这段时间的访问速度比较快
- 但是,在集中刷新的这128个时隙中,CPU长时间不能访问DRAM,这段时间称为**“死区”时间**
- 存储体包含的行数越多,“死区”时间就越长
-
分散刷新
- 相当于将存取周期加上刷新1行的时长作为新的存取周期,因此不存在“死区”时间。
- 但是,这种方式刷新过于频繁(在2ms所包含的4000个时隙中,有2000个时隙用于刷新,每个时隙刷新1行,共刷新2000行,每刷新128行就相当于把存储体完整地刷新了1遍,因此在2ms内进行了约15次完整的存储体刷新),严重影响了系统的速度。
- 不适合应用于高速存储器。
-
异步刷新(结合以上两种方式)
- 既充分利用了2ms时间,又保持系统高速特性。该方式缩短了死区时间(128个时隙缩短为1个时隙),该方式相对上述两种效率更高,更为常用
例题:
题3:2ms=2000μs,2000 - 64 * 0.5 = 1968μs
3)存储器芯片示例
①DRAM芯片

例题:


②DRAM发展
- 异步DRAM的读写操作与CPU的时钟周期无关,在进行读写操作时可能会有更多的等待周期,导致性能上的损失,特别是在CPU的时钟频率很高的情况下;
- 同步DRAM的读写操作与CPU的时钟周期同步,内存控制器可以在时钟信号的特定边缘(上升沿或下降沿)触发数据传输。

③SDRAM读操作时序图
- SDRAM(同步动态随机存取存储器)特性
- SDRAM自带时钟信号,能与系统总线频率同步;
- SDRAM支持突发(Burst)传输模式:第一个列数据就绪后,每经历一个时钟周期就可得到一个后续数据,有效减少了数据传输的时间延迟;
- 通常SDRAM包含一个模式寄存器,可用于配置突发传输的长度BL (Burst Length),例如1、2、4、8以及整行字。该长度定义了同步地向系统总线上连续发送数据的存储单元的个数。
- 传统DRAM (异步动态随机存取存储器) 特性
- 传统DRAM没有突发传输模式,每访问一个数据,都需要经历发送行地址、发送列地址、然后访问数据的完整过程;
- 传统DRAM属于异步DRAM,其读写操作与CPU的时钟周期不同步。在进行读写操作时可能会产生更多的等待周期,导致性能损失,尤其在CPU时钟频率很高的情况下更为明显。

④SDRAM的发展
- 在SDRAM之后出现的DDR SDRAM (双倍数据速率同步动态随机存取存储器),其内部采用了2路预取 (2-bit Prefetch) 机制
- 它在时钟周期的上升沿和下降沿分别进行一次数据传输,从而实现双倍于SDRAM的数据传输速率
- 后续的DDR2,DDR3,DDR4 SDRAM在此基础上进一步发展,其内部预取机制分别升级为4路、8路、16路
- 这意味着在每个时钟周期内,可以传输的数据量分别是4位、8位、16位。
- 可以理解为:每个时钟周期利用上升沿和下降沿各传输一次,但每次传输的数据量分别为2个、4个、8个数据
- 这意味着在每个时钟周期内,可以传输的数据量分别是4位、8位、16位。
- 为了实现这种高速的数据传输,需要大幅提高数据总线 (Data Bus) 的时钟频率。因此:
- DDR2的数据总线频率是DRAM核心工作频率的2倍。
- DDR3的数据总线频率是DRAM核心工作频率的4倍。
- DDR4的数据总线频率是DRAM核心工作频率的8倍。

4、只读存储器ROM
①ROM分类
只能从其读出信息,而不能向其随意写入信息的存储器,称为只读存储器(Read-only Memory,ROM)。通过特定方式将信息写入ROM后,信息就固定在ROM中,即使电源断电,所保存的信息也不会丢失,也就是说,ROM属于==非易失性存储器==。
ROM的分类(按制造工艺) | 描述 |
---|---|
掩膜式只读存储器MROM(Mask ROM) | 1、待存储信息由芯片制造厂家在生产过程中按用户要求做好,芯片制成后存储信息被固定在芯片中,因而只能读出,不能修改。 2、灵活性差,但所存储的信息固定不变,可靠性高。 |
可编程只读存储器PROM(Programmable ROM) | 1、存储器出厂时,每个存储元存储的数据为“0”,用户可利用编程器进行一次改写。 2、PROM克服了MROM使用不便的问题,但仅能改写一次,灵活性还是不够。 |
可擦除可编程只读存储器EPROM(Erasable Programmable ROM) | 1、可多次写入,重新写入时需要先擦除后写入。 2、需要使用紫外线照射来擦除全部存储元的状态。 3、EPROM比PROM和MROM使用方便、灵活、经济。 |
电可擦除可编程只读存储器EEPROM(Electrically Erasable Programmable ROM) | 1、可多次写入,写入方式与EPROM相同,但擦除时不需要先擦除后写入。 2、因为擦除时不用紫外线照射,采用电可擦除方式(根据命令,内部自动完成),可以精准地擦除某一个存储元,而非全片擦除。 |
闪存 (Flash Memory) | 1、逻辑结构与EEPROM相似,但存储元的结构和工艺不同。 2、EEPROM支持字节级擦写,适合频繁更新小数据量,而闪存以块为单位擦写(先擦后写,因此读写慢),更适合存储大量数据。 |
②半导体存储器


例题:


5、主存的扩展及其与CPU的连接
概览

1)位扩展
当存储芯片的数据总线位宽小于CPU数据总线位宽时,采用位扩展的方式进行扩展。
- 将所有存储芯片的地址引脚、写使能引脚WE分别并联后再分别与CPU的地址引脚和读写控制引脚RM连接;
- 将各存储芯片的数据引脚依次与CPU的数据引脚进行相应连接;
- 将所有存储芯片的片选引脚CS并联后与CPU的存储器请求控制引脚MREQ相连。

- 主存与CPU的初始状态

- 读操作

- 写操作

位扩展又称为数据总线扩展或字长扩展
2)字扩展
当存储芯片的存储容量不能满足存储器对存储容量的需求时,采用字扩展的方式进行扩展。
- 将所有存储芯片的数据引脚、地址引脚、写使能引脚WE各自并联后再分别与CPU的数据引脚地址引脚、读写控制引脚R/W连接;
- 各存储芯片的片选引脚CS可以由CPU多余的地址引脚通过译码器产生;
- 实际的译码器芯片具有更多的使能引脚,以便更灵活地应用。


- 初始状态

- 读操作

- 写操作

- 地址空间的分配

综上所述,字扩展又称为容量扩展或地址总线扩展。
3)字位同时扩展
当存储芯片的数据位宽和存储容量均不能满足存储器的数据位宽和存储总容量要求时,采用字位同时扩展。
- 首先通过位扩展满足数据位宽的要求。
- 再通过字扩展满足存储总容量的要求。


4)练习
知识前提


练习:
1、

2、

3、

4、


5、


6、主存系统的优化
- 随着计算机技术的发展,主存的存取速度已经成为提升计算机系统性能的瓶颈;
- 因此,如何提高主存的存取速度,以缓解主存与CPU速度不匹配的问题,是值得研究的。
- 提高主存的存取速度的方法有:
- 使用高速元件来提高主存的访问速度。
- 通过存储器的并行工作来提高主存的访问速度。
- 双端口存储器
- 单体多字存储器
- 多体交叉存储器
1)双端口存储器
假设有两块CPU,两块CPU同时访问的存储单元地址不相同时,可以并行读写

如果访问的存储单元地址相同,则产生读写冲突

如何解决?添加两个BUSY信号

2)单体多字存储器

- 单体多字存储器的构建与存储器位扩展方式完全相同
- 多个存储模块共享地址总线;
- 按同一地址并行访问不同存储模块的同一单元。
- 实现了同一个存取周期内访问多个存储字
- 若n个存储模块并发工作,则主存带宽提升n倍。
常见的 多通道内存技术(双通道、 三通道、四通道等)采用的就是单体多字技术。
- 双通道内存技术联动模式和非联动模式的区别
- 内存控制器有两套独立的端口分别连接两个内存条;
- 两个内存条也可并发工作,但它们的地址、读写命令不需要同步;
- 该模式灵活性更高,但控制更复杂。

3)多体交叉存储器
- 多体交叉存储器也由多个存储模块构成,这些模块的容量和存取速度相同
- 根据对多个模块编址方式的不同,又分为以下两种:
- 高位多体交叉
- 低位多体交叉
①高位多体交叉(顺序编址模式)
- 程序具有局部性和连续性的特点;
- 采用高位多体交叉(顺序编址模式),程序的指令和数据基本分布在同一个主存模块(存储体)中;
- 这样就会导致在程序执行过程中,同一个主存模块被频繁访问,而其他主存模块基本处于空闲状态,无法实现多个主存模块的并行工作。

高位多体交叉方式的主要目的是扩充存储器的容量,与存储器字扩展完全相同。
②低位多体交叉
将高位多体交叉中主存地址中块内地址和模块地址进行交换即可得到低位多体交叉的顺序

- 为提高顺序访问时各存储模块的并行性,低位多体交叉(交叉编址模式)中各存储模块均有独立的地址寄存器数据寄存器和读写控制电路;
- 顺序访问时,各存储模块一般按流水线的方式轮流存取。


可从任意地址上(某个模块的某个存储单元)开始顺序存取。
例题:
1、


2、



7、高速缓冲存储器cache
1)基本概念
①cache的作用
- 主存 一般采用容量大、功耗较小、成本较低的同步动态随机存取存储器 (SDRAM),目前主流为DDR4或DDR5。
- 静态随机存取存储器 (SRAM) 的容量小、功耗大、成本高,但其访问速度远高于SDRAM。
- 为了提升CPU访问主存的性能,通常会在CPU与主存之间添加一个==SRAM==作为高速缓冲存储器 (Cache)。
- 将主存中经常访问或即将访问的数据,复制一份(调度)到Cache中,使得大部分数据访问都可以在高速的Cache中进行,从而提升系统性能。
- 采用这种方法的主要原因是CPU执行的程序具有较强的程序局部性。

②程序局部性
程序局部性是指,在一段时间内,整个程序的执行仅限于一个较小的局部范围内。具体来说,程序的局部性又表现为以下两种:
-
时间局部性
-
若程序在某个时刻访问了一个存储位置,该位置在未来可能会被多次访问。
-
例如:程序中的循环结构和调用过程就很好地体现了时间局部性。
-
-
空间局部性
-
若程序访问了某个存储位置,则其附近的存储位置也可能被访问。
-
例如:程序中的数组、结构体成员、顺序执行的代码块,通常在主存中是按顺序存放的,对它们的访问,就具有较强的空间局部性。
-


③cache系统的性能评价
在CPU和主存之间添加了cache后,CPU不再直接访问慢速的主存,而是通过字节地址访问快速的cache。
- 数据命中

- 数据未命中

- 为了便于快速查找,主存和cache都被划分成若干个固定大小的数据块(Block),每个数据块又包含若干个字
- 若进行数据访问时出现数据缺失的情况,则需要将缺失数据所在的数据块从慢速主存载入cache中;
- 因此,缺失数据相邻的数据也会随着数据块一起载入cache。

-
上述预读策略可以充分利用程序的空间局部性,提高顺序访问的命中率
-
然而,数据块的大小对cache有较大影响:
- 数据块过小:无法利用预读策略优化程序的空间局部性。
- 数据块过大:将使得替换算法无法充分利用程序的时间局部性
-
进行数据分块后,需要给主存内的数据块和cache内的数据块分配地址
- 数据块的地址由块地址和块内偏移地址(简称块内偏移0ffset)两部分构成;
- 由于cache容量比主存容量小很多,因此cache内的块地址长度小于主存内的块地址长度。


2)读、写流程
①读操作
- 数据命中情况:首先数据查找,如果数据在cache中命中则读取数据

- 数据缺失情况:首先数据查找,如果数据在cache中未命中则从主存载入缺失数据到cache中,再读取数据

如何快速查找数据和载入数据?cache已满如何处理?
这里需要用到两个技术,地址映射和替换策略

- cache读操作的基本流程
- 读命中访问时间最短
- 构建cache系统时,应尽可能提高命中率,以提升读操作性能
- 通过较好的替换策略,将经常访问的热数据保留在cache中,将不经常访问的冷数据淘汰,来充分利用时间局部性,以提高命中率;
- 数据缺失时,会将缺失数据所在数据块中的其他数据一起载入,这种预读策略可以充分利用空间局部性来提高顺序访问的命中率。


②写操作
- 数据命中情况:首先CPU向cache进行数据查找,数据命中则将数据写入到cache,采用写回策略时会产生脏数据,因为这种方式仅写入cache就返回。

写回(Write-back)策略:此时写入操作结束,这种方式响应速度最快,但会产生不一致性。
- 数据命中情况:首先CPU向cache进行数据查找,数据命中则将数据写入到cache,采用写穿策略时不会产生脏数据,因为这种方式既写入cache又写入主存才返回。

写穿(Write-through)策略:此时还需要将脏数据写入慢速的主存中才能结束,这种方式响应速度较慢,但没有脏数据产生。
- 数据缺失情况:首先数据查找,当查找cache数据缺失时,CPU直接将数据写入主存,这种策略叫非写分配策略。

非写分配策略:此时将数据写入慢速主存即可返回
- 数据缺失情况:首先数据查找,当查找cache数据缺失时,主存载入缺失数据,这种策略叫写分配策略(Write-Allocate),此时进行与数据命中一样的写入流程。

- cache写操作的基本流程:
- 采用写回策略时,将数据写入cache即可返回,写响应时间最短。
- 对于突发的小数据量写入,cache能明显提高写入性能。
- 然而,由于cache容量很小,当cache写满数据后,需要将cache中的脏数据淘汰,这就需要先将脏数据写回主存,然后从主存载入新数据块到cache后,才能向cache写入新数据。该过程的写性能比没有采用cache的主存还要慢。

3)地址映射
①地址映射基本概念
- SDRAM主存:将主存划分成若干个等长的数据块(block)
- SRAM cache:将cache划分成若干个等长的区域,称为行(line)或槽(slot)
- 有效位
- 将有效位清零,可以淘汰某cache行中的数据块,称为冲刷(flush);
- 载入一个新的数据块后,再将有效位置1
- 在系统启动或复位时,每个cache行都是空的(其中的信息无效),只有载入了主存中的数据块后信息才有效。
- 为了表明cache行中的信息是否有效,每个cache行需要一个有效位(valid bit)
- 信息的主存地址:载入主存数据块时还需要记录一些相关信息
- 主存数据块地址标记(用于地址映射)
- 脏数据标志位(用于写入策略)
- 淘汰计数(用于替换策略)
- 有效位

将某个主存数据块载入cache行时,它们之间应该采用某种映射规则;
这样,CPU要访问主存中的某个信息时,可依据映射规则到cache对应行中查找信息,而不用在整个cache中查找。
②直接映射(Direct Mapping)



- CPU要读取主存中的某个信息时,会使用该信息的主存地址中的区内数据块号(即cache行号) 直接索引到对应的cache行。
- 命中情况:如果该cache行中保存的主存分区号与信息的主存地址中的主存分区号相同,并且该行的有效位为1,则表示数据命中。此时,根据信息的主存地址中的数据块内偏移,从该cache行中存储的数据块副本里读取相应的信息。
- 缺失情况:如果该cache行中保存的主存分区号与信息的主存地址中的主存分区号不同,或者该行的有效位为0,则表示数据缺失。此时,CPU会根据该信息的主存地址,将主存中该信息所在的整个数据块载入到这个cache行中。同时,会进行以下操作:
- 将该cache行的有效位设置为1。
- 将该cache行的主存分区号设置为当前信息的主存地址中的主存分区号。
- 最后,将CPU请求的特定信息从新载入的数据块中取出并送入CPU。

③直接映射的硬件逻辑实现
初始化

访问-缺失

载入数据

其他访问情况

- 直接映射的特点
- 每个主存数据块映射到cache中的一个固定行
- cache利用率低
- cache命中率低
- cache冲突率高(cache未满时也可能发生数据块替换)
- 硬件实现成本较低(仅需要译码器和一个比较器,不像全相联映射需要昂贵的相联存储器),适合于大容量cache使用。
- 替换算法较为简单:访问不命中时直接替换相应cache行。若该cache行存在脏数据,则需要先将脏数据写回主存,以保证数据一致性。
- 每个主存数据块映射到cache中的一个固定行
④直接映射-练习
1、

2、

3、


4、

5、

问题1:

问题2:
角度1

角度2

问题3:



⑤全相联映射(Full Associative Mapping)
采用全相联映射方式的cache,在进行访存时,依据tag的内容(数据块地址)来查找cache行中的主存数据块,因而其查找主存数据块的过程是一种“ 按内容访问 ”的存取方式(可理解为并不对地址进行译码,而直接将地址当作待比较的内容),因此,它属于**相联存储器**(Content Addressable Memory,CAM)。
全相联映射的特点
- 每个主存数据块都可映射到cache中的任何一个cache行
- cache利用率高
- cache冲突率低(只要cache中还有空行就不会发生数据块替换)
- 查找时需要并发比较所有cache行中的主存数据块地址,每个cache行对应一个比较电路,硬件成本高,时间开销较大,只适合于小容量cache使用。
- cache满后,当载入新主存数据块时,需要利用替换算法进行替换,替换策略和算法较为复杂。
- 全相联映射规则:每个主存数据块都可映射到cache中的任何一个cache行。

- 全相联映射的表示方法如下:

- 如何根据信息的主存地址在cache中快速查找?

- 全相联映射的硬件逻辑实现
CPU所读主存地址未在cache中,则判定为数据缺失(图1),则需要从内存载入(图2)


以下是数据读取时,数据命中的流程

在直接映射方式中会出现替换cache行中原数据块的情况(尽管还有空的cache行)
练习:
1、

2、

⑥组相联映射(Set Associative Mapping)


- 如何表示主存位置?
- 首先基于信息的主存地址的区内块号(组索引index)索引到相应的cache组。
- 之后,将信息的主存地址的主存分区号部分与所选cache组内所有行的标记tag、1与所选cache组内所有行的有效位,进行全相联并发比较,如果匹配,则数据命中,否则数据缺失。
- 与全相联映射相比,组相联映射将全相联并发比较限制在了单个cache组内,而不是整个cache。
- 因此,组相联映射进行全相联并发比较时所需的比较器路数,是单个cache组内cache行的数量(本例为 2)而不是整个cache中cache行的数量(本例为2n),极大降低了硬件开销。


若整个cache划分为1个组,转变成了全相联映射;
若每个cache组只包含1个cache行,转变成了直接映射。
- 组相联映射的硬件逻辑实现



- cache组所包含cache行的数量(记为Gr),决定了数据块冲突的概率和全相联并发比较的复杂性。
- Gr越大,则发生数据块冲突的概率越低,但全相联并发比较电路越复杂。
- 选取适当的Gr,可使组相联映射的硬件开销比全相联映射的硬件开销低很多,而性能上仍可接近全相联方式。早期cache容量不大,通常Gr=2或4,即2路或4路组相联比较常用。随着技术的发展,cache容量不断增大口,Gr的值也随之增大,目前很多处理器的cache采用8路或16路组相联。
⑦练习
知识准备:

前提条件:cache容量相同;主存数据块大小相同。


题1、




题2、

题3、


题4、

4)交替(淘汰)算法
①直接映射方式
何时替换:cache未满时就有可能出现冲突,需要进行cache中主存数据块的替换。
常用替换算法:由于每个主存数据块只对应一个固定的cache行,因此不需要使用任何替换算法。

②全相联映射方式
何时替换:cache已满后才有可能出现冲突,需要进行cache中主存数据块的替换。
常用替换算法:随机替换。
- 优点:硬件实现最容易,速度也最快。
- 缺点:随机替换掉的数据可能马上又要用,从而降低命中率和cache的工作效率

随着cache容量的增大,随机替换算法的缺点所带来的负面影响会减小。通过仿真试验可发现,随机替换算法的性能只稍逊于LFU算法和LRU算法。
③组相联映射方式
何时替换:cache未满时就有可能出现冲突,需要进行cache中主存数据块的替换。
常用替换算法:随机替换。

④先进先出算法(FIFO)

⑤最不经常用算法(LFU)
- 替换掉计数值最小的cache行

- 如果遇到两个相同计数值,则采用FIFO或随机替换算法

- 该算法的缺点:

⑥近期最少用算法(LRU)
- cache行命中则计数器清零,其他不为空的cache行计数器加1,替换时,则替换数值最大的cache行。





- 总结如下:

⑦练习
题1、




题2、

题3、


题4、

问1

问2


问3


5)写入策略
①数据命中(写chache命中)情况
- 当写cache命中时,只将新数据写入相应cache行而不立即写入主存(脏数据);
- 只有当此cache行中的数据块被替换时才将脏数据写回主存。

- 标记位dirty,0则没有脏数据,1则有。


②数据缺失(写chache未命中)情况


6)分类和应用
在计算机系统中,存在性能差异的地方都可以使用cache技术。cache分类有硬件cache和软件cache。
-
硬件cache
-
统一cache
-
分离cache
-
多级cache
-
-
软件cache
-
buffer cache
-
web cache
- 详细见计算机网络
-

8、虚拟存储器
1)基本概念和工作原理
①背景与需求
- 主存的容量受限(一般远小于外存),且不同计算机所配置的主存容量也不完全相同。这带来了两个主要问题:
- 程序员在设计程序时,不希望受到不同计算机的不同主存容量限制。
- 现代操作系统是多任务系统,需要让多个程序(其总容量可能大于主存容量)的进程能在容量有限的主存中有效、安全地并发执行而不相互干扰。
为了解决上述问题,虚拟存储器技术应运而生,并已成为现代计算机的标准配置。

②虚拟存储器
虚拟存储器可被看作是由主存和辅存(外存)共同构成的、单一的、可供CPU直接访问的“超大容量”主存。
- 程序员编程时,面向的是这个虚拟存储器,使用的是虚拟地址 (VA, Virtual Address)。
- 实现虚拟存储器需要增加相应的软硬件支持:
- 软件:操作系统 (OS)
- 硬件:存储器管理单元 (MMU)
工作机制
- CPU执行指令时,通过MMU将指令中的虚拟地址 (VA) 转换为主存的物理地址 (PA)。
- 在地址转换过程中,MMU会进行检查:
- 若发生数据缺失(即要访问的信息不在主存中),则由操作系统负责将所需的程序或数据从辅存调入主存。
- 若发生地址越界、访问越权等存储保护错误,则由操作系统进行相应的异常处理。
工作原理(局部性原理)
虚拟存储器利用程序的局部性原理进行工作。
- 从辅存调入程序或数据到主存时,并非一次性加载全部内容,通常只需加载当前或近期需要的一小部分即可,从而极大地提高了主存的利用率。
- 这与Cache技术非常相似:目标是尽可能将辅存中经常被访问的程序和数据的副本保留在主存中。
- 当主存空间不足时,需要根据某种策略(如LRU),将主存中最不经常访问的程序和数据淘汰回辅存,以便为新的内容腾出空间。

2)页式虚拟存储器
①概述
- 与cache技术将cache作为主存的缓存相似,虚拟存储器技术是将主存作为辅存的缓存。因此,实现虚拟存储器需要考虑以下问题:
- 所交换数据块的大小问题
- 地址映射问题
- 数据块替换问题
- 写入时的数据一致性问题
- 根据对上述问题的不同解决方法,虚拟存储器可分为三种类型:
- 页式虚拟存储器 (本节中介绍)
- 段式虚拟存储器 (见操作系统)
- 段页式虚拟存储器(见操作系统)

-
页式虚拟存储器
-
页式虚拟存储器将其地址空间划分成若干个固定大小的页面(page),简称页。主存与辅存之间按页为单位交换信息。
-
虚拟地址空间中的页称为**虚拟页(Virtual Page, VP)**,简称虚页或逻辑页。
-
主存(物理)空间中的页称为**物理页(Physical Page, PP),简称实页或页框**(页帧)。
-
-
页式虚拟存储器采用“请求分页”的思想
- 将进程中活跃的页面(包含当前访问的指令或数据)从辅存调入主存,而将不活跃的页面保留在辅存中。
- 当CPU访问某个信息(指令或数据)时,若该信息所在的页面不在主存中,则会发生缺页异常。此时,需要由操作系统介入,从辅存将缺失的页面调入主存。
-
页式虚拟存储器的关键特性
- 缺页处理代价巨大:
- 页式虚拟存储器的缺页处理代价(涉及磁盘I/O和操作系统调度)远大于cache**数据缺失(未命中)**的处理代价(仅需从主存载入数据)。
- 因此,通常将页面大小设置得比较大(例如常见的4KB,也有更大容量的页面),以减少缺页异常的发生频率并提高换入换出的效率。
- 采用全相联映射:
- 由于缺页处理的代价非常大,为了最大限度地提高命中率(从而减少昂贵的缺页异常),主存与辅存之间采用全相联映射方式。这意味着辅存中的任何一页都可以被放入主存中的任何一个可用的页框(物理页)中。
- 写入策略采用写回法:
- 由于辅存(如硬盘)的访问速度远低于主存的访问速度,因此在进行写操作时,必须采用写回法。
- 写操作通常只更新主存中的页面副本,并将该页标记为“脏”。只有当该页被淘汰出主存时,才将其写回辅存。这样可以避免每次写操作都直接写入慢速的辅存,从而极大提升系统性能。
- 缺页处理代价巨大:

②地址映射和页表


- 描述主存中某个信息的位置

- 数据命中情况

- 缺页情况
- 练习





③访问流程
页式虚拟存储器访问流程-页面命中情况
- CPU给出一个虚拟地址,由MMU负责对该虚拟地址进行转换。
- MMU利用页表基址寄存器PTBR和该虚拟地址中的虚拟页号部分生成页表项地址,通过页表项地址访问主存中的相应页表项。
- 主存给MMU返回页表项。
- 若页表项中**“有效位”为1**,则表明该页表项所对应的虚拟页已从辅存调入主存。页表项中“存放位置”字段存放的是物理页号,用物理页号与虚拟地址中页内偏移部分构造出物理地址,通过物理地址访问主存中的相应数据。
- 主存给CPU返回数据。

页式虚拟存储器访问流程-页面缺失情况
- CPU给出一个虚拟地址,由MMU负责对该虚拟地址进行转换。
- MMU利用页表基址寄存器PTBR和该虚拟地址中的虚拟页号部分生成页表项地址,通过页表项地址访问主存中的相应页表项。
- 主存给MMU返回页表项。
- 若页表项中的**“有效位”为0**,则表明所访问的页不在主存中,MMU触发一次异常,调用操作系统内核中的缺页异常处理程序进行处理。
- 若主存中相应的页表已满,则需要根据替换算法确定哪个页面被替换。如果该页面的脏位为1,则把该页面调出到磁盘,否则直接丢弃。
- 缺页处理程序从磁盘调入新的页面到主存,并更新页表中相应的页表项。
- 缺页处理程序返回到原来的进程,该进程中之前引起缺页的指令会重新启动,这次执行就不会缺页了,按之前介绍的页面命中情况的步骤②-⑤执行。

结合cache的页式虚拟存储器的访问流程-最理想情况
- 页表项在cache中命中,数据也在cache中命中;
- 只需要访问2次cache,就可获得数据。

比较糟糕情况
- 不发生缺页的情况(即所访问页面在主存中)
- 页表项在cache中缺失,数据也在cache中缺失
- 需要访问2次主存,才可获得数据。

最糟糕情况
发生缺页(即所访问页面不在主存中),需要访问速度很慢的磁盘才能获取数据。
综上所述,采用虚拟存储技术会影响存储器的访问性能。
④使用快表TLB加速地址转换
- 为了加快MMU进行虚拟地址到物理地址转换的速度,现代处理器内部都包含有一个转换后备缓冲器(Translation Lookaside Buffer,TLB),专门用于缓存经常访问的页表项。
- 可将TLB看作是一个容量较小的cache(只不过仅用于缓存经常访问的页表项),由于TLB的访问速度远高于主存,因此通常将TLB表称为快表,相应地将主存中的页表称为慢表。
- 为了提高查找速度,TLB一般采用全相联或组相联方式,出现TLB缺失时常采用随机替换算法。

- 全相联方式

- 组相联方式

- 基于快表TLB的访问过程

练习:


⑤基于TLB、cache的访存流程
- 现代计算机一般都会采用虚拟存储器技术,虚拟存储器需要硬件(MMU、TLB等)和操作系统协同工作
- 在操作系统引导完成之前,CPU使用物理地址访问主存,此时为实地址模式(简称实模式);
- 在操作系统引导完成之后,进入保护模式(或称虚地址模式),此时CPU使用虚拟地址访问主存。
- 以下是具有cache并采用虚拟存储器技术的计算机中,CPU的一次完整访存流程

对TLB、页和cache命中缺失的可能性

总结如下:

- cache缺失处理由硬件完成;
- 缺页处理由操作系统通过缺页异常处理程序来完成,即由软件完成;
- TLB缺失处理,既可以用硬件也可以用软件来完成。若用软件完成,则操作系统通过专门的TLB缺失异常处理程序来完成。
练习:
题1、

题2、

题3、

⑥练习
题1、






题2、




题3、


