第 3 章 多层次的存储器 —— a+b 的指令和数据住哪、怎么取得又快又多
a+b 在这一章:编译好的 a+b 程序(指令)和变量 a、b,运行时都得放在主存(内存)里,CPU 按地址来取。但内存比 CPU 慢得多,于是有了 Cache(让常用的更快);内存又不够大,于是有了虚拟存储器(用磁盘”画大饼”)。这一章讲的就是”东西放哪、怎么放得又快又多又便宜”。
3.1 存储器概述:为什么要”分级”
【知识点·存储器分级(金字塔)】
- 🎓 存储器存在”快的贵且小、便宜的慢且大”的矛盾,故采用 Cache–主存–外存三级层次,兼顾速度、容量、价格。
- 🌱 钱包(Cache)装得少但拿钱快,银行卡(主存)多一些,家里保险柜(外存)最多但取一趟慢——按”用得多放得近”分层。
速度快/贵/小 ┌──────────┐
▲ │ 寄存器 │ ← 在CPU里,最快
│ ├──────────┤
│ │ Cache │ ← SRAM,弥补CPU与主存速度差
│ ├──────────┤
│ │ 主存(内存)│ ← DRAM,CPU能直接访问,断电丢
│ ├──────────┤
▼ │ 外存(磁盘)│ ← CPU不能直接访问,断电不丢,最大最便宜
慢/便宜/大 └──────────┘
CPU 能直接访问的只有:寄存器、Cache、主存(合称内存)。外存要先调进主存。
【知识点·主存技术指标】
- 🎓 存储容量(单元总数)、存取时间(一次读/写耗时)、存储周期(连续两次访问的最小间隔,略大于存取时间)、存储器带宽(单位时间存取的信息量)。
- 🌱 容量=能装多少;存取时间=取一次多快;存储周期=取完这次到能取下次要歇多久;带宽=每秒能搬多少数据。
3.2 / 3.3 半导体存储器:SRAM(Static RAM,静态随机存储器——用触发器存数据,快但贵) 与 DRAM(Dynamic RAM,动态随机存储器——用电容存数据,便宜但需定时刷新)
【知识点·SRAM vs DRAM】
- 🎓 SRAM 用触发器存1位,速度快、不需刷新,但集成度低、贵,用作 Cache;DRAM 用”电容+1个MOS管(Metal-Oxide-Semiconductor,金属-氧化物-半导体场效应晶体管,基本的半导体开关元件)“存1位,集成度高、便宜,但电容会漏电须定期刷新,用作主存。
- 🌱 SRAM 像”用六个小开关锁住一位”(稳但占地方),DRAM 像”在小桶里存点水代表1”(省地方但水会漏,得定时加水=刷新)。内存条是 DRAM,CPU里的Cache是SRAM。
【知识点·DRAM 刷新(计算题考点)】
- 🎓 因电容漏电,DRAM 须在刷新周期(通常2ms)内按行刷新一遍。三种方式:
- 集中式:在2ms末尾集中刷所有行,期间不能访存(存在”死区”)。
- 分散式:每个存取周期后顺带刷一行(系统周期变长,刷新过频)。
- 异步式:每隔(2ms/行数)刷一行,兼顾二者(最常用)。
- 🌱 给所有”漏水的小桶”定时加水:①集中=营业前一次性全加(这段时间不接客);②分散=每接一个客就顺手加一桶(太勤);③异步=按节奏每隔一会加一桶(最合理)。
【知识点·存储容量扩展(必考)】
- 🎓 ①位扩展(字长不够):多片并联,地址线/控制线共用、数据线分开拼宽;②字扩展(字数不够):地址高位译码做片选,数据线/低地址共用;③字位同时扩展。所需片数 d = 设计容量 ÷ 单片容量。
- 🌱 位扩展=多块硬盘拼成”更宽的一条数据”(8位拼成16位);字扩展=多块拼成”更多的格子”(每块管一段地址);同时扩展=又宽又多。
位扩展: 1M×4 + 1M×4 → 1M×8 (两片各出4位,拼成8位,地址公用)
字扩展: 1M×8 + 1M×8 → 2M×8 (高位地址A20选哪片,数据公用)
【知识点·ROM 与 Flash】
- 🎓 ROM(Read-Only Memory,只读存储器)只读、断电不丢:掩模ROM(厂家固化)、PROM(Programmable ROM,可编程只读存储器——出厂后用户可一次性写入)、EPROM(Erasable PROM,可擦除可编程只读存储器——用紫外线照射可擦除重写)、EEPROM(Electrically Erasable PROM,电可擦除可编程只读存储器——用电信号即可擦除);Flash 闪存是高密度、非易失、可电擦写的存储器,兼具RAM(Random Access Memory,随机存取存储器——断电丢失、可随意读写)可写与ROM不丢的优点。
- 🌱 ROM 是”出厂就刻死/只能少量改写”的存储;U盘、SSD(Solid State Drive,固态硬盘——用闪存芯片代替磁盘的存储器,无机械部件、快速)、手机存储都是 Flash——断电不丢、能反复写、还快。
【知识点·DRAM 校验】
- 🎓 DRAM 作主存,读写须保证正确性,常加校验位(如海明码)与数据一起存储、读出时校验。
- 🌱 重要数据多存几位”校验位”,读出时核对一下有没有出错。
3.4 / 3.5 并行存储器:让取数更快
【知识点·双端口 & 多模块交叉】
- 🎓 双端口存储器有两套独立读写电路,可同时访问(空间并行),地址相同时用 BUSY(忙信号——两个端口同时访问同一地址时,硬件发出此信号让其中一个等待)标志仲裁;多模块交叉存储器把地址按低位散布到多个模块,连续地址落在不同模块,可流水式并行读取(时间并行)。
- 🌱 双端口=一个仓库开两个门同时取货;多模块交叉=把连续的货分别放在4个仓库(0号货在1仓、1号在2仓…),要连续取一批时四个仓库轮流出货,几乎不用等。
顺序方式: M0:0-7 M1:8-15 ... (高位选模块) → 一个模块忙时其他闲,慢
交叉方式: M0:0,4,8 M1:1,5,9 ... (低位选模块) → 连续地址并行取,带宽高
例(课本):模块数m=4,存储周期T=200ns,总线传送50ns,连续读4个字: 顺序:t=mT=800ns;交叉:t=T+(m−1)·50=200+150=350ns。交叉快得多。
3.6 Cache 高速缓存(全章最重,超高频)
【知识点·Cache 原理与局部性】
- 🎓 Cache 是介于 CPU 和主存间的高速小容量 SRAM,存放主存中最近常用的块,依据程序访问的局部性原理(时间局部性:刚用过的还会用;空间局部性:用了某处附近也快用)提高命中率,全硬件管理、对程序员透明。
- 🌱 把你最近常翻的几页书放手边(Cache),不用每次都跑去书架(主存)。a+b 的循环、连续的数组访问,都符合”局部性”,所以Cache很有效。
【知识点·命中率与平均访问时间(必考计算)】
命中率 h = Nc / (Nc + Nm) Nc:命中次数, Nm:未命中(访主存)次数
平均访问时间 ta = h·tc + (1−h)·tm tc:Cache时间, tm:主存时间
访问效率 e = tc / ta
速度比 r = tm / tc
例(课本):Cache命中1900次、主存100次,tc=50ns、tm=250ns: h=1900/2000=0.95;ta=0.95×50+0.05×250=60ns;效率 e=50/60≈83.3%。
【知识点·三种地址映射(命题最爱,必须会算位数)】
- 🎓 主存与Cache都按相同大小分”块/行”。三种映射:
| 映射 | 规则 | 优点 | 缺点 |
|---|---|---|---|
| 全相联 | 主存任意块→Cache任意行 | 冲突最少、利用率高 | 比较器复杂、贵 |
| 直接 | i = j mod m(块号 mod Cache行数) | 硬件简单、快 | 冲突多(抖动) |
| 组相联 | 组间直接、组内全相联 q=j mod u | 折中,最常用 | 适中 |
- 🌱 全相联=随便停车(找车位慢但不浪费);直接映射=对号入座(停车快但容易撞位);组相联=分区域、区域内随便停(最实用,四路组相联最常见)。
主存地址的拆分(这是计算题的核心!)
全相联: ┌── 标记 s ──┬─ 块内地址 w ─┐
直接映射: ┌─ 标记 ─┬─ 行号 r ─┬─ 块内 w ─┐
组相联: ┌─ 标记(s−d) ─┬─ 组号 d ─┬─ 块内 w ─┐
其中: 块大小=2^w; Cache行数=m; 组数=2^d
例(课本组相联):64行、每组4行、主存4K块、每块128字: w:128=2⁷→w=7;每组4行(k=4),行数kv=64→组数v=16→d=4;主存块2ˢ=4K=2¹²→s=12; 标记=s−d=8位。地址格式:标记8 | 组号4 | 字号7,主存地址共19位。
【知识点·替换策略】
- 🎓 Cache满时换出哪行:FIFO(先进先出)、LRU(近期最少使用,最常用且最符合局部性)、LFU(最不经常使用)、随机。
- 🌱 手边书放不下要收一本回书架:LRU=收”最久没翻的那本”(最合理);FIFO=收”最早拿来的”;随机=闭眼抽一本。
【知识点·写策略】
- 🎓 写命中时如何保持 Cache 与主存一致:写回法(只改Cache,换出时才写回主存,快但需脏位)、全写法/写直达(同时写Cache和主存,简单但慢)、写一次法。
- 🌱 你在便签(Cache)上改了内容:写回=先只改便签,等扔便签时才抄回正本;全写=改便签的同时立刻抄回正本(稳但费事)。
【知识点·多级 Cache】
- 🎓 为进一步缩小 CPU 与主存差距,设 L1/L2/L3 多级 Cache,逐级在前级未命中时访问。
- 🌱 手边一摞(L1)、抽屉里(L2)、书柜近处(L3),一级找不到再找下一级,层层兜底。
3.7 虚拟存储器(高频)
【知识点·虚存基本概念】
- 🎓 用户按”虚地址(逻辑地址)“编程,程序存在辅存;运行时由地址变换机构把虚地址转成”实地址(物理地址)“访问主存,这一过程称程序的再定位。每个程序的虚空间可远大于实际主存。
- 🌱 每个程序都以为自己独占一大片连续内存(虚地址),其实操作系统偷偷把它映射到真实内存的零碎位置(实地址),不够还放磁盘上——相当于”用磁盘给内存画大饼”。
【知识点·页式虚存 + 页表 + TLB(Translation Lookaside Buffer,快表——页表的Cache,硬件高速查找页号对应的物理地址)】
- 🎓 把虚空间和主存都分成等大的”页”。虚地址=逻辑页号+页内地址,经页表(页号→物理页号+有效位)变换得物理地址。页表在主存→每次访存要查两次,故把最活跃页表项放进高速的快表 TLB(慢表=主存中的完整页表)。
- 🌱 把程序切成一页页,用一张”页号对照表”查每页搬到了内存哪儿。查表本身也慢,所以把最常查的几条抄在”便利贴 TLB”上,先看便利贴。
页式地址变换:
虚地址 ┌─ 逻辑页号 ─┬─ 页内偏移 ─┐
│ 查页表(先查TLB快表)
▼
物理地址┌─ 物理页号 ─┬─ 页内偏移 ─┐ (页内偏移直接照搬)
【知识点·段式 / 段页式】
- 🎓 段式按程序自然逻辑(子程序、数据段)分段,长度可变,经段表(有效位+段起址+段长)变换,便于共享保护,但易产生外碎片、需加法求址;段页式=先分段再每段分页,兼得二者优点(按段编程保护、按页调度),但需多次查表。
- 🌱 分页是”按固定大小切”(像切方块蛋糕),分段是”按内容切”(这块是函数、那块是数据,大小不一);段页式=先按内容分段,每段再切成等大的页,又好管理又灵活。
【知识点·Cache 与虚存的异同(高频简答)】
- 🎓 相同:都基于局部性、都用”小快+大慢”两级、目的都是提升性价比。不同:Cache解决CPU–主存速度差、全硬件、对程序员透明;虚存解决容量问题、软硬件共管、未命中(缺页)损失大得多(要访辅存+任务切换)。
- 🌱 Cache 管”快不快”、纯硬件偷偷干、你完全察觉不到;虚存管”够不够大”、靠操作系统帮忙、一旦缺页要去磁盘搬,慢得多。
⭐ 本章在 a+b 故事里的位置
a+b 的指令和变量住进了主存,CPU 靠 Cache 取得飞快,靠虚存获得”看起来很大”的地址空间。可是——CPU 怎么知道”把 a 取来加上 b”该用哪几条指令?指令长什么样?这就是下一章:指令系统。
🧪 费曼检验区(合上笔记,用自己的话说)
规则:合上笔记,试着说给完全不懂的人听。卡壳了就说明没真懂,回头重读。
📌 老师划重点(综合题必出)
- 综合题考芯片地址线数据线怎么连(存储器扩展)
- 综合题考”存储CPU”相关
- 简答题考地址线的两张图、芯片地址
📊 教材核心考点
- SRAM 和 DRAM 的区别是什么?各自用什么电路实现?为什么 DRAM 需要刷新?
- Cache 的三种映射方式(全相联、直接、组相联)分别怎么工作?地址怎么拆分?
- 给你一个主存容量、Cache容量、块大小、几路组相联——你能算出标记/组号/块内地址各占几位吗?
- 存储器扩展(位扩展、字扩展)怎么接线?地址线和数据线分别怎么连?片选信号怎么确定?
- 虚拟存储器的页式地址变换过程是什么?页表和TLB(快表)各起什么作用?
- 命中率、平均访问时间、访问效率的公式你能默写出来吗?
📝 章节小测
先动笔算完再看答案。本章 Cache 和存储扩展是综合题常客。
【题 1 · 计算 · 存储扩展(综合题级)】 用 256K×8 位的 SRAM 芯片设计一个 1M×32 位的存储器。 (1) 需要多少片芯片? (2) 画出地址线、数据线的连接方式(用文字描述:哪些地址线接片内,哪些做片选)。
【题 2 · 计算 · Cache 组相联】 主存容量 256KB(按字节编址),Cache 容量 8KB,块大小 64B,采用 4 路组相联映射。求: (1) Cache 共多少行?多少组? (2) 主存地址的三段格式(标记、组号、块内地址各多少位)。
【题 3 · 简答】 SRAM 和 DRAM 各用什么元件存储 1 位?各有什么优缺点?分别用在哪里?
【题 4 · 计算 · 命中率】 Cache 存取时间 5ns,主存存取时间 50ns,命中率 92%。求平均访问时间和访问效率。(注:本题采用”同时访问”模型)
参考答案(点击展开)
题 1:
- (1) 字扩展:1M / 256K = 4 组;位扩展:32 / 8 = 4 片/组。总计 4×4 = 16 片。
- (2) 每片 256K = 2¹⁸ → 需 18 位片内地址。1M = 2²⁰ → 主存地址 20 位。
- 低 18 位 A₀~A₁₇:接每片芯片的地址输入(片内寻址)
- 高 2 位 A₁₈~A₁₉:接 2→4 译码器做片选(选中 4 组中的哪一组)
- 数据线:每组 4 片各出 8 位,拼成 32 位。D₀
D₇ 接第 1 片,D₈D₁₅ 接第 2 片,依此类推。题 2:
- (1) Cache 行数 = 8KB / 64B = 128 行;4 路 → 组数 = 128 / 4 = 32 组
- (2) 块内地址 w = log₂(64) = 6 位;组号 d = log₂(32) = 5 位;主存地址 = log₂(256K) = 18 位;标记 = 18 − 5 − 6 = 7 位
- 格式:
标记 7 位 | 组号 5 位 | 块内 6 位题 3:
- SRAM 用触发器(4~6 个晶体管)存 1 位:速度快、不需刷新,但集成度低、贵 → 用作 Cache
- DRAM 用电容 + 1 个 MOS 管存 1 位:集成度高、便宜,但电容漏电需定期刷新 → 用作主存(内存条)
题 4:
- ta = h·tc + (1−h)·tm = 0.92×5 + 0.08×50 = 4.6 + 4.0 = 8.6 ns
- 效率 e = tc / ta = 5 / 8.6 ≈ 58.1%
🎯 本章高频考点 & 易错坑
- 计算(核心):Cache三种映射的地址位数;命中率与平均访问时间;存储容量扩展片数;DRAM刷新;交叉存储带宽;页式地址变换。
- 简答:SRAM/DRAM区别、三种刷新、Cache与虚存异同、三种映射对比。
- ⚠️ 坑:直接映射用”块号 mod 行数”、组相联用”块号 mod 组数”;CPU不能直接访问外存;Cache对程序员透明而虚存对系统程序员不透明;对阶/写策略别和别处混。