3.2 主存储器
3.2.1 半导体随机存取存储器
随机存取存储器(RAM)分为静态RAM(SRAM)和动态RAM(DRAM),二者均为易失性存储器。现代计算机中,主存主要采用DRAM,而Cache使用SRAM。
1. SRAM的工作原理
地址相同的多个存储元构成一个存储单元。若干存储单元的集合构成存储体。
SRAM的存储元基于双稳态触发器(六晶体管MOS),利用电路的两个稳定状态分别表示二进制0和1。其静态特性体现在:读操作为非破坏性读出,因此无须再生。
SRAM的存取速度快,但集成度低,功耗较大,成本高,通常用于高速缓冲存储器。
2. DRAM的工作原理
与SRAM不同,DRAM利用栅极电容上的电荷来存储信息:有电荷表示1,无电荷表示0。其基本存储元仅由一个晶体管和一个电容构成,结构简单,因而集成度远高于SRAM。
DRAM具有位价低、功耗小、容量大等优势。但同时也存在明显局限:存取速度较慢;电荷会因漏电而逐渐丢失,必须定时刷新以维持数据;且读出过程为破坏性读出,需在读取后立即再生。因此,DRAM被广泛用于大容量主存系统,在成本、容量与性能之间取得良好平衡。
3. 存储芯片的组成
存储芯片由存储体、I/O读/写电路、地址译码器和控制电路等部分组成。前文介绍的DRAM芯片的存储阵列结构,正是此图中存储矩阵的核心构成部分。
-
存储体(存储矩阵)。是存储单元的集合,通过行选择线(X)和列选择线(Y)共同选中目标单元。位于相同行列交叉点上的多个位(位平面数)被同时读/写。 -
地址译码器。用来将输入地址转换为译码输出线上的高电平信号,以驱动相应的读/写电路。地址译码方式有单译码法(一维译码)和双译码法(二维译码)两种:-
单译码法。仅使用一个行译码器,同一行中所有存储单元的字线相连,构成一个字,可被同时读/写。其缺点是译码器输出线数量过多。
-
双译码法。地址译码器分为X(行)和Y(列)两个部分,通过行与列的交叉点唯一确定一个存储单元。这是当前DRAM芯片普遍采用的译码结构。
-
-
I/O电路。用于控制被选中存储单元的读/写,具有放大信号的作用。 -
片选控制线。单个存储芯片容量有限,通常无法满足计算机对主存容量的需求,因此需将多个芯片组合扩展。在访问某个存储字时,必须“选中”该存储字所在的芯片,而其他芯片不被“选中”,因此需要有片选控制信号(经片选控制线传输)。 -
读/写控制线。根据CPU发出的读/写命令,通过读/写控制线选中单元执行相应操作。
4. DRAM芯片的关键技术
(1) 地址引脚复用技术
一个 位DRAM芯片的逻辑结构图。该芯片共有11个地址引脚 (),在行选通信号RAS和列选通信号 (CAS) 的控制下,分时复用传送行地址和列地址。数据端口有4个引脚 (),因此每个芯片可同时读/写4位数据。 (WE) 为读/写控制信号,低电平表示写操作; (OE) 为输出使能信号,低电平有效,高电平时断开输出驱动。芯片内部存储阵列采用三维结构,总容量为 位,即 位。因此,行地址和列地址各需11位,共4个位平面;在任意行与列的交叉点上,4个位平面上的数据被同时读/写。
DRAM芯片容量较大,所需地址位数较多。为减少芯片地址引脚数量,通常采用地址引脚复用技术:行地址和列地址通过相同的引脚分两次先后输入,从而使地址引脚数量减少一半。
(2) 刷新机制与阵列设计优化
DRAM芯片需要定期刷新以维持所存信息。刷新时,仅向芯片提供行地址和 (RAS) 信号,即可选中某一行的所有存储单元并执行读操作。由于DRAM采用破坏性读出,每次读取后必须立即再生:若读出为0,则将电容充分放电;若读出为1,则重新充电。对于图中所示的 存储阵列,只需进行2048次刷新操作即可完成全芯片刷新(因刷新按整行进行,无须列地址)。芯片内部集成一个刷新计数器,可自动产生刷新所需的行地址,其位数与行地址位数相同。行地址缓冲器与刷新计数器通过一个多路选择器(MUX)共享通往行译码器的地址通路。刷新周期定义为对某一特定行完成一次刷新后,到下一次对该行再次刷新的时间间隔。
假定一个DRAM芯片的存储容量为 位,其存储阵列的行数为 ,列数为 ,则满足 。整个阵列的地址位数为 ,其中行地址占 位,列地址占 位,因此有 。由于DRAM采用地址引脚复用技术,引脚数量由行、列地址位数中的较大者决定,为最小化地址引脚数,应使 与 尽可能接近。此外,DRAM按行刷新,行数越少,刷新开销越低,故还需满足 。综合考虑,通常将阵列设计为行数略小于或等于列数的近似正方形结构。
(3) 缓存机制与突发传输
一个DRAM芯片的简化示意图,其容量为 位,存储阵列为4行 4列。
由于采用地址引脚复用技术,仅需2根地址线,分时传送2位行地址和2位列地址。每个存储单元包含8位数据,因此需要8根数据线。芯片内部设有一个行缓冲器(通常由SRAM实现),用于缓存被选中行中所有列的数据。其容量等于一行中所有存储单元的数据总量,即列数 每个存储单元的位数(如4列 8位=32位)。当某一行被选中后,该行全部数据被一次性加载到行缓冲器中,后续可在每个时钟周期连续输出一个存储单元的数据(8位),从而支持突发传输,即在寻址阶段提供首地址,随后连续读取多个相邻存储单元的数据,显著提升有效带宽。
5. 同步 DRAM
目前更广泛使用的是SDRAM(同步DRAM)。与传统的异步DRAM不同,SDRAM的数据读/写操作与系统时钟同步,能够以CPU-主存总线的较高速率运行。在连续访问同一行(页)内的数据时,可实现突发传输,显著减少甚至避免插入等待状态。在异步DRAM中,CPU发出地址和控制信号后,必须等待一段不确定的延迟时间才能获得数据或完成写入;在此期间,CPU不断轮询存储器的状态信号,无法执行其他任务,从而降低整体执行效率。而SDRAM在系统时钟驱动下工作,它将CPU发出的地址和控制信号锁存,并在预设的若干时钟周期后返回数据或完成写入,使得CPU无须等待,可在延迟期间执行其他指令,显著提升系统性能。
6. SRAM和 DRAM的比较
表3.1 SRAM和DRAM各自的特点
| 特点 | SRAM | DRAM |
|---|---|---|
| 存储信息 | 触发器 | 电容 |
| 破坏性读出 | 否 | 是 |
| 需要刷新 | 不需要 | 需要 |
| 送行列地址 | 同时送 | 分两次送(复用) |
| 运行速度 | 快 | 慢 |
| 集成度 | 低 | 高 |
| 存储成本 | 高 | 低 |
| 主要用途 | 高速缓存 | 主机内存 |
3.2.2 非易失性存储器
1. 只读存储器(ROM)的特点
RAM与ROM均支持随机访问,但ROM属于非易失性存储器,具有两个显著优点:
- 结构简单,位密度高于SRAM等可读/写存储器;
- 断电后数据不丢失,可靠性高。
根据制造工艺和可编程性,ROM可分为掩模式ROM(MROM)、一次可编程ROM(PROM)和可擦除可编程ROM(EPROM)等类型;MROM由厂商固化,用户不可更改;PROM允许用户进行一次性编程;EPROM虽支持多次编程,但每次擦除需紫外线照射整片芯片,且擦写次数有限、写入速度慢,难以满足主存对高速随机读/写的需求,因此无法替代RAM。
2. Flash存储器
计算机中许多固定信息需长期保存在非易失性存储器中,如系统启动所需的BIOS(Basic Input/Output System)。早期BIOS固化在MROM或EPROM中,无法更新;现代主板普遍采用Flash存储器存储BIOS,用户可通过厂商提供的工具直接在系统中擦除并重写。
Flash 存储器(又称闪存)是一种在 EPROM基础上发展而来的非易失性存储器,兼具ROM与RAM的部分优点:
- 断电后信息可长期保存;
- 支持电擦除与在线重写,无须紫外线照射等特殊设备;
- 其读取速度接近RAM,但写入速度显著较慢,读/写性能不对称。
3. 固态硬盘(Solid State Drive, SSD)
固态硬盘是基于 Flash存储器构建的存储设备,由控制单元和存储单元(Flash存储器芯片阵列)组成。它继承了Flash存储器的重要特性:非易失性、无机械部件、读取速度快。相比传统硬盘,SSD具有读/写速度快、功耗低、抗震性强等优势,缺点是价格较高,且写入寿命受限于Flash存储器的擦写次数。
3.2.3 多模块存储器
多模块存储器是一种空间并行技术,通过多个结构完全相同的存储模块并行工作来提高存储器的吞吐率。由于CPU的速度远高于存储器,若能在一个存取周期内连续获取多条指令或多个数据字,便可更充分利用CPU资源,提升系统性能。多体交叉存储器正是基于这一思想设计的。
根据模块间地址分配方式的不同,多模块存储器可分为连续编址和交叉编址两种结构。
1. 连续编址方式
高位地址为模块号(或体号),低位地址为模块内地址(或体内地址)。存储器共有4个模块 ,每个模块有 个单元。
在连续编址方式下,低位的体内地址总是被送到由高位体号确定的模块内进行译码。访问一个连续主存块时,总是先在一个模块内访问,直到该模块访问完后才转到下一个模块访问。由于CPU按顺序访问存储模块,各模块不能并行访问,因此无法提高存储器的吞吐率。
NOTE模块内的地址是连续的,存取方式仍是串行存取,因此这种存储器本质上仍属于顺序存储器。
2. 交叉编址(低位交叉)方式
低位地址用作模块号(体号),高位地址作为模块内地址。假设有 个模块,每个模块含 个存储单元,则模块编号由地址对 取模决定,即模块号=单元地址 。单元 位于模块 ;单元 位于模块 ;以此类推。
在交叉编址方式下,由于连续地址的数据被依次分布到不同模块中,程序或数据块在物理上是“交叉存放”的,采用此方式的多模块存储器被称为交叉存储器。通过多个结构完全相同的存储模块并行工作,这种设计能够在访问连续地址时显著提高存储器的吞吐率。
交叉存储器可以采用轮流启动或同时启动两种方式。
(1) 轮流启动方式
若每个模块一次读/写的位数正好等于数据总线位数,模块的存取周期为 ,总线周期为 ,则为实现轮流启动方式,存储器交叉模块数应满足:
按每隔 个存取周期轮流启动各模块,则每隔 个存取周期就可读/写一个数据,存取速度提高 倍。图3.10展示了4体低位交叉轮流启动的存取时间示意图。交叉存储器要求其模块数大于或等于 ,以保证启动某模块后经过 的时间后再次启动该模块时,其上次的存取操作已经完成(以保证流水线不间断)。这样,连续存取 个字所需的时间为
而顺序方式连续读取 个字所需的时间为 。可见交叉存储器的带宽大大提高。
在理想情况下, 体交叉存储器每隔 存取周期可读/写一个数据。若相邻的 次访问的访存地址出现在同一个模块内,则会发生访存冲突,此时需延迟发生冲突的访问请求。
(2) 同时启动方式
当所有存储模块一次并行读/写的总位数恰好等于存储器数据总线宽度时,可采用同时启动方式。例如,使用8个 位的DRAM芯片构成一个128MB内存条:每个DRAM芯片内部为 位的存储阵列(行地址与列地址各12位),含8个位平面。
CPU发出的主存地址被拆分为行地址和列地址,通过分时复用方式先后送入DRAM芯片的行、列地址译码器,选中行列交叉处的8位单元进行读/写操作。因此,单个芯片每次传输8位,8个芯片同步工作,可一次性提供64位数据,匹配64位总线宽度。
需要注意的是,并行访问以连续8字节为单位进行,即每次读取的数据只能来自地址对齐的块(如第 ,,, 单元)。若访问一个 int 型(4字节)数据时起始地址未对齐(如地址6,占用第 单元,横跨两个访问块),则需两次访问;若地址按4字节对齐(4的倍数),则一次即可完成。这正是内存访问要求数据对齐的根本原因。
