# 第4章 存储器

> 📖 本章介绍存储器的分类、工作原理和层次结构，是课程的重点和难点。
> 🎯 重点理解存储层次、主存组成、Cache和虚拟存储器

---

## 📋 本章目录

- [[#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$$

> [!example] 示例
> 24位地址线，按字节寻址：
> - 寻址范围：$2^{24} = 16M$ 个字节
> - 若字长32位：按字寻址范围 = $16M / 4 = 4M$ 个字

存储容量就像仓库的大小，存储单元个数是仓库有多少个格子，存储字长是每个格子能放多少东西。假设一个仓库有1024个格子，每个格子能放8个鸡蛋，总容量就是1024×8=8192个鸡蛋=1KB。

#### 2. 存储速度

| 指标 | 定义 | 关系 |
|------|------|------|
| **存取时间** | 启动一次操作到完成的时间 | 读出时间或写入时间 |
| **存取周期** | 连续两次操作的最小间隔 | 存取周期 > 存取时间 |
| **存储器带宽** | 单位时间存取信息量 | 带宽 = 存储字长 / 存取周期 |

存取时间就像从你要一本书到拿到书的时间；存取周期是连续两次取书的最小间隔，比存取时间长因为管理员需要休息；存储器带宽是单位时间能取多少本书。

假设存储字长为32位（4字节），存取周期为100ns：带宽 = 32位/100ns = 4字节/100ns = 40MBps。

### 4.2.4 半导体存储芯片

```mermaid
graph LR
    subgraph "存储芯片"
        ADDR[地址线] --> DEC[译码驱动]
        DEC --> MEM[存储矩阵]
        MEM <--> RW[读/写电路]
        RW <--> DATA[数据线]
        CS[片选线] --> DEC
        RW_CTRL[读写控制线] --> RW
    end
```

**容量计算**：
$$芯片容量 = 2^{地址线位数} \times 数据线位数$$

存储芯片就像一个小型仓库：地址线告诉仓库你要哪个格子的东西，数据线传送你拿到的东西，译码驱动根据地址找到对应的格子，存储矩阵是存放所有东西的格子，读/写电路控制是取东西还是放东西，片选线选择是哪个仓库。

一个存储芯片有10根地址线和4根数据线：容量 = 2¹⁰ × 4 = 1024 × 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。

**刷新方式**：

| 方式 | 特点 | 效率 |
|------|------|------|
| 集中刷新 | 一段时间集中刷新所有行 | 有死区 |
| 分散刷新 | 每行刷新分散到各周期 | 无死区，效率低 |
| 异步刷新 | 各行刷新均匀分散 | 折中方案 |

集中刷新就像每隔一段时间暂停所有工作集中给所有桶加水，有死区；分散刷新每次取水后顺便给这个桶加点水，没有死区但效率低；异步刷新把加水任务均匀分配到各个时间段，没有死区效率较高。

#### 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是高速电子橡皮擦，又快又大。

### 4.2.7 存储器与CPU的连接

#### 存储器容量扩展

**三种扩展方式**：

```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）

**原理**：在数据位中插入多个校验位，通过校验位的组合定位错误位。

**校验位数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位校验码。

---

## 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}$$

**平均访问时间**：
$$T_a = HT_c + (1-H)T_m$$

**访问效率**：
$$e = \frac{T_c}{T_a} = \frac{1}{H + (1-H)r}$$

其中 $r = T_m / T_c$（主存与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？需要地址映射。

#### 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） |
|-------------|--------------|-------------------|

**优点**：折中方案，兼顾速度和灵活性
**缺点**：实现复杂度中等

组相联映射就像图书馆的分组书架，每本书只能放在固定的组，但可以放在组内的任何书架上。先找对应的组，再在组内搜索，比直接映射灵活，比全相联映射快。

### 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] 定义
> 虚拟存储器是一种通过硬件和软件结合，使程序认为自己拥有连续完整内存的技术。

虚拟存储器就像一个魔法书架：你的书架（主存）很小，但你的书（程序）很多，通过魔法让你觉得有一个很大的书架。只把常用的书放在书架上，不常用的书放在地下室（辅存），当你要看不在书架上的书时，魔法自动把书从地下室取来。

Windows的虚拟内存系统：主存是电脑的8GB内存，辅存是硬盘上的页面文件，让程序认为自己有32GB内存。

### 4.4.2 页式虚拟存储器

**基本概念**：
- **页面**：把程序和内存分成固定大小的块（通常4KB）
- **页表**：记录虚拟页面和物理页面的对应关系
- **缺页中断**：当访问的页面不在内存时，产生中断，从辅存调入

页式虚拟存储器就像图书馆的借书系统：页面是每本书分成固定大小的章节，页表是图书馆的借书记录，记录哪些章节在图书馆（内存）哪些在外面（辅存），缺页中断是你要看的章节不在图书馆需要去外面取。

### 4.4.3 段式虚拟存储器

**基本概念**：
- **段**：把程序按逻辑分成不同的段（代码段、数据段等）
- **段表**：记录段的起始地址和长度
- **段错误**：访问越界时产生错误

段式虚拟存储器就像图书馆的分类系统：段是图书馆按类别分成不同的区域（科技区、文学区等），段表是图书馆的区域地图，记录每个区域的位置和大小，段错误是你要去科技区却走到了文学区越界了。

### 4.4.4 段页式虚拟存储器

**基本概念**：
- **结合**：先分段，再分页
- **优点**：兼顾段式和页式的优点
- **缺点**：实现复杂

段页式虚拟存储器先按类别分成不同的区域，每个区域再分成固定大小的书架，既方便分类管理又方便查找。现代操作系统大多采用段页式虚拟存储器。

---

## 📝 本章小结

### 核心概念

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²⁴ = 16777216 个地址，8位数据线表示每个单元存8位数据（1字节），存储容量 = 16777216 × 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（数据），加上控制电路。

**容量扩展三种方式**：位扩展（增加字长，数据线串联）、字扩展（增加字数，片选线用高位地址）、字位同时扩展。

**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行数），简单但冲突多。**组相联**：折中方案，先定组再组内任意放。

**虚拟存储器**：页式（固定大小页面+页表）、段式（逻辑分段+段表）、段页式（先分段再分页）。

**海明码**：校验位数r满足 2^r ≥ m+r+1，8位数据需要4位校验码，可纠正1位错误。

---

## 🔗 相关链接

- [[00_计算机组成原理学习指南]] - 返回主目录
- [[03_系统总线]] - 上一章
- [[05_输入输出系统]] - 下一章
- [[06_运算方法]] - 数据表示相关内容

---

*本章难度：⭐⭐⭐⭐⭐ 困难*
*重要程度：⭐⭐⭐⭐⭐ 重点*
