857 lines
36 KiB
Markdown
857 lines
36 KiB
Markdown
# 第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的Cache;DRAM用电容存储电荷,需要定期刷新(就像漏水的桶需要不断加水),但体积小功耗低,用于电脑的内存条。
|
||
|
||
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对应的存储单元,存储单元的数据读出到MDR,MDR通过数据总线把数据传给CPU。
|
||
|
||
### 4.2.2 主存中存储单元地址的分配
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "IBM 370(32位字长)"
|
||
A1["地址0"] --> B1["字节0"]
|
||
A2["地址1"] --> B2["字节1"]
|
||
A3["地址2"] --> B3["字节2"]
|
||
A4["地址3"] --> B4["字节3"]
|
||
A5["地址4(字地址)"] --> B5["下一个字"]
|
||
end
|
||
|
||
subgraph "PDP-11(16位字长)"
|
||
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)
|
||
|
||
#### 静态RAM(SRAM)
|
||
|
||
**基本单元电路**:6个MOS管组成的触发器
|
||
|
||
**特点**:
|
||
- 用触发器原理寄存信息
|
||
- 速度快,不需要刷新
|
||
- 集成度低,功耗大
|
||
- 用于Cache
|
||
|
||
SRAM就像一个稳定的开关,用两个互锁的开关存储信息,状态改变很快且稳定,不需要刷新,但每个存储单元需要6个晶体管体积大。CPU的L1、L2、L3 Cache通常使用SRAM。
|
||
|
||
#### 动态RAM(DRAM)
|
||
|
||
**基本单元电路**:1个MOS管 + 电容
|
||
|
||
**特点**:
|
||
- 用电容充放电原理寄存信息
|
||
- 需要定期**刷新**
|
||
- 集成度高,功耗小
|
||
- 用于主存
|
||
|
||
DRAM就像一个漏水的桶,用电容存储电荷表示0和1,但电容会漏电需要定期补充(刷新),每个存储单元只需要1个晶体管和1个电容体积小。电脑的8GB内存条通常使用DRAM。
|
||
|
||
> [!tip] 考试要点
|
||
> DRAM刷新方式的计算是期末考试的高频考点。三种刷新方式的计算方法见下方真题精选第5题。
|
||
|
||
**刷新方式**:
|
||
|
||
| 方式 | 特点 | 效率 |
|
||
|------|------|------|
|
||
| 集中刷新 | 一段时间集中刷新所有行 | 有死区 |
|
||
| 分散刷新 | 每行刷新分散到各周期 | 无死区,效率低 |
|
||
| 异步刷新 | 各行刷新均匀分散 | 折中方案 |
|
||
|
||
集中刷新就像每隔一段时间暂停所有工作集中给所有桶加水,有死区;分散刷新每次取水后顺便给这个桶加点水,没有死区但效率低;异步刷新把加水任务均匀分配到各个时间段,没有死区效率较高。
|
||
|
||
#### SRAM vs DRAM 对比
|
||
|
||
| 特性 | SRAM | DRAM |
|
||
|------|------|------|
|
||
| 存储原理 | 触发器 | 电容 |
|
||
| 速度 | 快 | 较慢 |
|
||
| 集成度 | 低 | 高 |
|
||
| 功耗 | 大 | 小 |
|
||
| 刷新 | 不需要 | 需要 |
|
||
| 价格 | 高 | 低 |
|
||
| 应用 | Cache | 主存 |
|
||
|
||
SRAM像高级记事本,用特殊墨水写上就不掉,写得快不用维护但贵容量小,用于记录重要信息(Cache);DRAM像普通记事本,用铅笔写容易掉,写得较慢需要经常描但便宜容量大,用于记录一般信息(主存)。
|
||
|
||
### 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["芯片1(8位)"] --> C1["组合(16位)"]
|
||
A2["芯片2(8位)"] --> C1
|
||
end
|
||
|
||
subgraph "字扩展"
|
||
B1["芯片1(1K×8)"] --> D1["组合(2K×8)"]
|
||
B2["芯片2(1K×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$
|
||
- i:Cache行号
|
||
- j:主存块号
|
||
- m:Cache行数
|
||
|
||
```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行0(0 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。
|
||
|
||
### 真题2:Cache组相联映射(作业原题)
|
||
|
||
**题目**:某计算机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通常从低地址开始
|
||
|
||
### 真题5:DRAM刷新(复习资料原题)
|
||
|
||
**题目**:某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。
|
||
|
||
### 例题2:Cache命中率计算
|
||
|
||
**题目**:某计算机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%。
|
||
|
||
### 例题3:Cache地址映射
|
||
|
||
**题目**:某计算机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=8):r=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用触发器,快、不用刷新、贵、用于Cache;DRAM用电容,慢、要刷新、便宜、用于主存。
|
||
|
||
**主存组成**: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.6(ROM)、4.4(虚拟存储器)不在考试范围内,复习时可跳过。
|
||
|
||
---
|
||
|
||
## 🔗 相关链接
|
||
|
||
- [[00_计算机组成原理学习指南]] - 返回主目录
|
||
- [[03_系统总线]] - 上一章
|
||
- [[05_输入输出系统]] - 下一章
|
||
- [[06_运算方法]] - 数据表示相关内容
|
||
|
||
---
|
||
|
||
*本章难度:⭐⭐⭐⭐⭐ 困难*
|
||
*重要程度:⭐⭐⭐⭐⭐ 重点*
|
||
*考试高频考点:存储器带宽、字位扩展、Cache映射、海明码、DRAM刷新*
|