内存

需掌握多模块存储器和主存容量扩展的工作原理,并了解 DRAM 芯片的原理,可能在选择题中考察。对于交叉编址并行存储器,也会在大题中考察相关概念的计算。

DRAM 芯片

DRAM 芯片是一种动态随机存取存储器,通过 1T1C(1 晶体管 +1 电容器)存储单元以行列矩阵形式组织数据,依靠电容器电荷存储比特,需定期刷新以防止数据丢失。其高容量、低成本特性使其广泛用于计算机主内存。

刷新方式

DRAM 的刷新方式包括:

  • 集中刷新(Burst Refresh),暂停数据访问,在短时间内快速 刷新所有行,效率高但延迟大;
  • 分散刷新(Distributed Refresh),将刷新操作均匀分布在时间段内,与正常访问交错,延迟小但控制复杂;
  • 异步刷新(Asynchronous Refresh),由外部控制器根据需要触发刷新,灵活但依赖控制器设计。

这些刷新方式的具体对比如下表所示:

特征集中刷新分散刷新异步刷新
刷新方式所有存储单元同时刷新根据存储单元的需求刷新根据使用情况和需求刷新
性能影响可能导致性能下降,因为刷新操作同时进行最小程度影响性能,仅刷新需要刷新的存储单元最小程度影响性能,根据实际使用情况调整刷新操作
硬件要求硬件和控制器相对简单需要更复杂的硬件和控制器需要智能的内存控制器和硬件支持
能源效率可能相对较低较高,因为只刷新需要刷新的存储单元较高,因为根据需求动态调整刷新频率
寿命可能影响寿命,特别是对于不经常使用的存储单元可以延长内存寿命可以延长内存寿命
灵活性有限的灵活性更大的灵活性高度灵活,可根据使用情况自动调整刷新频率

多模块存储器

利用多个结构完全相同的存储模块的并行工作来提高存储器的吞吐率:

  • 单体多字存储器
  • 多体交叉存储器
    • 高位交叉存储器
    • 低位交叉存储器

单体多字存储器

按同一地址码并行地访问各自对应单元,每一个单元为一个字,每字 m 位。可以同时选中存储器的 n 个单元,可以将带宽提高 n 倍。

仅做简单了解,这里不详细说明,考试重点在多体交叉存储器。

多体交叉存储器

在多体交叉存储器的设计中,为了提高存储系统的并行性和带宽,常采用交叉编址的方式将主存划分为多个存储体(memory bank)。根据地址在各存储体之间的分布方式,交叉编址又分为 高位交叉编址低位交叉编址 两种。

高位交叉编址

在高位交叉编址中,地址的高位用于选择存储体,低位表示在该存储体中的偏移地址。

例如:若系统有 4 个存储体,地址空间大小为 4n,则:

  • 地址 0 ~ n−1 存储在 M0;
  • 地址 n ~ 2n−1 存储在 M1;
  • 地址 2n ~ 3n−1 存储在 M2;
  • 地址 3n ~ 4n−1 存储在 M3。

也就是说,一整个存储体连续存储一段地址空间,相邻地址数据往往在同一个存储体中。如下图所示:

M0
M1
M2
M3
体号
体内地址
地址译码
地址
高位交叉编址
0
1
n-1
n
n+1
2n-1
2n
2n+1
3n-1
4n-1
3n
3n+1

由于这种方式下,相邻数据集中在一个存储体中,因此多个存储体无法并行工作,而是串行工作

  • 所有存储体共用一个地址寄存器(AR)和数据寄存器(DR);
  • 每次只能访问一个存储体,其它存储体处于空闲状态。

这种串行访问的结构较为简单,适用于对并行性能要求不高的场景,但无法提升带宽或访问效率,无法发挥出多体结构的优势。

低位交叉编址

在低位交叉编址中,地址的低位 用于选择存储体,高位 用于标识该存储体内的偏移地址。

以 4 个存储体为例,地址 0~3 分别对应 M0、M1、M2、M3,地址 4~7 也分别映射到 M0~M3,以此类推。这样就实现了相邻地址分散存储在不同存储体中的效果:

M0
0
4
4n-4
M1
1
5
4n-3
M2
2
6
4n-2
M3
3
7
4n-1
体号
体内地址
地址译码
地址
低位交叉编址

在这种方式下,多个存储体可以 并行工作,大大提高了访问效率。但为了支持并行,每个存储体 都需配备自己的地址寄存器和数据寄存器,如下图所示:

并行性

低位交叉编址 中,相邻地址的数据分布在不同的存储体中,多个存储体可以 并行处理请求,这种并行方式类似于 指令流水线,极大提升了主存的访问带宽。

在介绍并行性概念之前,首先要介绍一下 存储周期 的概念:

存储周期 是指某个存储体完成一次数据读/写后,必须等待一定时间后才能再次被访问。例如,一个存储体的存储周期为 40ns,意味着它每 40ns 才能响应一次请求。

设主存划分为 nn 个存储体,每个体的存储周期为 TT,则通过低位交叉编址,可以实现如下 并行/流水访问机制

  • 连续访问的数据地址被轮流分配到不同的存储体中(例如地址 0 到 M0,地址 1 到 M1,…,地址 n 到 M0,再次轮转);
  • 由于每次访问都落在不同的存储体上,只要下一次访问与当前访问不落在同一个体内,就不会发生冲突
  • 这样可以实现在每个较短的时间间隔内从不同的存储体中连续读出数据。

因此,整个系统的最小连续访问间隔 = 存储周期 / 存储体数目

最小连续访问间隔=Tn\text{最小连续访问间隔} = \frac{T}{n}

其中:

  • TT 是单个存储体的存储周期(如 40ns);
  • nn 是存储体数(如 8 体交叉);
  • 于是主存系统可以每 T/nT/n 秒读取一个字

低位交叉存储器天然适合与 访问流水线 结合。例如一个读取操作可分为:

  1. P1P_1:送地址和命令(送地址至存储器的 AR 中)
  2. P2P_2:存储器读取数据(读取数据到 DR 中,该周期也称作 存储周期
  3. P3P_3:传送数据(从 DR 中读取数据并传输到内存的物理地址中)

假设 CPU 的时钟周期为 ttP1P_1P3P_3 的耗时为一个时钟周期即 ttP2P_2 的耗时为四个时钟周期即 4×t4 \times t,那么对于上图所示的 四体交叉存储器,读取 八个字长的数据 的流水线如下所示:

采用流水线方式后,即使存储体尚未完成其自身内部访问,也可以开始对其他体的下一条指令进行地址投送,实现访问阶段的重叠执行,从而提升吞吐率。

主存容量的扩展

虽然单体存储芯片的容量和字长在不断扩大,但是在实际应用的过程中,任然会出现芯片的容量或者字长满足不了应用的情况,因此就有了存储扩展的需求;

假设存储芯片的字长为 NN,存储字数为 MM,则存储芯片的容量为 M×NM \times N

storage chip

常见的存储扩展包括三种:位扩展、字扩展、字位扩展

  • 位扩展:扩展字长
  • 字扩展:扩展字数
  • 字位扩展:同时扩展字长和字数
位扩展法

bit expand

字扩展法

word expand

字位扩展法

bit word expand

补充

主存扩展方式和交叉编址方式有什么关系

总结为如下:

  • 位扩展采用低位交叉编址方案
    • 位扩展采用低位交叉编址方案并扩展了计算机的字长
    • 采用低位交叉编址方案并不一定要扩展计算机的字长
  • 字扩展采用高位交叉编址方案
  • 字位扩展采用低位和高位交叉编址方案的结合
位扩展

如上图所示,用 16K×8 bit16K \times 8\ bit 的存储芯片用来构建 16K×32 bit16K \times 32\ bit 的存储器。

需要的芯片数量为 (16K×32)/(16K×8)=4(16K \times 32) / (16K \times 8) = 4

由于是位扩展,所以四个芯片的片选信号要连接在一起,并处在常有效的状况;(片选信号是读写操作的开关)。

由于原存储器的 88 位的,扩展之后变为 3232 位,这 3232 位的位线同 CPU 的 3232 位数据线相连接,所有存储芯片并行工作,贡献 3232 位数据中的不同 88 位;

图中,4 个存储器共同构成 64KB=216B64KB = 2^{16}B 的存储空间,所以地址总线为 1616 位,即从 A0A_{0}A15A_{15}。 但是由于 16KB16KB 的存储芯片只需要 1414 根地址线,因此只需要 1414 位地址线与存储线相连,即从 A2A_{2}A15A_{15}。 这里 A0A_{0}A1A_{1} 不被使用,因为这 低两位地址线 相当于被用来扩展字长。

字扩展

如上图所示,用 16K×8 bit16K \times 8\ bit 的存储芯片用来构建 64K×8 bit64K \times 8\ bit 的存储器。

需要的芯片数量为 (64K×8)/(16K×8)=4(64K \times 8) / (16K \times 8) = 4

地址总线的位数为 1616, 但是由于 16KB16KB 的存储芯片只需要 1414 根地址线,因此只需要 1414 位地址线与存储线相连,即从 A0A_{0}A13A_{13}。 高两位地址线 A14A_{14}A15A_{15} 与片选译码器相连,由此产生片选信号。

字位扩展

如上图所示,用 16K×8 bit16K \times 8\ bit 的存储芯片用来构建 32K×16 bit32K \times 16\ bit 的存储器。

需要的芯片数量为 (32K×16)/(16K×8)=4(32K \times 16) / (16K \times 8) = 4

地址总线的位数为 1616,地址线 A1A14A_{1} \sim A_{14} 与存储器相连,A0A_{0} 不使用,被用来扩展字长。A15A_{15} 用来产生片选信号。