内存
DRAM 芯片
DRAM 芯片是一种 动态随机存取存储器,通过 1T1C(1 晶体管 +1 电容器)存储单元以行列矩阵形式组织数据,依靠电容器电荷存储比特,需定期 刷新 以防止数据丢失。其 高容量、低成本 特性使其广泛用于计算机 主内存。
刷新方式
复习提示(低优先级):区分三种刷新方式如何安排刷新时刻,以及是否形成不能访问主存的“死时间”。
复习时应能区分三种刷新方式的时刻安排、死时间与正常访存的关系。
DRAM 的刷新方式包括:
- 集中刷新:暂停数据访问,在短时间内快速刷新所有行;在最大刷新间隔内集中完成所有行的刷新,效率高但延迟大,并形成一段“死时间”。
- 分散刷新:把每个存储周期分成正常读写和刷新两个阶段,每次访问后刷新一行;没有集中死时间,但存储周期变长。
- 异步刷新:把刷新操作均匀分布在最大刷新时间段内,与正常访问交错;每隔固定时间刷新一行,兼顾集中刷新与分散刷新的特点。
这里“效率高”是指刷新阶段集中完成,并不表示处理器请求的总体访问延迟更好;集中刷新虽然控制简单,却会产生最长的连续不可访问时间。
这些刷新方式的具体对比如下表所示:
| 特征 | 集中刷新 | 分散刷新 | 异步刷新 |
|---|---|---|---|
| 刷新安排 | 在一段时间内逐行集中刷新 | 每个存储周期刷新一行 | 在最大刷新间隔内按固定间隔刷新一行 |
| 正常访问影响 | 存在集中的死时间 | 每个存储周期都被拉长 | 仅在分散的刷新时刻暂停访问 |
| 特点 | 控制简单,死时间集中 | 无集中死时间,速度受持续影响 | 死时间短且分散,较常用 |
易错辨析:原导出表曾把分散刷新写成“根据存储单元的需求刷新”,把异步刷新写成“根据使用情况和需求刷新”,还声称它们会“最小程度影响性能,仅刷新需要刷新的存储单元”或“根据实际使用情况调整刷新操作”。这些说法容易与按需刷新、动态刷新频率混淆,不是 408 教材中三种刷新方式的标准定义。三者都要在最大刷新间隔内完成所有行的刷新,差别是刷新时刻的安排。原表附带的能源效率、寿命和灵活性比较也缺少成立条件,因此本页不把“可以延长内存寿命”“高度灵活,可根据使用情况自动调整刷新频率”等表述作为考查结论。
为完整保留原表的比较维度,原表还列出了“硬件要求、能源效率、寿命、灵活性”等栏目。其中“硬件和控制器相对简单”“需要更复杂的硬件和控制器”“需要智能的内存控制器和硬件支持”等硬件差别只能在给定实现下判断;“可能相对较低”“较高,因为只刷新需要刷新的存储单元”“可以延长内存寿命”等能源与寿命描述同样缺少统一前提,不能脱离具体 DRAM 控制器作为通用结论。
在硬件实现层面,刷新命令通常由外部内存控制器发出;但不能把“由外部控制器根据需要触发刷新,灵活但依赖控制器设计”当作异步刷新的定义。三种教材模型关注的是刷新时刻如何安排,不是“只刷新需要刷新的单元”。
多模块存储器
复习提示(中优先级):把多体交叉存储的地址分布、连续访问的吞吐率与主存容量扩展区分开来。
利用多个结构完全相同的 存储模块 的并行工作来提高存储器的 吞吐率:
- 单体多字存储器
- 多体交叉存储器
- 高位交叉存储器
- 低位交叉存储器
本节需要同时理解多体交叉存储与主存容量扩展,但二者解决的问题不同:前者改善连续访问的吞吐率,后者满足容量和字长需求。
单体多字存储器
按同一地址码并行地访问各自对应单元,每一个单元为一个字,每字 m 位。可以同时选中存储器的 n 个单元,可以将带宽提高 n 倍。
仅做简单了解,这里不详细说明,考试重点在 多体交叉存储器。
多体交叉存储器
在 多体交叉存储器 的设计中,为了提高存储系统的并行性和带宽,常采用 交叉编址 的方式将主存划分为多个 存储体(memory bank)。根据地址在各存储体之间的分布方式,交叉编址又分为 高位交叉编址 和 低位交叉编址 两种。
高位交叉编址
在 高位交叉编址 中,地址的高位 用于选择 存储体,低位 表示在该存储体中的偏移地址。
例如:若系统有 4 个存储体,地址空间大小为 4n,则:
- 地址 0 ~ n−1 存储在 M0;
- 地址 n ~ 2n−1 存储在 M1;
- 地址 2n ~ 3n−1 存储在 M2;
- 地址 3n ~ 4n−1 存储在 M3。
也就是说,一整个存储体连续存储一段地址空间,相邻地址数据往往在同一个存储体中。如下图所示:
在教材常见的共享 AR、DR 模型中,由于这种方式下相邻数据集中在一个存储体中,多个存储体无法并行工作,而是串行工作;因此,连续地址访问通常不能像低位交叉那样利用多个存储体形成流水并行。该结论限定于共用寄存器和通路的实现,不能泛化为所有不同存储体之间的请求都不能重叠:
- 所有存储体共用一个 地址寄存器(AR) 和 数据寄存器(DR);
- 每次只能访问一个存储体,其它存储体处于空闲状态。
这种串行访问的结构较为简单,适用于对并行性能要求不高的场景;对连续地址流无法提升带宽或访问效率,无法发挥出多体结构的优势。不同存储体在独立、非连续请求下是否能并行,仍取决于具体控制器和总线资源。
低位交叉编址
在 低位交叉编址 中,地址的低位 用于选择 存储体,高位 用于标识该存储体内的偏移地址。
以 4 个存储体为例,地址 03 分别对应 M0、M1、M2、M3,地址 47 也分别映射到 M0~M3,以此类推。这样就实现了 相邻地址分散存储在不同存储体中 的效果:
在这种方式下,多个存储体可以并行工作,为连续地址请求形成重叠访问,大大提高访问效率和吞吐率。为了支持并行,教材的典型实现为每个存储体都配备自己的地址寄存器和数据寄存器,如下图所示;实际控制器的缓冲与总线组织可有所不同。
并行性
在 低位交叉编址 中,相邻地址的数据分布在不同的存储体中,多个存储体可以 并行处理请求,这种并行方式类似于 指令流水线,极大提升了主存的访问带宽。
在介绍并行性概念之前,首先要介绍 存储周期 的概念:
存储周期 是指某个存储体完成一次数据读/写后,必须等待一定时间后才能再次被访问。例如,一个存储体的存储周期为 40 ns,意味着它每 40 ns 才能响应一次请求。
设主存划分为 个存储体,每个体的存储周期为 ,则通过低位交叉编址,可以实现如下 并行/流水访问机制:
- 连续访问的数据地址被轮流分配到不同的存储体中(例如地址 0 到 M0,地址 1 到 M1,…,地址 到 M0,再次轮转);
- 在理想的流水模型中,只要下一次访问与当前访问不落在同一个体内,就不会发生存储体冲突;整体访问能否完全重叠还取决于共享地址/数据通路与控制时序;
- 这样可以实现在每个较短的时间间隔内从不同的存储体中连续读出数据。
理想情况下,为保证轮转回同一存储体前该体已完成一次访问,整个系统的最小连续访问间隔 = 存储周期 / 存储体数目,即启动连续访问的最小间隔为:
也就是说,整个系统的 最小连续访问间隔等于存储周期除以存储体数目。该公式成立的前提是连续地址均匀轮转到各存储体,并且地址、数据通路能够支持这种流水启动方式。
其中:
- 是单个存储体的存储周期(如 40 ns);
- 是存储体数(如 8 体交叉);
- 于是理想情况下,主存系统 可以每隔 秒启动一次连续读请求。
低位交叉存储器天然适合与 访问流水线 结合。例如一个读取操作可分为:
P1():送地址和命令(送地址至存储器的 AR 中);P2():存储器读取数据(读取数据到 DR 中,该阶段占用存储体,也称作 存储周期阶段);P3():传送数据(从 DR 通过数据总线送往 CPU 或其他请求方)。
假设 CPU 的时钟周期为 t(),P1 和 P3 的耗时为一个时钟周期即 t,P2 的耗时为四个时钟周期即 4t。那么对于上图所示的四体低位交叉存储器,读取八个字长的数据时,各阶段可以按流水方式重叠;这里表示八次相邻字读请求,并非把八个字拼成一次更长的机器字,如下所示:
四体低位交叉存储器如何重叠读取八个字
按时钟拍查看地址 0—7 在 M0—M3 间轮转,以及 P1、P2、P3 三阶段怎样重叠。
第 1 拍P1:向 M0 投送字0地址;P2、P3:空。M1—M3 未变化。
采用流水线方式后,即使存储体尚未完成其自身内部访问,也可以开始对其他体的下一次访存请求进行地址投送,实现访问阶段的重叠执行,从而提升吞吐率。这里是向下一次访存请求投送地址,而不是开始执行“下一条指令”。
主存容量的扩展
虽然单体存储芯片的容量和字长在不断扩大,但是在实际应用的过程中,仍然会出现芯片的容量或者字长满足不了应用的情况,因此就有了存储扩展的需求。
假设存储芯片的字长为 位,存储字数为 ,则存储芯片的容量为 位;这是容量的位数,地址线数量还要结合字节编址或字编址判断。
常见的存储扩展包括三种:位扩展、字扩展、字位扩展:
- 位扩展:扩展字长
- 字扩展:扩展字数
- 字位扩展:同时扩展字长和字数
位扩展法
使用四个存储器(存储芯片)扩展整个存储器的位数:字数仍为 ,原来位数为 ,扩展后位数为 ,扩展后的存储容量变为 位。这里的“位数”准确地说是每个存储字的字长;四片芯片并行提供同一字的不同位。
字扩展法
使用四个存储器(存储芯片)扩展整个存储器的字数:字长仍为 位,原来字数为 ,扩展后字数为 ,总容量变为 位。
字位扩展法
使用四个存储器(存储芯片)同时扩展整个存储器的位数和字数:两片并行把原来位数 扩展为 ,再用两组片选把原来字数 扩展为 ,扩展后的存储容量变为 位。
补充:主存扩展方式和交叉编址方式有什么关系? 主存扩展与交叉编址不是同一个维度。位扩展、字扩展和字位扩展讨论如何用芯片组成所需容量与字长;高位/低位交叉编址讨论连续地址如何分布到可独立工作的存储体。位扩展中的多片芯片通常并行提供同一个字的不同位,不能直接等同为低位交叉存储体;采用低位交叉编址方案也不一定要扩展计算机的字长。
不要把它错误地套成“位扩展采用低位交叉编址方案”“字扩展采用高位交叉编址方案”或“字位扩展采用低位和高位交叉编址方案的结合”。这些说法把芯片的并行位片、片选扩展和独立存储体的地址分布混为一谈:位扩展采用并行位片,字扩展采用片选;交叉编址则另行决定连续地址的落体顺序。
位扩展示例
如上图所示,用 16K×8 bit 的存储芯片用来构建 16K×32 bit 的存储器。
需要的芯片数量为 。
由于是 位扩展,所以四个芯片的片选信号要连接在一起,并处在常有效的状况;(片选信号是读写操作的开关)。
由于原存储器的 8 位扩展之后变为 32 位;这 32 位的位线与 CPU 的 32 位数据线相连接,所有存储芯片并行工作,分别贡献 32 位数据中的不同 8 位,也就是共同提供同一存储字的各个位片。
图中 4 个存储器共同构成 的存储空间(教材中也常写作 64KB),所以地址总线为 16 位,即从 到 。每片 芯片内部只需 14 根地址线,因此把 CPU 的 接到各芯片地址端;低两位 表示 32 位字内的字节偏移,不接到芯片内部地址端。四片芯片在位扩展中并行提供同一字的不同 8 位。
用不带下标的线路名读图时,可写作:地址总线从 A0 到 A15,A2 到 A15 接到各芯片地址端,A0 到 A1 是字内字节偏移。低两位并非“不使用”,而是由字节编址占用,不能直接说成“被用来扩展字长”。
字扩展示例
如上图所示,用 16K×8 bit 的存储芯片用来构建 64K×8 bit 的存储器。
需要的芯片数量为 。
地址总线的位数为 16。每片 芯片需要 14 根内部地址线,因此将 与各芯片地址端相连;高两位 接片选译码器,由此选择 4 片芯片中的一片。
用线路名复核时,A0 到 A13 与存储器相连,高两位地址线 A14 到 A15 与片选译码器相连,由此产生片选信号。
字位扩展示例
如上图所示,用 16K×8 bit 的存储芯片用来构建 32K×16 bit 的存储器。
需要的芯片数量为 。
总容量仍为 ,所以 CPU 给出 16 位字节地址。每组两片芯片并行组成 16 位字,低位 表示字内字节偏移; 接到各芯片的 14 根内部地址线;高位 用于选择两组芯片中的一组。
同样用线路名读图:A1 到 A14 与存储器相连,A0 是字内字节偏移,A15 用来产生片选信号。
四片 16K×8 芯片如何组成 32K×16 存储器
逐步确定芯片数、并行分组和地址线分工,再分别查看两个片组选中时的数据位来源。
计算芯片数量目标容量 32K×16,单片容量 16K×8;总位数之比为 4,所以需要四片,尚未分组。