计算机存储器
[TOC]
计算机存储器系统深度解析笔记
2. 主存的核心概念与性能指标
2.1 主存的定义与访问特性
核心定义:主存(内存)是机器指令直接操作的存储器,需基于"存储地址"实现随机访问(Random Access),即通过地址可直接定位任意存储单元,无需顺序查找。
存储层级结构:
- 存储元件:最小存储单位,仅能存储1位二进制数(0或1),如一个晶体管或电容元件
- 存储单元:由若干存储元件组成,可存储"一串二进制信息"
- 存储字:存储单元中存放的"一串二进制信息"
- 存储字长:存储字的二进制位数,常见8位(1字节)、16位、32位、64位
主存容量公式:
$$
\text{主存容量} = \text{存储字长(bit)} \times \text{存储单元数量} = \text{存储字长} \times 2^{\text{MAR位数}}
$$
深度理解:MAR(存储器地址寄存器)的每一位决定一个地址位,n位MAR可寻址$2^n$个存储单元。例如,32位地址总线可寻址$2^{32}=4\text{GB}$的内存空间。
2.2 主存的三大硬件组成部分
2.2.1 存储体
功能:主存的"数据存储核心",由大量存储单元按规则排列构成,是二进制数据的最终载体。
结构关系:存储体 → 存储单元 → 存储元件(1位),形成"整体-局部-最小单位"的层级。
2.2.2 存储器数据寄存器(MDR)
功能:暂存两类数据
- 从存储体某单元读出的信息(准备送往CPU)
- CPU准备写入存储体某单元的信息(暂存后等待写入)
关键特性:MDR的位数必须与存储字长相等。若存储字长为8位,MDR也为8位,确保能完整容纳1个存储字。
2.2.3 存储器地址寄存器(MAR)
功能:存放"欲访问的存储单元的地址"(相当于主存的"门牌号登记表")
关键特性:MAR的位数决定主存可容纳的存储单元总数,计算公式为:
$$
\text{存储单元总数} = 2^{\text{MAR位数}}
$$
原理:n位二进制数可表示$2^n$种不同地址,对应$2^n$个存储单元。
例题:若MAR为16位,MDR为16位,求主存容量。
- 解:存储单元数=$2^{16}=65536$,存储字长=16位
- 容量=16bit×65536=1,048,576bit=128KB
2.3 存储器性能指标
2.3.1 存取时间(Access Time)
定义:启动一次存储器操作(读出/写入)到操作完成所经历的时间,反映"单次读写有多快"。
分类:
- 读出时间:从发出"读指令"到数据从存储器传输到MDR的时间
- 写入时间:从发出"写指令"到数据从MDR写入存储器的时间
关键特点:读出时间与写入时间可能不相等(通常写入时间略长)。
2.3.2 存取周期(Memory Cycle Time)
定义:连续两次访问存储器(两次读、两次写或一读一写)的最短时间间隔,反映"连续读写的最小间隔"。
与存取时间的关系:
- 存取周期 = 存取时间 + 恢复时间
- 结论:存取周期略大于存取时间(如某内存存取时间10ns,存取周期12ns,其中2ns为稳定恢复时间)
深度理解:恢复时间是存储器内部电路完成信号稳定、电荷均衡等过程所需的时间,类似于"冷却时间"。
例题:某SRAM存取时间为8ns,恢复时间为2ns,求最大数据传输率。
- 解:存取周期=8+2=10ns
- 最大传输率=1/10ns=100MHz
2.3.3 存储器带宽(Bandwidth)
定义:单位时间内存储器能传输的二进制信息总量,反映"数据传输速率",单位为bit/s、Byte/s(常用KB/s、MB/s、GB/s)。
计算公式:
$$
\text{存储器带宽} = \frac{\text{单次传输数据量(bit)}}{\text{存取周期(s)}}
$$
影响因素:
- 单次传输数据位宽:位宽越大,单位时间传输量越多(如64bit比32bit快一倍)
- 存取时间:时间越短,单位时间传输次数越多
记忆要点:带宽=位宽÷周期,两者缺一不可。高频内存(短周期)+宽总线(多位宽)=高带宽。
3. 存储器的译码结构
3.1 单译码结构(线性译码)
核心原理:仅使用一个地址译码器,将N位地址信号直接译为$2^N$条译码输出线,每条线对应一个存储单元。
适用场景:小容量存储器(N≤10时较合理,$2^{10}=1024$条线尚可接受)。
缺点:当N较大时,译码输出线数量爆炸式增长($2^{20}=1,048,576$条线),硬件实现困难。
3.2 双译码结构(二维译码)
核心原理:将存储单元排列成"二维阵列"(行×列),使用两个独立译码器:
- 地址拆分:N位地址分为两部分(通常等分为N/2位),分别送行地址译码器和列地址译码器
- 行选通:行译码器输出"行选信号",选中某一行的所有存储单元
- 列选通:列译码器输出"列选信号",选中某一列的所有存储单元
- 单元定位:行选与列选的"交集"对应唯一存储单元
优势:将$2^N$条线优化为$2^{N/2}+2^{N/2}=2\times2^{N/2}$条线。如N=20时,仅需$2^{10}+2^{10}=2048$条线,而非1,048,576条。
4. 机器字长与存储字长
4.1 核心定义与区别
| 术语 | 定义 | 关键说明 |
|---|---|---|
| 机器字长 | CPU一次能处理的二进制数据位数 | 决定CPU运算能力,常见32位、64位 |
| 存储字长 | 主存中一个存储单元能存储的二进制位数 | 决定主存单次读写的基本数据量 |
| 关系 | 无强制相等关系,存储字长通常是字节的2ⁿ倍 | 32位CPU的存储字长可设为16位、32位或64位 |
深度理解:机器字长是CPU的"能力",存储字长是主存的"结构",两者通过MDR协调。理想情况下两者匹配可减少访存次数。
4.2 例题分析
题目:已知某计算机CPU为64位机器字长,主存存储字长设计为32位。CPU执行一次64位数据运算时,需要从主存读取几次数据?若存储字长改为64位,读取次数如何变化?
解析:
- 32位存储字长:需读取$64÷32=2$次,第一次取低32位,第二次取高32位
- 64位存储字长:仅需读取$1$次,单次即可获取完整64位数据
结论:存储字长与机器字长匹配时,可减少主存访问次数,提升效率约50%。
5. 地址访问模式与编址方式
5.1 主存按字节编址
基础规则:主存默认按字节编址(每个字节对应唯一地址,1字节=8位),存储字长是字节的$2^n$倍。
多粒度访问类型:
| 访问类型 | 对应字节数 | 存储字长要求 | 地址特征(32位机) |
|---|---|---|---|
| 字节访问 | 1字节 | 无特殊要求 | 地址可为任意值 |
| 半字访问 | 2字节 | ≥2字节 | 地址最低1位为0(偶数地址) |
| 字访问 | 4字节 | ≥4字节 | 地址最低2位为00(4的倍数) |
| 双字访问 | 8字节 | ≥8字节 | 地址最低3位为000(8的倍数) |
易错点:半字地址不是简单的"除以2",而是地址必须是对齐的。
5.2 地址转换关系
转换规则:以字节地址为基础,不同访问类型需逻辑右移n位(n为访问字节数的对数)
- 字节→半字:右移1位($÷2$)
- 例:字节地址0x0004→半字地址0x0002
- 字节→字:右移2位($÷4$)
- 例:字节地址0x0008→字地址0x0002
深度理解:右移操作相当于"去掉最低位",因为多字节访问时,低位地址用于内部字节选择。
5.3 汇编指令示例(Intel x86)
MOV AL, [0x0001]:字节访问,将地址0x0001处的1字节数据送入AL寄存器(8位)MOV AX, [0x0002]:半字访问,将地址0x0002~0x0003处的2字节数据送入AX寄存器(16位)MOV EAX, [0x0004]:字访问,将地址0x0004~0x0007处的4字节数据送入EAX寄存器(32位)
关联知识点:地址对齐不当会导致"总线错误"或性能下降,现代CPU支持非对齐访问但会触发多次总线周期。
6. 数据字节序:大端与小端
6.1 核心定义
| 存放方式 | 定义 | 优势 |
|---|---|---|
| 小端(Little-Endian) | 低字节存于低地址,高字节存于高地址 | 符合地址与数据位权的逻辑,CPU运算效率高 |
| 大端(Big-Endian) | 高字节存于低地址,低字节存于高地址 | 符合人类读写习惯,便于调试观察 |
6.2 实例对比(32位数据0x12345678)
| 地址 | 小端方式 | 大端方式 |
|---|---|---|
| 0x0000 | 0x78(低字节) | 0x12(高字节) |
| 0x0001 | 0x56 | 0x34 |
| 0x0002 | 0x34 | 0x56 |
| 0x0003 | 0x12(高字节) | 0x78(低字节) |
记忆口诀:小端"低位在前",大端"高位在前"。
6.3 例题解析
题目:某计算机采用小端方式,主存地址0x0002~0x0005处的字节数据依次为0x88、0x77、0x66、0x55。若按32位字访问(地址0x0002),读取的数据是多少?
解析:
- 小端规则:低地址→低字节,高地址→高字节
- 地址0x0002(低)→0x88,0x0005(高)→0x55
- 拼接顺序:高字节→低字节 = 0x55 0x66 0x77 0x88
- 结果:0x55667788
易错点:小端方式下,从内存看是"乱序",但CPU读取后是正确数值。
7. 数据的边界对齐
7.1 核心目的
为减少CPU访问主存的次数(提升效率)。若数据未对齐,CPU需多次读取并拼接,增加延迟;对齐后可单次读取。
性能影响:未对齐访问性能下降可达50%~100%(触发多次总线周期)。
7.2 对齐规则(按字节编址)
| 数据类型 | 字节数 | 起始地址要求(最低n位) | 合法/非法地址示例 |
|---|---|---|---|
| char | 1 | 无要求 | 合法:任意地址 |
| short | 2 | 最低1位为0(2的倍数) | 合法:0x0002;非法:0x0003 |
| int | 4 | 最低2位为00(4的倍数) | 合法:0x0004;非法:0x0005 |
| double | 8 | 最低3位为000(8的倍数) | 合法:0x0008;非法:0x0009 |
编程规范:编译器默认会插入"填充字节"(padding)实现自动对齐。
7.3 结构体对齐例题
题目:32位系统下,定义结构体struct Data { char a; int b; short c; };,求总字节数(不考虑编译器优化)。
解析:
- 成员a(char):起始地址0x0000,占用1字节(0x0000)
- 成员b(int):需对齐到4的倍数,从0x0004开始,占用0x0004到0x0007(0x0001到0x0003为内存空洞,浪费3字节)
- 成员c(short):需对齐到2的倍数,从0x0008开始,占用0x0008~0x0009
- 总字节数:0x0009-0x0000+1=10字节(含3字节空洞)
优化策略:调整成员顺序为char a; short c; int b;,总字节数可优化为8字节(无空洞)。
8. SRAM存储器
8.1 SRAM的定义与结构归属
全称:静态随机存取存储器(Static Random Access Memory)
核心特征:"静态"指通电状态下,数据无需周期性刷新即可持续保持。
易失性属性:SRAM与DRAM均为易失性存储器(断电数据丢失),ROM为非易失性存储器。
| 存储器类型 | 是否需要刷新 | 易失性 | 典型应用 |
|---|---|---|---|
| SRAM | 否(静态) | 是 | CPU Cache |
| DRAM | 是(动态) | 是 | 主存 |
| ROM | 否(非易失) | 否 | BIOS |
8.2 SRAM存储元工作原理
核心组成:8个MOS管构成(T1~T8),功能分工明确:
| MOS管 | 功能分类 | 核心作用 | 等效理解 |
|---|---|---|---|
| T1、T2 | 工作管 | 构成反相器,存储二进制位 | 数据存储核心 |
| T3、T4 | 负载管 | 提供稳定偏置电压,维持状态 | 上拉电阻 |
| T5~T8 | 门控管 | 控制存储元与位线通断 | 开关阀门 |
工作原理:利用双稳态电路(T1-T2交叉耦合)保持数据,无电荷泄漏问题。
8.3 SRAM读操作流程
前提条件:行选通线X、列选通线Y均输入高电平(1),门控管T5~T8导通。
核心流程:
- 存储元内部稳定电平(如A高B低)通过导通门控管传递到位线
- 位线IO与IŌ的电平信号输入差分放大器,通过检测电流方向差异还原数据
- 关键特性:读操作不破坏原有数据,A、B点电平保持不变
8.4 SRAM写操作流程
前提条件:与读操作一致,X、Y线为高电平。
以"写0"为例(假设原存"1",状态A高B低):
- 向位线IO输入低电平,IŌ输入高电平
- 低电平通过T5传递到A点,将A点拉低
- A点低→T2截止→B点被T3上拉为高电平
- B点高→T1导通→A点通过T1接地,保持低电平
- 最终形成稳定状态"A低B高",完成写0
写操作本质:通过外部位线强制改变A、B点电平,打破原有稳态,建立新稳态。
8.5 SRAM核心特点总结
| 特点 | SRAM(静态) | DRAM(动态) |
|---|---|---|
| 数据保持 | 无需刷新,通电即稳定 | 需定期刷新(64ms/次) |
| 读写速度 | 快(1-10ns) | 慢(10-100ns) |
| 用管数量 | 8个/存储元 | 1个/存储元 |
| 芯片面积/成本 | 面积大,成本高 | 面积小,成本低 |
| 功耗 | 高(持续供电) | 低(仅刷新时耗电) |
| 典型应用 | CPU Cache(L1/L2/L3) | 主存(DDR4/DDR5) |
例题:下列设备中最可能使用SRAM的是?
A. 笔记本内存 B. CPU的L1缓存 C. U盘 D. 硬盘
答案:B。CPU缓存需GHz级速度,SRAM的无刷新特性完美匹配。笔记本内存用DRAM(A错),U盘/硬盘为非易失存储(C/D错)。
9. DRAM存储器
9.1 DRAM存储元结构
核心元件:1个增强型MOS管 + 1个存储电容C
电路连接:
- MOS管漏极→存储电容C
- 电容另一端→接地(GND)
- MOS管源极→位线(列线)
- MOS管栅极→字线(行线)
物理尺寸:电容容量约几十飞法(fF),充电速度<10ns。
9.2 DRAM数据表示原理
| 二进制数据 | 实现方式 | 关键过程 |
|---|---|---|
| 1 | 电容C充满电荷 | 字线高电平→MOS管导通→位线提供VCC→电容充电至VCC |
| 0 | 电容C完全放电 | 字线高电平→MOS管导通→电容通过位线放电→电荷释放至GND |
初始状态:上电后电容电荷状态随机,需通过写操作初始化。
9.3 DRAM破坏性读与动态刷新
9.3.1 破坏性读
现象:读取"1"时,电容通过导通的MOS管向位线放电,导致电荷流失,数据从"1"→"0"。
解决方案:数据恢复——读取后立即通过位线向电容重新充电,由灵敏读出恢复放大器自动完成。
例题:若DRAM存储元存"1",未恢复时连续读2次,第2次结果?
- 答案:0(第一次读取已破坏数据)
9.3.2 动态刷新
原因:MOS管存在漏电流,电容电荷会缓慢泄漏,"1"的电荷通常只能保持64ms。
刷新机制:定期(每64ms)对所有存储元执行"伪读操作",通过导通MOS管检测电荷,不足则补充。
刷新开销:约占系统总时间的1%~2%,现代DRAM采用隐藏刷新(在CPU不访问时进行),不影响性能。
9.4 DRAM存储阵列扩展
扩展原理:将多个存储元排列为二维阵列(行×列),实现行列寻址。
关键概念:
- 寄生电容:列线因连接多个MOS管,自身存在的非设计性电容(约为存储电容的10倍)
- 灵敏放大器:每列配备,核心功能为预充电、信号检测、数据恢复
9.5 DRAM读操作完整流程(五步)
以读取"第2行第3列存储元(数据为1)"为例:
- 预充电:将所有列线电压充至VCC/2(如1.65V),随后关闭预充电电路
- 访问:第2行行线置高电平→该行所有MOS管导通→第3列存储电容向列线放电→列线电压升至1.65V+ΔV(ΔV约0.1-0.5mV)
- 信号检测:灵敏放大器检测ΔV,电压升高判定为1
- 数据恢复:放大器将列线电压拉至VCC(3.3V),通过导通的MOS管向存储电容重新充电
- 数据输出:第3列列选通信号有效→列线数据通过I/O接口输出到CPU
9.6 DRAM写操作流程
前四步与读操作完全相同(预充电→访问→检测→恢复),目的是维持该行所有存储元的数据。
第五步:数据输入——外部数据通过I/O送至列线,放大器将列线电压拉至对应电平(1→VCC,0→GND),通过导通的MOS管写入存储电容。
9.7 DRAM地址复用技术
技术目的:减少地址引脚数量(针对大容量DRAM,降低芯片封装复杂度)
实现原理:行地址线与列地址线分时复用同一组地址引脚
- 行地址选通信号(RAS,低有效):锁存行地址
- 列地址选通信号(CAS,低有效):锁存列地址
考研真题解析(2018年408):
题目:DRAM芯片规格为2K×1位,采用地址复用技术,为减少刷新开销,行/列地址线应如何分配?
解题步骤:
- 总地址线需求:$2K=2^{11}$→需11条地址线
- 两种分配方案:
- 方案一:行6条+列5条→行选通线$2^6=64$条
- 方案二:行5条+列6条→行选通线$2^5=32$条
- 最优方案:行选通线越少→刷新次数越少→开销越小
- 答案:行5条、列6条(32行×64列结构)
记忆要点:刷新是按行进行的,行数越少刷新越快。
9.8 SRAM与DRAM综合对比
| 对比维度 | SRAM | DRAM |
|---|---|---|
| 速度 | 快(1-10ns) | 慢(10-100ns) |
| 成本 | 高(8管/元) | 低(1管1容/元) |
| 集成度 | 低 | 高(约为SRAM的4倍) |
| 功耗 | 高(持续供电) | 低(仅刷新耗电) |
| 刷新 | 不需要 | 需要(64ms/次) |
| 地址线 | 独立 | 复用(RAS/CAS) |
| 应用 | Cache(速度优先) | 主存(容量优先) |
10. 存储器扩展技术
10.1 字扩展(仅扩容,位宽不变)
适用场景:单芯片位宽匹配CPU数据总线,但容量不足。
核心步骤:
- 计算芯片数:
芯片数 = 目标容量 ÷ 单芯片容量 - 分配地址线:
- 片内地址线:由单芯片容量决定($2^n=单芯片容量$)
- 片选地址线:由芯片数决定($2^m=芯片数$)
- 译码器选择:用片选地址线经译码器生成片选信号
- 公共信号并联:地址线(片内部分)、数据线、控制线全部并联
例题:CPU数据总线8位,地址总线21位;单SRAM为256K×8位,构建2M×8位存储器。
解答:
- 芯片数 = $2M ÷ 256K = 8$片
- 地址线分配:
- 片内地址:$256K=2^{18}$→$A_0~A_{17}$(18根)
- 片选地址:$A_{18}~A_{20}$(3根,对应8片)
- 译码器:3-8译码器(输入3位,输出$\overline{Y_0}~\overline{Y_7}$)
10.2 位扩展(仅加宽位宽,容量不变)
适用场景:单芯片容量匹配,但位宽小于CPU数据总线。
核心步骤:
- 计算芯片数:
芯片数 = 目标位宽 ÷ 单芯片位宽 - 公共信号并联:地址线、控制线、片选线全部并联
- 数据线拼接:各芯片数据线按位拼接
例题:单芯片为1K×4位,构建1K×8位存储器。
解答:
- 芯片数 = $8÷4=2$片
- 连接逻辑:
- 地址线:$A_0~A_9$并联
- 控制线:$\overline{OE}$、$\overline{WE}$并联
- 片选线:$\overline{CS}$并联
- 数据线:片1输出$D_0~D_3$,片2输出$D_4~D_7$
10.3 字位同时扩展(既扩容又加宽)
适用场景:单芯片既容量不足,位宽也不匹配。
核心步骤:
- 计算总芯片数:
总芯片数 = 字扩展数 × 位扩展数 - 先位扩展:拼成"1组与目标位宽一致的模块"
- 后字扩展:用译码器对多组模块做片选
- 统一连接:保持公共信号并联
例题:单芯片为1K×4位,构建4K×8位存储器。
解答:
- 计算:
- 位扩展数 = $8÷4=2$片/组
- 字扩展数 = $4K÷1K=4$组
- 总芯片数 = $4×2=8$片
- 扩展逻辑:
- 位扩展:每2片拼成1K×8位模块(4组)
- 字扩展:用2-4译码器控制4组模块的片选
- 最终:4组×1K=4K容量,8位位宽
10.4 三种扩展方式对比
| 扩展类型 | 核心变化 | 芯片数计算 | 关键连接点 |
|---|---|---|---|
| 字扩展 | 容量↑,位宽不变 | 目标容量÷单芯片容量 | 译码器分片选 |
| 位扩展 | 位宽↑,容量不变 | 目标位宽÷单芯片位宽 | 数据线拼接 |
| 字位同时扩展 | 容量↑+位宽↑ | 字扩展数×位扩展数 | 先位扩展拼组,再字扩展分片选 |
考研高频:字扩展考查译码器选择,位扩展考查数据线连接,字位同时扩展考查综合设计能力。
考研真题实战
2012年408真题(边界对齐应用)
题目:主存按字节编址,Cache块大小4字节,主存块号3对应的Cache块,其主存地址范围是?
解析:
- 块大小4字节→块内偏移占2位($2^2=4$)
- 块号3→地址结构:块号(高位)+ 偏移(低位)
- 偏移范围00~11(0~3)
- 地址范围 = 块号×块大小 ~(块号+1)×块大小-1
- 计算:$3×4=12$(0x0C)~$3×4+3=15$(0x0F)
答案:0x0C~0x0F(对应选项D)
2018年408真题(小端+补码)
题目:小端方式存放,CPU读取地址0x100处的16位补码整数0x8000,其十进制值是?
选项:A. -32768 B. -128 C. 128 D. 32768
解析:
- 小端方式:0x100存低字节0x00,0x101存高字节0x80
- 拼接后仍为0x8000(二进制1000 0000 0000 0000)
- 补码转十进制:
- 最高位1→负数
- 数值位取反加1:0111 1111 1111 1111 + 1 = 1000 0000 0000 0000(32768)
- 结果:-32768
答案:A
易错点总结与记忆技巧
- 存取周期≠存取时间:周期=时间+恢复,总是更大
- MAR位数决定容量:$2^n$关系,不是线性
- 小端/大端是字节序:不是位序,是每个字节的排列顺序
- 对齐地址特征:2字节→偶数,4字节→4的倍数,8字节→8的倍数
- SRAM/DRAM选择:速度优先→SRAM,容量优先→DRAM
- 地址复用目的:减少引脚,刷新按行→行数越少越好


