Files
obsidian/计算机组成原理/学习笔记/04_存储器_补充版.md

857 lines
36 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第4章 存储器
> 📖 本章介绍存储器的分类、工作原理和层次结构,是课程的重点和难点。
> 🎯 重点理解存储层次、主存组成、Cache和虚拟存储器
> ⚠️ 考试范围提示存储器结构时序、RAM刷新、扩展不要求画图、4.2.6、4.4 不考重点考查存储器带宽计算、字位扩展、Cache直接映射/组相联映射、海明码、DRAM刷新。复习题参考例题4.1、4.7~4.10课后习题4.1、4.4~4.7、4.14、4.26、4.29、4.31、4.32。
---
## 📋 本章目录
- [[#4.1 概述]]
- [[#4.2 主存储器]]
- [[#4.3 高速缓冲存储器Cache]]
- [[#4.4 虚拟存储器]]
- [[#📖 真题与作业精选]]
- [[#本章小结]]
- [[#例题与解析]]
---
## 4.1 概述
### 4.1.1 存储器分类
```mermaid
graph TB
A[存储器分类] --> B[按存储介质]
A --> C[按存取方式]
A --> D[按作用]
B --> B1[半导体存储器]
B --> B2[磁表面存储器]
B --> B3[光盘存储器]
C --> C1[随机存储器RAM]
C --> C2[只读存储器ROM]
C --> C3[串行访问存储器]
D --> D1[主存储器]
D --> D2[辅助存储器]
D --> D3[缓冲存储器Cache]
```
#### 按存储介质分类
| 类型 | 特点 | 示例 |
|------|------|------|
| 半导体存储器 | 体积小、功耗低、速度快、易失性 | SRAM、DRAM |
| 磁表面存储器 | 非易失、容量大、速度慢 | 磁盘、磁带 |
| 光盘存储器 | 非易失、容量大、可移动 | CD、DVD |
半导体存储器就像办公室的便签纸写得快但关灯断电就没了比如内存条、Cache磁表面存储器像记事本写得慢但关灯还在比如机械硬盘、磁带光盘存储器像刻在石头上的字只能读不能改或改起来麻烦比如CD、DVD。
#### 按存取方式分类
| 类型 | 特点 | 应用 |
|------|------|------|
| **RAM** | 随机读写、存取时间与位置无关 | 主存 |
| **ROM** | 只读不写(或受限写入) | 固件、BIOS |
| **顺序存取** | 按物理顺序寻找(如磁带) | 磁带 |
| **直接存取** | 先直接定位区域,再顺序寻找(如磁盘) | 磁盘 |
RAM就像图书馆的书架可以直接走到任何一本书前找任何一本书的时间都一样ROM像图书馆的珍本室只能看不能改顺序存取像听磁带要听第5首歌必须快进到第5首直接存取像唱片先移动唱针到大致位置再慢慢找精确位置。
#### RAM和ROM的细分
```mermaid
graph LR
RAM[随机存储器RAM] --> SRAM[静态RAM<br/>触发器原理]
RAM --> DRAM[动态RAM<br/>电容充放电]
ROM[只读存储器ROM] --> MROM[掩模ROM]
ROM --> PROM[可编程ROM]
ROM --> EPROM[可擦除PROM]
ROM --> EEPROM[电擦除PROM]
ROM --> Flash[闪速存储器]
```
SRAM用两个互锁的开关存储信息速度快不需要刷新但体积大功耗高用于CPU的CacheDRAM用电容存储电荷需要定期刷新就像漏水的桶需要不断加水但体积小功耗低用于电脑的内存条。
ROM家族中MROM出厂时就写好了不能改像印刷好的书PROM用户可以写一次像一次性写入的光盘EPROM用紫外线擦除可以重写像用铅笔写的字可以用橡皮擦掉EEPROM用电擦除更方便Flash电擦除速度快容量大用于U盘、SSD。
### 4.1.2 存储器的层次结构
> [!important] 核心问题
> 速度、容量、价格三者不可兼得,需要通过层次结构解决矛盾。
```mermaid
graph TB
subgraph "存储器层次结构"
REG["寄存器<br/>速度最快、容量最小、价格最高"] --> CACHE["Cache<br/>高速缓冲存储器"]
CACHE --> MEM["主存储器<br/>主存"]
MEM --> DISK["磁盘<br/>辅助存储器"]
DISK --> TAPE["磁带<br/>辅助存储器"]
end
style REG fill:#ff9999
style CACHE fill:#ffcc99
style MEM fill:#ffff99
style DISK fill:#99ff99
style TAPE fill:#9999ff
```
| 层次 | 速度 | 容量 | 价格 | 位置 |
|------|------|------|------|------|
| 寄存器 | 最快 | 最小 | 最高 | CPU内部 |
| Cache | 很快 | 小 | 高 | CPU内部/外部 |
| 主存 | 较快 | 中等 | 中等 | 主板 |
| 磁盘 | 慢 | 大 | 低 | 外部设备 |
| 磁带 | 最慢 | 最大 | 最低 | 外部设备 |
这个层次结构可以理解为公司的文件管理系统寄存器是办公桌上的便签伸手就能拿到但只能放几张Cache是办公桌抽屉拉开就能拿到但容量有限主存是办公室的文件柜要站起来走到文件柜前磁盘是公司的档案室要走到档案室磁带是公司的地下室仓库走得最远但容量最大。
#### 两个存储层次
```mermaid
graph TB
subgraph "缓存-主存层次"
CPU1[CPU] <--> |"速度接近Cache"| CACHE[Cache]
CACHE <--> |"容量接近主存"| MEM1[主存]
end
subgraph "主存-辅存层次"
MEM2[主存] <--> |"速度接近主存"| DISK[辅存]
CPU2[CPU] -.-> |"不直接访问"| DISK
end
style CPU1 fill:#ff9999
style CPU2 fill:#ff9999
style CACHE fill:#ffcc99
style MEM1 fill:#ffff99
style MEM2 fill:#ffff99
style DISK fill:#99ff99
```
**缓存-主存层次**解决CPU和主存速度不匹配问题数据调动由硬件自动完成对程序员透明。就像在办公桌上放一个常用文件架找文件时先看文件架上有没有有就直接拿没有就去文件柜拿同时放到文件架上。
**主存-辅存层次**解决存储系统容量问题,数据调动由硬件+操作系统完成,对程序员透明。就像把不常用的文件放到档案室,需要时再取,办公室空间小档案室空间大。
---
## 4.2 主存储器
### 4.2.1 主存的基本组成
```mermaid
graph TB
subgraph "主存结构"
MAR[MAR<br/>地址寄存器] --> |"地址"| DEC[译码器]
DEC --> |"选择信号"| MEM[存储体]
MEM <--> |"数据"| MDR[MDR<br/>数据寄存器]
MDR <--> |"数据"| DBUS[数据总线]
MAR <--> |"地址"| ABUS[地址总线]
CTRL[控制电路] --> |"读写控制"| MEM
end
style MAR fill:#ff9999
style MDR fill:#99ccff
style MEM fill:#99ff99
style DEC fill:#ffcc99
```
**工作过程**
1. **读操作**CPU将地址送MAR → 地址总线 → 译码器选中单元 → 读出数据到MDR → 数据总线
2. **写操作**CPU将地址送MAR数据送MDR → 发写命令 → 数据写入选中单元
主存就像一个巨大的图书馆MAR地址寄存器记住你要找哪本书的书号译码器根据书号找到对应的书架存储体是存放所有书籍的书架MDR数据寄存器暂时存放找到的书控制电路控制是借书还是还书
当你从内存地址1000读取数据时CPU把地址1000放到MAR中MAR通过地址总线把1000传给译码器译码器找到地址1000对应的存储单元存储单元的数据读出到MDRMDR通过数据总线把数据传给CPU。
### 4.2.2 主存中存储单元地址的分配
```mermaid
graph TB
subgraph "IBM 37032位字长"
A1["地址0"] --> B1["字节0"]
A2["地址1"] --> B2["字节1"]
A3["地址2"] --> B3["字节2"]
A4["地址3"] --> B4["字节3"]
A5["地址4字地址"] --> B5["下一个字"]
end
subgraph "PDP-1116位字长"
C1["地址0字地址"] --> D1["字节0"]
C2["地址1"] --> D2["字节1"]
C3["地址2字地址"] --> D3["下一个字"]
end
```
> [!note] 地址表示
> - IBM 370字地址 = 高位字节地址4的倍数
> - PDP-11字地址 = 低位字节地址2的倍数
这就像仓库有两种编号方式IBM 370中每个小格子都有独立编号每4个小格子组成一个大格子大格子的编号是第一个小格子的编号PDP-11中每2个小格子组成一个大格子。
### 4.2.3 主存的技术指标
#### 1. 存储容量
$$存储容量 = 存储单元个数 \times 存储字长$$
其中**存储单元个数**是存储器中可寻址的位置总数(由地址线位数决定),**存储字长**是每个单元的位数(由数据线位数决定)。
**字节表示**
$$存储容量 = 存储单元个数 \times 存储字长 / 8$$
除以8是因为1字节=8位将位数转换为字节数。
> [!example] 示例
> 24位地址线按字节寻址
> - 寻址范围:$2^{24} = 16M$ 个字节
> - 若字长32位按字寻址范围 = $16M / 4 = 4M$ 个字
存储容量就像仓库的大小存储单元个数是仓库有多少个格子存储字长是每个格子能放多少东西。假设一个仓库有1024个格子每个格子能放8个鸡蛋总容量就是1024×8=8192个鸡蛋=1KB。
#### 2. 存储速度
| 指标 | 定义 | 关系 |
|------|------|------|
| **存取时间** | 启动一次操作到完成的时间 | 读出时间或写入时间 |
| **存取周期** | 连续两次操作的最小间隔 | 存取周期 > 存取时间 |
| **存储器带宽** | 单位时间存取信息量 | 带宽 = 存储字长 / 存取周期 |
存取时间就像从你要一本书到拿到书的时间;存取周期是连续两次取书的最小间隔,比存取时间长因为管理员需要休息;存储器带宽是单位时间能取多少本书。
假设存储字长为32位4字节存取周期为100ns带宽 = 32位/100ns = 4字节/100ns = 40MBps。
> [!tip] 考试高频考点
> **存储器带宽计算**是作业和考试的常见题型。公式:带宽 = 数据总线宽度 / 存取周期。注意单位换算1B = 8位。例如数据总线宽度32位存取周期200ns则带宽 = 32位/200ns = 160M位/秒 = 20MB/s。见真题精选
### 4.2.4 半导体存储芯片
```mermaid
graph LR
subgraph "存储芯片"
ADDR[地址线] --> DEC[译码驱动]
DEC --> MEM[存储矩阵]
MEM <--> RW[读/写电路]
RW <--> DATA[数据线]
CS[片选线] --> DEC
RW_CTRL[读写控制线] --> RW
end
```
**容量计算**
$$芯片容量 = 2^{地址线位数} \times 数据线位数$$
其中**地址线位数**决定了能寻址多少个存储单元n根地址线→2ⁿ个单元**数据线位数**决定了每个单元能存多少位数据。
存储芯片就像一个小型仓库:地址线告诉仓库你要哪个格子的东西,数据线传送你拿到的东西,译码驱动根据地址找到对应的格子,存储矩阵是存放所有东西的格子,读/写电路控制是取东西还是放东西,片选线选择是哪个仓库。
一个存储芯片有10根地址线和4根数据线容量 = 2^10 x 4 = 1024 x 4 = 4096位 = 512字节。
#### 译码驱动方式
| 方式 | 特点 | 适用场景 |
|------|------|----------|
| **线选法** | 一根字线直接选中一个单元 | 容量小的芯片 |
| **重合法** | X、Y两个方向译码交叉点选中 | 大容量芯片 |
线选法就像图书馆的书架每个格子都有独立的编号你说要第15本书管理员直接走到第15个格子重合法就像电影院的座位用行号和列号定位你说要第3排第5个座位管理员先找第3排再找第5个。
16个格子用线选法需要16根选择线1024个格子用重合法只需要64根线32根X方向+32根Y方向
### 4.2.5 随机存取存储器RAM
#### 静态RAMSRAM
**基本单元电路**6个MOS管组成的触发器
**特点**
- 用触发器原理寄存信息
- 速度快,不需要刷新
- 集成度低,功耗大
- 用于Cache
SRAM就像一个稳定的开关用两个互锁的开关存储信息状态改变很快且稳定不需要刷新但每个存储单元需要6个晶体管体积大。CPU的L1、L2、L3 Cache通常使用SRAM。
#### 动态RAMDRAM
**基本单元电路**1个MOS管 + 电容
**特点**
- 用电容充放电原理寄存信息
- 需要定期**刷新**
- 集成度高,功耗小
- 用于主存
DRAM就像一个漏水的桶用电容存储电荷表示0和1但电容会漏电需要定期补充刷新每个存储单元只需要1个晶体管和1个电容体积小。电脑的8GB内存条通常使用DRAM。
> [!tip] 考试要点
> DRAM刷新方式的计算是期末考试的高频考点。三种刷新方式的计算方法见下方真题精选第5题。
**刷新方式**
| 方式 | 特点 | 效率 |
|------|------|------|
| 集中刷新 | 一段时间集中刷新所有行 | 有死区 |
| 分散刷新 | 每行刷新分散到各周期 | 无死区,效率低 |
| 异步刷新 | 各行刷新均匀分散 | 折中方案 |
集中刷新就像每隔一段时间暂停所有工作集中给所有桶加水,有死区;分散刷新每次取水后顺便给这个桶加点水,没有死区但效率低;异步刷新把加水任务均匀分配到各个时间段,没有死区效率较高。
#### SRAM vs DRAM 对比
| 特性 | SRAM | DRAM |
|------|------|------|
| 存储原理 | 触发器 | 电容 |
| 速度 | 快 | 较慢 |
| 集成度 | 低 | 高 |
| 功耗 | 大 | 小 |
| 刷新 | 不需要 | 需要 |
| 价格 | 高 | 低 |
| 应用 | Cache | 主存 |
SRAM像高级记事本用特殊墨水写上就不掉写得快不用维护但贵容量小用于记录重要信息CacheDRAM像普通记事本用铅笔写容易掉写得较慢需要经常描但便宜容量大用于记录一般信息主存
### 4.2.6 只读存储器ROM
| 类型 | 特点 | 应用 |
|------|------|------|
| **MROM** | 厂家掩模制作,不可更改 | 批量生产 |
| **PROM** | 用户可编程一次 | 小批量 |
| **EPROM** | 紫外线擦除,可重复编程 | 开发调试 |
| **EEPROM** | 电擦除,可重复编程 | 参数存储 |
| **Flash** | 电擦除,速度快 | U盘、SSD |
MROM像印刷好的书出厂时就印好了不能改成本低适合批量生产PROM像一次性写入的光盘用户可以写一次但不能改EPROM像用铅笔写的书可以用橡皮擦掉重写EEPROM用电子橡皮擦更方便Flash是高速电子橡皮擦又快又大。
> [!note] 考试说明
> 4.2.6 ROM部分不在考试范围内了解即可不需要深入掌握。
### 4.2.7 存储器与CPU的连接
#### 存储器容量扩展
> [!tip] 考试高频考点
> 字位扩展是期中/期末考试的必考题型2022-2023期末原题。虽然考试不要求画图但必须掌握芯片数计算和地址分配。具体例题见下方真题精选第4题。
**三种扩展方式**
```mermaid
graph TB
subgraph "位扩展"
A1["芯片18位"] --> C1["组合16位"]
A2["芯片28位"] --> C1
end
subgraph "字扩展"
B1["芯片11K×8"] --> D1["组合2K×8"]
B2["芯片21K×8"] --> D1
end
subgraph "字位同时扩展"
E1["芯片1"] --> F1["组合"]
E2["芯片2"] --> F1
E3["芯片3"] --> F1
E4["芯片4"] --> F1
end
```
| 扩展方式 | 连接方法 | 应用场景 |
|----------|----------|----------|
| **位扩展** | 地址线、控制线并联,数据线串联 | 增加字长 |
| **字扩展** | 地址线、数据线、控制线并联,片选线用高位地址 | 增加字数 |
| **字位扩展** | 先位扩展,再字扩展 | 大容量存储器 |
位扩展就像把两个小盒子并排增加每个格子的容量两个8位的芯片合并成16位字扩展就像增加更多的格子两个1K×8的芯片组合成2K×8字位扩展先增加每个格子的容量再增加格子数量。
### 4.2.8 存储器的校验
#### 奇偶校验
**原理**增加1位校验位使数据中1的个数为奇数奇校验或偶数偶校验
**特点**:简单,只能检测奇数位错误,不能纠错。
奇校验让数据中1的个数为奇数比如数据 `10110001` 有4个1偶数校验位设为1变成 `101100011`5个1偶校验让数据中1的个数为偶数。接收方检查1的个数是否符合约定不符合说明有错误。
#### 海明码Hamming Code
> [!tip] 考试高频考点
> 海明码的检错纠错计算是作业和考试的经典题型几乎每年都会考。必须掌握校验位计算、校验位位置安排、错误定位和纠正方法。具体例题见下方真题精选第3题。
**原理**:在数据位中插入多个校验位,通过校验位的组合定位错误位。
**校验位数r满足**$2^r \geq m + r + 1$m为数据位数
**特点**可以检测并纠正1位错误可以检测2位错误。
8位数据需要4位校验码总位数12位校验位位置1、2、4、8可以纠正1位错误。对于8位数据m=8$2^3 = 8 \geq 12$ 不满足,$2^4 = 16 \geq 13$ 满足所以需要4位校验码。
**海明码解题步骤**
1. 确定校验位数r由 $2^r \geq m + r + 1$ 求解
2. 安排位置校验位放在2的幂次方位置1、2、4、8...),数据位依次填入其余位置
3. 编码每个校验位负责校验特定位置P1校验第1、3、5、7...位P2校验第2、3、6、7...位P4校验第4、5、6、7...位)
4. 检错:计算各校验组的异或值,组合得到错误位号
5. 纠正:翻转错误位即可
---
## 4.3 高速缓冲存储器Cache
### 4.3.1 Cache的基本原理
> [!important] 为什么需要Cache
> CPU速度远快于主存Cache作为中间缓冲解决速度不匹配问题。
```mermaid
graph LR
CPU[CPU] <--> |"速度匹配"| CACHE[Cache]
CACHE <--> |"容量大"| MEM[主存]
style CPU fill:#ff9999
style CACHE fill:#ffcc99
style MEM fill:#99ff99
```
**工作原理**
1. CPU访问数据时先查Cache
2. **命中**直接从Cache读取
3. **未命中**从主存读取同时调入Cache
Cache就像办公桌上的常用文件架CPU找文件很快但文件柜主存找文件慢所以在桌上放一个常用文件架。找文件时先看文件架上有没有有就直接拿命中没有就去文件柜拿同时放到文件架上未命中
### 4.3.2 Cache命中率
**命中率**
$$H = \frac{N_c}{N_c + N_m}$$
其中 $N_c$ 为Cache命中次数在Cache中找到数据的次数$N_m$ 为Cache未命中次数需要去主存取数据的次数$H$ 的值在0~1之间越接近1越好。
**平均访问时间**
$$T_a = HT_c + (1-H)T_m$$
其中 $T_c$ 为Cache访问时间$T_m$ 为主存访问时间,$H$ 为命中率。公式含义:命中时花 $T_c$ 时间,未命中时花 $T_m$ 时间,加权平均。
**访问效率**
$$e = \frac{T_c}{T_a} = \frac{1}{H + (1-H)r}$$
其中 $r = T_m / T_c$主存与Cache访问时间之比$r$ 越大说明主存越慢Cache的价值越大。$e$ 越接近1说明Cache效果越好。
> [!example] 示例
> Cache命中率95%Cache访问时间10ns主存访问时间100ns
> $$T_a = 0.95 \times 10 + 0.05 \times 100 = 14.5ns$$
> $$e = \frac{10}{14.5} = 69\%$$
命中率就像在文件架上找到文件的概率。假设文件架上找到文件的概率是95%从文件架拿文件需要10秒去文件柜拿需要100秒平均每次拿文件需要0.95×10+0.05×100=14.5秒效率10/14.5=69%。
如果命中率提高到99%平均访问时间变为0.99×10+0.01×100=10.9ns,效率提高很多。
### 4.3.3 Cache地址映射
> [!info] 问题
> 主存块如何放入Cache需要地址映射。
> [!tip] 考试高频考点
> Cache的直接映射和组相联映射是本章最重要的计算题考点。组相联映射涉及地址划分、主存区计算等综合问题必须熟练掌握。具体例题见下方真题精选第2题。
#### 1. 直接映射Direct Mapping
**规则**每个主存块只能映射到Cache的固定行。
**映射公式**$i = j \mod m$
- iCache行号
- j主存块号
- mCache行数
```mermaid
graph LR
subgraph "直接映射"
M0[主存块0] --> C0[Cache行0]
M1[主存块1] --> C1[Cache行1]
Mm[主存块m] --> Cm[Cache行m]
Mm1[主存块m+1] --> C0
end
```
**地址结构**
| 标记Tag | Cache行号Index | 块内地址Offset |
|-------------|-------------------|-------------------|
**优点**:实现简单,查找速度快
**缺点**:灵活性差,命中率低
直接映射就像图书馆的固定书架,每本书只能放在固定的书架上。要找某本书直接去对应的书架找,找得快但位置固定,如果两本书都想放在同一个书架就会冲突。
假设Cache有4行主存有8块主存块0→Cache行00 mod 4=0主存块1→Cache行1主存块2→Cache行2主存块3→Cache行3主存块4→Cache行0冲突
#### 2. 全相联映射Fully Associative Mapping
**规则**主存块可以映射到Cache的任意行。
```mermaid
graph LR
subgraph "全相联映射"
M0[主存块0] --> |"任意行"| CACHE[Cache]
M1[主存块1] --> |"任意行"| CACHE
Mn[主存块n] --> |"任意行"| CACHE
end
```
**地址结构**
| 标记Tag | 块内地址Offset |
|-------------|-------------------|
**优点**:灵活性好,命中率高
**缺点**:查找速度慢,硬件成本高
全相联映射就像图书馆的自由书架,每本书可以放在任何书架上,灵活不会冲突,但找得慢因为要搜索所有书架。
#### 3. 组相联映射Set Associative Mapping
**规则**将Cache分组主存块映射到固定组组内任意行。
**映射公式**$q = j \mod u$
- q组号
- j主存块号
- u组数
**地址结构**
| 标记Tag | 组号Index | 块内地址Offset |
|-------------|--------------|-------------------|
**优点**:折中方案,兼顾速度和灵活性
**缺点**:实现复杂度中等
组相联映射就像图书馆的分组书架,每本书只能放在固定的组,但可以放在组内的任何书架上。先找对应的组,再在组内搜索,比直接映射灵活,比全相联映射快。
**组相联映射解题关键步骤**
1. 确定Cache组数 = Cache块数 / 每组块数
2. 地址划分高位Tag + 中间组号Index + 低位块内Offset
3. 主存区数 = 主存块数 / Cache组数
4. 每个主存区中的块按组号映射
### 4.3.4 Cache替换策略
> [!info] 问题
> 当Cache满时需要替换哪一行需要替换策略。
| 策略 | 规则 | 优点 | 缺点 |
|------|------|------|------|
| **FIFO** | 先进先出 | 实现简单 | 可能替换常用数据 |
| **LRU** | 最近最少使用 | 命中率高 | 实现复杂 |
| **LFU** | 最不经常使用 | 考虑频率 | 需要计数器 |
| **随机替换** | 随机选择 | 实现简单 | 性能不稳定 |
FIFO先进先出最早放上去的文件先被替换简单但可能把常用文件拿走LRU最近最少使用最近最少用的文件先被替换常用文件不容易被替换命中率高LFU最不经常使用使用次数最少的文件先被替换随机替换随机选择一个文件替换实现简单但性能不稳定。
### 4.3.5 Cache写策略
> [!info] 问题
> 当CPU写数据时如何保证Cache和主存数据一致性需要写策略。
| 策略 | 规则 | 优点 | 缺点 |
|------|------|------|------|
| **写直达** | 同时写Cache和主存 | 数据一致 | 速度慢 |
| **写回** | 只写Cache替换时写回主存 | 速度快 | 数据可能不一致 |
写直达每次修改文件同时修改文件架和文件柜数据一致但每次都要去文件柜速度慢写回只修改文件架等文件架满了要替换时才去文件柜修改速度快但数据可能不一致。大多数Cache系统用写回策略因为速度快。
---
## 4.4 虚拟存储器
### 4.4.1 虚拟存储器的基本概念
> [!info] 定义
> 虚拟存储器是一种通过硬件和软件结合,使程序认为自己拥有连续完整内存的技术。
> [!note] 考试说明
> 4.4 虚拟存储器不在考试范围内,以下内容仅作了解参考。
虚拟存储器就像一个魔法书架:你的书架(主存)很小,但你的书(程序)很多,通过魔法让你觉得有一个很大的书架。只把常用的书放在书架上,不常用的书放在地下室(辅存),当你要看不在书架上的书时,魔法自动把书从地下室取来。
Windows的虚拟内存系统主存是电脑的8GB内存辅存是硬盘上的页面文件让程序认为自己有32GB内存。
### 4.4.2 页式虚拟存储器
**基本概念**
- **页面**把程序和内存分成固定大小的块通常4KB
- **页表**:记录虚拟页面和物理页面的对应关系
- **缺页中断**:当访问的页面不在内存时,产生中断,从辅存调入
页式虚拟存储器就像图书馆的借书系统:页面是每本书分成固定大小的章节,页表是图书馆的借书记录,记录哪些章节在图书馆(内存)哪些在外面(辅存),缺页中断是你要看的章节不在图书馆需要去外面取。
### 4.4.3 段式虚拟存储器
**基本概念**
- **段**:把程序按逻辑分成不同的段(代码段、数据段等)
- **段表**:记录段的起始地址和长度
- **段错误**:访问越界时产生错误
段式虚拟存储器就像图书馆的分类系统:段是图书馆按类别分成不同的区域(科技区、文学区等),段表是图书馆的区域地图,记录每个区域的位置和大小,段错误是你要去科技区却走到了文学区越界了。
### 4.4.4 段页式虚拟存储器
**基本概念**
- **结合**:先分段,再分页
- **优点**:兼顾段式和页式的优点
- **缺点**:实现复杂
段页式虚拟存储器先按类别分成不同的区域,每个区域再分成固定大小的书架,既方便分类管理又方便查找。现代操作系统大多采用段页式虚拟存储器。
---
## 📖 真题与作业精选
> 以下题目来自历年期末考试、期中考试和课后作业,是本章最核心的考查题型。建议先自己做再看答案。
### 真题1存储器带宽计算作业原题
**题目**某计算机数据总线宽度为32位存储器存取周期为200ns求存储器带宽。
**答案**
$$带宽 = \frac{数据总线宽度}{存取周期} = \frac{32位}{200ns} = 160M位/秒 = 20MB/s$$
其中**数据总线宽度**是每次存取的数据位数本题32位=4字节**存取周期**是连续两次存取的最小时间间隔本题200ns。注意位和字节的换算160M位/秒 = 160÷8 MB/s = 20MB/s。
### 真题2Cache组相联映射作业原题
**题目**某计算机Cache有64块采用4路组相联映射。主存有4096块每块128字。求(1) Cache的组数(2) Cache地址位数(3) 主存地址位数;(4) 主存可分为多少个区。
**答案**
(1) Cache组数 = 64 / 4 = **16组**
(2) Cache地址位数Cache总字数 = 64 x 128 = 8192字地址位数 = log2(8192) = **13位**
(3) 主存地址位数:主存总字数 = 4096 x 128 = 524288字地址位数 = log2(524288) = **19位**
(4) 主存区数 = 主存块数 / Cache组数 = 4096 / 16 = **256区**
**解题思路**
- 4路组相联意味着每组4块
- 组数 = 总块数 / 每组块数
- 地址位数用log2计算
- 主存区数 = 主存块数 / Cache组数表示主存按Cache大小划分成多少个区每个区内的块通过组相联映射到Cache
- 地址划分Tag(8位) + Index(4位) + Offset(7位) = 19位
### 真题3海明码检错纠错作业原题
**题目**接收到的海明码为1100000偶性配置请判断传输是否出错若出错请纠正并给出欲传送的原始信息。
**答案**
接收到的码字按位置排列1 1 0 0 0 0 0
校验位位置为1、2、4分别计算
- P1 = 位置1 XOR 位置3 XOR 位置5 XOR 位置7 = 1 XOR 0 XOR 0 XOR 0 = **1**
- P2 = 位置2 XOR 位置3 XOR 位置6 XOR 位置7 = 1 XOR 0 XOR 0 XOR 0 = **1**
- P4 = 位置4 XOR 位置5 XOR 位置6 XOR 位置7 = 0 XOR 0 XOR 0 XOR 0 = **0**
错误位号 = P4P2P1 = 011 = **第3位出错**
纠正第3位1 1 **1** 0 0 0 0 → 纠正后码字为 **1110000**
提取原始信息去除校验位1、2、4保留数据位3、5、6、7**1 0 0 0**
**欲传送的信息为1000。**
**解题思路**
1. 偶性配置各校验组中1的个数应为偶数否则该组校验结果为1
2. P1覆盖位置1、3、5、7二进制最低位为1的位置
3. P2覆盖位置2、3、6、7二进制次低位为1的位置
4. P4覆盖位置4、5、6、7二进制第三位为1的位置
5. 三个校验位的结果组合P4P2P1即为出错位号0表示无错
### 真题4存储器扩展2022-2023期末原题
**题目**某CPU有16根地址线、8根数据线。现需要设计一个存储系统系统程序区4K使用2K×8位的ROM芯片用户程序区12K使用4K×8位的RAM芯片。使用74LS138译码器作为片选。请确定所需芯片数量并分析地址分配。
**答案**
**ROM部分系统程序区**
- 需要ROM芯片数 = 4K / 2K = **2片** 2K×8位ROM
- 地址范围每片ROM用2K = 2^11需要11根地址线A10~A0
- 两片ROM用A11做片选区分地址范围分别为 0000H~07FFH 和 0800H~0FFFH
**RAM部分用户程序区**
- 需要RAM芯片数 = 12K / 4K = **3片** 4K×8位RAM
- 每片RAM用4K = 2^12需要12根地址线A11~A0
- 三片RAM用高位地址通过74LS138译码器做片选
**总芯片数**ROM 2片 + RAM 3片 = **5片**
**74LS138译码器连接**
- 将A15、A14、A13接入74LS138的C、B、A输入端
- 译码器的8个输出分别对应不同的地址区间
- 选择合适的输出端连接各芯片的片选信号
**解题思路**
1. 分别计算每种芯片需要的数量:目标容量 / 单片容量
2. 位扩展不需要数据线都是8位与CPU匹配
3. 字扩展用高位地址做片选,通过译码器统一管理
4. 地址分配时注意ROM和RAM的地址范围不能重叠ROM通常从低地址开始
### 真题5DRAM刷新复习资料原题
**题目**某8K×8位DRAM芯片内部排列为256×256存取周期为0.1us。分别计算集中刷新、分散刷新和异步刷新三种方式下的相关参数。
**答案**
芯片内部为256行x256列需要刷新256行。刷新一行的时间等于一个存取周期0.1us。
**集中刷新**
- 刷新全部256行所需时间 = 256 × 0.1us = **25.6us**
- 这25.6us称为"死区"期间CPU不能访问存储器
**分散刷新**
- 每个存取周期中,前半段用于正常读写,后半段用于刷新一行
- 相当于存取周期变为 0.1 + 0.1 = **0.2us**
- 优点是无死区,缺点是存取周期变长,效率降低
**异步刷新**
- 将256行的刷新任务均匀分散到整个刷新周期通常2ms
- 相邻两行刷新的时间间隔 = 2ms / 256 = **7.8125us**
- 每隔7.8125us刷新一行每次刷新只占用0.1us(一个存取周期)
- 是集中刷新和分散刷新的折中方案
**解题思路**
1. 先确定需要刷新的行数:内部排列的行数
2. 集中刷新:刷新全部行的时间即为死区时间
3. 分散刷新:每个存取周期增加一个刷新周期
4. 异步刷新总刷新周期通常2ms/ 行数 = 刷新间隔
---
## 📝 本章小结
### 核心概念
1. **存储器层次**:寄存器 → Cache → 主存 → 辅存
2. **主存组成**MAR、译码器、存储体、MDR、控制电路
3. **Cache原理**解决CPU和主存速度不匹配
4. **虚拟存储器**:解决主存容量不足
### 关键术语
| 术语 | 英文 | 含义 |
|------|------|------|
| Cache | Cache | 高速缓冲存储器 |
| SRAM | Static RAM | 静态随机存取存储器 |
| DRAM | Dynamic RAM | 动态随机存取存储器 |
| Hit Rate | Hit Rate | 命中率 |
| Virtual Memory | Virtual Memory | 虚拟存储器 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 存储器层次结构图
> 2. 主存组成框图
> 3. Cache地址映射方式
> 4. 虚拟存储器工作原理
---
## 🧪 例题与解析
### 例题1存储容量计算
**题目**某计算机有24位地址线8位数据线按字节寻址求存储容量。
**答案**
24位地址线可以表示 2^24 = 16777216 个地址8位数据线表示每个单元存8位数据1字节存储容量 = 16777216 x 8位 = 16777216字节 = 16MB。
这就像一个仓库有16777216个格子每个格子能放8个鸡蛋总容量就是16MB。
### 例题2Cache命中率计算
**题目**某计算机Cache命中率为90%Cache访问时间为20ns主存访问时间为200ns求平均访问时间和访问效率。
**答案**
平均访问时间 $T_a = 0.9 × 20 + 0.1 × 200 = 18 + 20 = 38ns$
访问效率 $e = 20/38 = 52.6\%$
就像90%的时候你要的书在书架上从书架拿书需要20秒去档案室拿需要200秒平均每次拿书需要38秒效率52.6%。
### 例题3Cache地址映射
**题目**某计算机Cache有4行采用直接映射主存有16块求主存块5映射到Cache的哪一行
**答案**
映射公式 $i = j \mod m = 5 \mod 4 = 1$主存块5映射到Cache的第1行。
这就像4个书架书号除以书架数余数就是书架号5÷4=1余1第5本书在第1个书架上。
### 例题4存储器扩展
**题目**用1K×4位的芯片组成4K×8位的存储器需要多少芯片如何连接
**答案**
位扩展8位÷4位=2个芯片增加字长字扩展4K÷1K=4组增加字数总芯片数2×4=8个。
先位扩展每2个芯片组成1K×8位地址线、控制线并联数据线串联再字扩展4组1K×8位组成4K×8位地址线、数据线、控制线并联用高位地址选择是哪一组。
### 例题5海明码计算
**题目**对于8位数据需要多少位海明码校验位写出校验位的位置。
**答案**
校验位数r满足 $2^r \geq m + r + 1$对于8位数据m=8r=3时 $2^3=8 \geq 12$ 不满足r=4时 $2^4=16 \geq 13$ 满足所以需要4位校验码。
校验位放在2的幂次方位置1、2、4、8数据位放在其他位置3、5、6、7、9、10、11、12。
---
## ⚡ 知识点速记卡
> 考前快速过一遍30秒回忆整章核心
**存储层次**(从快到慢、从小到大):寄存器 → Cache → 主存 → 磁盘 → 磁带。速度和容量不可兼得,靠层次结构解决。
**SRAM vs DRAM**SRAM用触发器快、不用刷新、贵、用于CacheDRAM用电容慢、要刷新、便宜、用于主存。
**主存组成**MAR地址→ 译码器 → 存储体 ↔ MDR数据加上控制电路。
**容量扩展三种方式**:位扩展(增加字长,数据线串联)、字扩展(增加字数,片选线用高位地址)、字位同时扩展。总芯片数 = 位扩展数 x 字扩展数。**考试提醒**:必须会计算芯片数量和地址分配,期末曾考过用译码器做片选的综合题。
**Cache三个核心问题**:①映射(直接/全相联/组相联②替换FIFO/LRU/LFU/随机)③写策略(写直达/写回)。
**Cache命中率公式**:平均访问时间 $T_a = H·T_c + (1-H)·T_m$。命中率95%、Cache 10ns、主存100ns → T_a = 14.5ns。
**直接映射**$i = j \mod m$(主存块号 mod Cache行数简单但冲突多。**组相联**:折中方案,先定组($q = j \mod u$)再组内任意放。**考试提醒**组相联映射的地址划分是高频考点必须掌握Tag/Index/Offset的计算。
**存储器带宽**:带宽 = 数据总线宽度 / 存取周期注意位与字节的换算1B = 8bit。**考试提醒**:这是最基础的计算题,作业原题直接考过。
**海明码**校验位数r满足 $2^r \geq m+r+1$8位数据需要4位校验码可纠正1位错误。解题步骤确定校验位数 → 安排位置2的幂次方→ 编码 → 检错(各组异或)→ 纠正(翻转错误位)。**考试提醒**:海明码纠错计算是几乎每年必考的题型,务必熟练。
**DRAM刷新**集中刷新有死区、分散刷新无死区但效率低、异步刷新折中。计算核心256行排列刷新一行=一个存取周期。**考试提醒**:三种刷新方式的参数计算是期末复习重点。
**不考内容提醒**存储器结构时序、4.2.6ROM、4.4(虚拟存储器)不在考试范围内,复习时可跳过。
---
## 🔗 相关链接
- [[00_计算机组成原理学习指南]] - 返回主目录
- [[03_系统总线]] - 上一章
- [[05_输入输出系统]] - 下一章
- [[06_运算方法]] - 数据表示相关内容
---
*本章难度:⭐⭐⭐⭐⭐ 困难*
*重要程度:⭐⭐⭐⭐⭐ 重点*
*考试高频考点存储器带宽、字位扩展、Cache映射、海明码、DRAM刷新*