存储层次:CPU 读个数据为什么要排队排四级?
作者:鱼宵 | 系列「软考架构师实战精通营(教材版)」· 第 1 卷 · 第 2 章 · 第 02 篇
面向:基础一般、想一次考过系统架构设计师的你
考点权重:高频(近 5 年上午题存储层次/Cache 几乎年年出现,复习按 1-3-7 天节奏)
一、本篇目标
一句话:学完这篇,你能回答三个问题——CPU 为什么不直接读硬盘?寄存器、Cache、内存、磁盘这四层到底差多少倍?给你 Cache 速度、主存速度和命中率,你能手算出平均访问时间。
这块上午选择题年年露面,计算题套路就一条公式,半小时能拿下一分,性价比全场靠前。别急,一步一步来——这篇没有任何高深内容,全是"大厨和仓库"的账。
你可能会担心自己数学底子薄。放心,这篇用到的算术就是加减乘除和一元一次方程,初中水平够了。真正的门槛不是计算,是"别代反、别换错单位"这种细心活。
对应教材
- 清华社《系统架构设计师教程》(第 2 版)第 2 章 计算机系统基础知识,重点2.2.3 存储器(片上缓存、片外缓存、主存、外存)与2.2.2 处理器(寄存器)。
- 官方考试大纲(2022 审定)1.2.3 存储器:片上缓存、片外缓存、主存和外存等。
二、零基础开胃课:先把这几个词认掉
这节没有术语轰炸,全是大白话。后面每碰到这些词不再解释第二遍,现在花五分钟认掉。
想象你开了一家小饭馆,你自己就是主厨(CPU),手艺最快。炒菜需要的料放在四个地方:
寄存器(register):你腰上挂的调料勺,手一伸就够着。快到眨眼之间,但勺子就那么大,只装眼下正用的那一撮盐。
Cache(高速缓存):灶台上刚切好的备菜盘。伸手就到,盘子不大,只摆这道菜马上要用的料。
主存/内存(memory):后厨的冰箱。料多,但你得起身走两步、开冰箱门,慢一截。
磁盘(disk):街对面的租用冷库。海量、便宜,但你得锁门、下楼、过马路,跑一趟以"分钟"计。
这里有个反直觉的账:越快的东西越小越贵,越慢的东西越大越便宜。调料勺最小最贵,冷库最大最便宜。工程师只能折中——小而快的放手边,大而慢的放远处。后面每碰到这些词不再解释第二遍。
你可能会想:既然磁盘慢,为什么不把所有东西都放内存?问得好。内存断电就丢,而且每 GB 的价钱是磁盘的几十倍;寄存器更快,真做 1GB 得是天价。所以这四层不是设计师拍脑袋排的,是"速度、容量、价钱"三方妥协出来的结果。
跟着程序走一遍:你点开一个 App,操作系统先从磁盘把它搬进内存(冷库搬到冰箱);CPU 运行时,频繁用到的代码和数据自动从内存搬进 Cache(冰箱搬到灶台);正在算的那个数从 Cache 进寄存器(灶台到勺子)。四层各就各位,大厨这才开火。
记住这个动线:磁盘 → 内存 → Cache → 寄存器,方向是从慢到快、从远到近。考试让你排访问顺序、排速度顺序,就是这个方向反过来正过去。
速度差的数量级给个记忆钩子:寄存器是"眨眼之间",Cache 是"眨两三下",内存是"你眨一次眼它才动一下",磁盘是"你眨一次眼,它等一百万次眨眼"。以后题目给你一个时间,你先问自己:这是哪一层的时间?
三、概念讲解
这一节按三个问题走:先搞懂 CPU 为什么不能直接读硬盘,再搞懂为什么要分层,最后搞懂 Cache 凭什么让 CPU 变快。每个问题下面的考点小节,都按"它是什么→生活里对应什么→考试怎么考"讲。
CPU 直接读硬盘行不行?为什么不行?
寄存器是什么。它是 CPU 芯片里面最小最快的存储,只存当前正在处理的那几条数据和指令,容量就几十到几百个字节。对应主厨腰上那把调料勺——你正在撒的盐,只占勺子一小口。它快到什么程度?跟 CPU 同一个节奏,几乎不花时间。考试若问"速度最快、容量最小的存储是什么",答案就是寄存器,别选 Cache。
内存(主存)是什么。它是插在主板上的内存条,容量几十 GB,CPU 要的数据原则上都先放它这儿。对应后厨冰箱——常备料都在里面,起身去取就行。它比寄存器慢几十倍,但比硬盘快成千上万倍。注意它的脾气:断电就空,叫"易失性",所以没保存的文件关机就没了。
磁盘是什么。硬盘是机械设备,盘片每分钟转几千圈,读头要挪到指定位置才能取数。对应街对面冷库——料多便宜,但跑一趟太久。它存操作系统、你的文件、数据库,关机了数据还在,这叫"持久存储"。慢是机械结构的天生属性,不是工程师不努力,别跟 CPU 比速度。
四级速度差数量级。记住这组数:寄存器约 1 纳秒(ns),Cache 几纳秒,内存几十到几百纳秒,磁盘几到几十毫秒。从内存到磁盘,差了大约一百万倍(10⁶)。你眨一次眼约 0.3 秒,磁盘读一次数据的时间,在 CPU 眼里等于你眨一次眼。考试常考排序:谁最快谁最慢,答案就是这张金字塔从上到下。
换个角度感受:CPU 转一圈只要一眨眼的几百万分之一,它空等磁盘读一次数据,够它转几百万圈。让大厨站在冷库门口发呆,是整个系统最大的浪费——后面所有缓存设计,都是为了别让这种发呆发生。
为什么要造这么多层存储?直接全都快起来不行吗?
问题摆在这:既然快这么值钱,把内存做得跟寄存器一样快,问题不就全解决了?做不到——快存储的成本和物理极限摆在那。只能分层折中。
快的东西为什么又小又贵。快存储靠的是"电子开关直接摆在 CPU 身边",材料贵、走线难,做大了成本天文数字。慢存储是磁记录或闪存,密度高、成本低。所以工程上的折中是:小而快的放手边,大而慢的放远处,让大多数访问落在快的那层。考试问"为什么要分级存储",答案就这一句。
Cache 是什么。它夹在 CPU 和内存之间,几兆字节级别,速度几纳秒。对应灶台备菜盘——刚切好的料放一盘,炒这道菜顺手就拿。它的全部使命就一句话:挡住 CPU 直接冲内存的次数。命中率做到 95% 以上才算及格,99% 才算优秀。
局部性原理(时间+空间)。Cache 这么小,凭什么装得下 CPU 要用的数据?因为程序有两个脾气。时间局部性:刚用过的数据很快还要用,循环变量每轮都读它。空间局部性:刚访问的数据旁边的马上也要用,数组元素紧挨着存。你洗衣服不会洗一件跑一趟阳台,Cache 就是把刚用的、旁边的一并抱回来。
拿 for 循环对照:循环体那几条指令每轮都重新执行一遍,这是时间局部性;读了 a[0] 下一轮就读 a[1],这是空间局部性。考试就考这两个词的区分——问"刚用过的还要用"选时间局部性,问"挨着的也要用"选空间局部性。记住:时间是"同一点反复用",空间是"邻居一起用"。
Cache 凭什么让 CPU 变快?
前面说的都是"为什么要分层",这一节落到考试计算题上:Cache 到底靠什么让平均时间贴近快的那层?答案是命中率,下面三个考点把它讲透。
命中率与失效率。命中率 h:CPU 要的数据在 Cache 里直接找着的概率。找不着叫失效,失效率 = 1 − h。举个例:100 次访问找着 95 次,命中率 95%,失效率 5%。考试最爱拿"命中率"和"失效率"挖代反的坑——题目说"失效率 5%",你代公式时命中率就是 95%,别把 5% 直接塞进去。这种坑年年挖,等于出题老师白送提醒。
平均访问时间公式。一次访问有两种结局:命中走快路,花 t_Cache;失效走慢路去主存,花 t_主存。按概率一加权就是平均访问时间。公式长什么样、怎么推出来,下一节手把手带你从例子里算出来,这里先认个脸熟。
单位换算陷阱。题目里 ns 和 ms 混着给,1ms = 10⁶ ns。单位不统一就代公式,结果直接离谱六个数量级。我当年第一次算这章就栽在这儿,后面例题我当面给你换一次。反过来想:磁盘慢不是"一点点慢",是慢一百万倍——所以才必须让 Cache 在中间挡着,CPU 别直接碰磁盘。
缓存一致性(提一句)。多核 CPU 每个核有自己的 Cache,同一份数据可能在两个核的 Cache 里各存一份,一个改了另一个就旧了。怎么保证大家手里的副本一致,叫缓存一致性。上午题知道有这回事、能把名字认出来就够。
多级 Cache(L1/L2/L3)。现代 CPU 里 Cache 自己也分了级:L1 最小最快,就在 CPU 核心边上;L2 大一点慢一点;L3 再大再慢,一颗 CPU 共享。对应你灶台上的备菜盘(L1)、灶台边的层架(L2)、厨房里的小车(L3)。考试看到 L1/L2/L3 别慌,就是"快小"套"慢大"的老套路,越多级越兼顾两头。
虚拟内存(提一句)。内存装不下所有运行程序怎么办?操作系统把硬盘的一部分当内存用,这叫虚拟内存。它解决的是"内存不够",Cache 解决的是"速度不匹配",两个名字像,别混。
四、手把手演示:公式是怎么算出来的
这一节不直接甩公式。咱们先算一道最笨的题,再从笨算法里把公式"长"出来——这样你考场上忘公式了,也能现场推。
第一步:先算一道最笨的题
题目:Cache 存取时间 3ns,主存 30ns。CPU 访问 100 次,90 次命中、10 次失效。总共花多少时间?平均每次多少?
别套公式,先笨算。命中的 90 次:90 × 3 = 270ns。失效的 10 次:每次得去主存取,10 × 30 = 300ns。总时间 = 270 + 300 = 570ns。平均每次 = 570 ÷ 100 =5.7ns。
为什么这样算:命中和失效走两条路,各花各的钱,先分开算账再合总账。
第二步:归纳出公式
100 次里命中 90 次,命中率 h = 0.9。把笨算式子拆开看:
平均时间 = 0.9 × 3 + 0.1 × 30 = 2.7 + 3 = 5.7ns。
看见没?就是"命中概率 × Cache 时间 + 失效概率 × 主存时间"。这就是公式的来历。
正式公式
平均访问时间 t = h × t_Cache + (1 − h) × t_主存
h 是命中率,(1−h) 是失效率。背它之前你已经亲手推过一遍了。
练手例 1:命中率 99% 时
t = 0.99 × 3 + 0.01 × 30 = 2.97 + 0.30 =3.27ns。命中率 99%,平均时间几乎贴着 Cache 的 3ns 走——Cache 的价值就在这儿。
顺手记一个连带考点:加速比 = 没有 Cache 的时间 ÷ 有 Cache 的平均时间。这里没有 Cache 每次都 30ns,加速比 = 30 / 3.27 ≈ 9.2 倍。命中率 99%,几乎白捡 9 倍性能。
练手例 2:反求命中率
题目:Cache 100ns,主存 1000ns。要求平均存取时间不超过 Cache 存取时间的 115%,命中率至少多少?
目标平均时间 = 1.15 × 100 = 115ns。列不等式:h × 100 + (1 − h) × 1000 ≤ 115。展开:100h + 1000 − 1000h ≤ 115,合并:−900h ≤ −885。两边除以负数,不等号反向:h ≥ 885 / 900 ≈0.983,即 98.3%。为什么除负号要反向:不等式两边同除负数,大小关系就颠倒,这是小学学的规矩。
单位换算现场演示:题目若说主存 1ms、Cache 10ns,先把 1ms 写成 1000000ns,再代公式。两边单位都是 ns 了,算出来才不是天文数字。这一步偷不得懒——你只要看到单位不一样,第一件事就是统一成 ns。
练手例 3:两种命中率不一样怎么办
题目:主存 100ns,Cache 10ns。取指令命中率 98%,取数命中率 95%。
取指平均:0.98 × 10 + 0.02 × 100 = 9.8 + 2 =11.8ns。
取数平均:0.95 × 10 + 0.05 × 100 = 9.5 + 5 =14.5ns。
为什么分开算:指令和数据的命中率不同,各走各的加权。考试若问"取指和取数的平均时间",就是这两个数。别图省事拿一个命中率代到底。
三道例题连起来你应该摸到规律了:正向算平均就代公式,反向求命中率就列方程,单位不统一就先换算。就这三招。
五、真题精讲
真题 1:反推命中率(2006 年上半年软件设计师上午试卷,软考中级·同族)
高速缓存 Cache 与主存间采用全相联地址映像方式,高速缓存容量 4MB、分 4 块、每块 1MB,主存 256MB。若主存读写时间为 30ns,高速缓存读写时间为 3ns,平均读写时间为 3.27ns,则该高速缓存的命中率为( )%。
——来源:软考之家真题 PDF(ruankao123.com《2006 年上半年软件设计师上午试题》);可信度:真题原题(2006 上半年软件设计师,软考中级,与系统架构设计师同属软考系列,题型同族)。
读题:4MB、4 块、256MB 全是干扰信息,算命中率只需要三个时间数。设命中率 h:3.27 = h × 3 + (1 − h) × 30。展开:3.27 = 3h + 30 − 30h。移项:−26.73 = −27h。消负号:h = 26.73 / 27 =0.99,即 99%。对答案就是 99%。
为什么容量信息是干扰:命中率只跟"命中花多久、失效花多久、平均花多久"这三个时间数有关,跟 Cache 多大、主存多大没关系。看到一大串容量参数,先挑时间数,别被吓住。
真题 2:教材经典例题(非软考真题)
Cache 存取时间 100ns,主存 1000ns,要求平均存取时间不超过 Cache 存取时间的 115%,命中率至少应为多少?
——来源:清华大学出版社《计算机组成原理一本通》第 3 章 Cache 例题(tup.tsinghua.edu.cn);可信度:例题(非软考真题)。
就是第四节例 2 那道,答案 h ≥ 98.3%。考试若问"命中率至少多少才达标",列不等式解 h 即可。这类题的套路是把文字条件翻成不等式:"不超过 Cache 的 115%"就是 ≤ 1.15 × 100。
说明:未检索到系统架构设计师本考"AMAT 反向求命中率"的可溯源完整题面,故以 2006 同族真题 + 教材例题组合,均已标注。
真题 3:Cache 概念辨析(2011 年下半年系统架构设计师上午试卷)
以下关于 Cache 的叙述中,正确的是( )。
A. 容量确定时,替换算法的时间复杂度是影响命中率的关键因素
B. Cache 的设计思想是在合理的成本下提高命中率
C. Cache 的设计目标是容量尽可能与主存容量相等
D. CPU 中的 Cache 容量应大于 CPU 之外的 Cache 容量
——来源:2011 年下半年系统架构设计师上午综合知识第(10)题,CSDN《2011 年下半年系统架构设计师上午综合知识真题及答案》(https://blog.csdn.net/yuanmayuzhou/article/details/143388730)、豆丁网同题互证;可信度:真题原题。
答案B。A 错——影响命中率的关键是程序局部性和 Cache 容量,不是替换算法的时间复杂度;C 错——Cache 天生比主存小几个数量级;D 错——片上 Cache 容量远小于片外。这道题提醒你:概念题的答案往往就是"Cache 是为了缓和 CPU 与主存速度差、用合理成本换命中率"这句话的变体。
考场常见疑问:题目没直接给命中率怎么办?别慌,它一定换了个马甲——要么给"平均访问时间"让你反求,要么给"平均时间不超过 Cache 时间的百分之几"让你列不等式。反正公式就一条,已知数往里塞,缺哪个解哪个。
真题 4:Cache 对程序员透明(2009 年下半年系统架构设计师上午试卷第(11)题)
在嵌入式系统设计时,下面几种存储结构中对程序员是透明的是(11)。
A. 高速缓存 B. 磁盘存储器 C. 内存 D. flash 存储器
——来源:2009 年下半年系统架构设计师上午综合知识第(11)题,软考之家真题 PDF(http://www.ruankao123.com/uploads/pdf/gaoji/系统架构师/2009年下半年系统架构师上午试题.pdf );可信度:真题原题。
答案A。什么叫"对程序员透明"?就是程序员看不见、不用管,硬件自己搞定。Cache 就是这样——CPU 发地址,硬件自动判断在不在 Cache,程序员完全无感知。磁盘、内存、flash 程序员都要显式编程。这道题考的是存储层次里"谁是自动兜底"的概念:Cache 那一级,硬件全包。
六、图解
图 1:存储金字塔——从上往下走,越走越慢、越大、越便宜。寄存器 ~1ns 只有几百字节,磁盘 ~10ms 却能装几 TB;相邻两层差 3 倍到 10 万倍,这个数量级差就是 Cache 存在的理由。
图 2:一次访存的两条路——命中走 Cache(3ns 级),失效才绕去主存(慢 10~100 倍)。命中率 h 越高,平均访问时间就越贴近左边这条快路。
这张图就是公式的骨架:左边那条路贡献 h × t_Cache,右边那条路贡献 (1−h) × t_主存,加起来就是平均访问时间。考场上公式忘了,把这张图默画出来,公式自己就长回来了。
看这两张图你就明白为什么 Cache 值得做:绝大多数请求走左边那条 3ns 的路,偶尔才绕一次远。
再把两张图连起来看:金字塔的每一层,本质上都是下一层的"快速备份"。寄存器是 Cache 的快速备份,Cache 是内存的快速备份,内存是磁盘的快速备份。越往上,备份越小、越贵。考试让你排"速度从快到慢",就按金字塔从上到下念;让你排"容量从小到大",同一个顺序。
七、自测五题(答案在本节末尾)
- 下列存储层级中,速度最快的是( )。
A. Cache B. 寄存器 C. 内存 D. 磁盘 - Cache 存取时间 5ns,主存 100ns,命中率 95%,平均访问时间是多少?
- 命中率从 95% 提到 99%,第 2 题的平均访问时间变大还是变小?算出新值。
- 1ms 等于多少 ns?( )
A. 1000 B. 10⁴ C. 10⁶ D. 10⁹ - 下面哪句话对 Cache 的理解是对的?( )
A. Cache 容量做得越大越好,最好和主存一样大
B. Cache 用合理成本换高命中率,缓和 CPU 与主存的速度差
C. 磁盘比内存快,因为磁盘容量大
D. 虚拟内存和 Cache 是同一个东西
答案:1. B;2. 0.95×5 + 0.05×100 = 4.75 + 5 =9.75ns;3. 变小,0.99×5 + 0.01×100 = 4.95 + 1 =5.95ns;4. C(10⁶);5. B。错了回第三节对应考点小节和第四节重看。第 2、3 题要是算错,多半是失效率代反了——记住 (1−h) 才是失效率。
七(补)、本篇题库(5 道,易→难)
题 1(自编,易):Cache 访问时间 4ns,主存 80ns,命中率 98%。平均访问时间是多少?
- 答案:0.98×4 + 0.02×80 = 3.92 + 1.6 =5.52ns。
- 解析:代公式 t = h·t_c + (1−h)·t_m。回指第四节公式推导。
题 2(自编,易):磁盘寻道时间 10ms,等于多少 ns?
- 答案:10 × 10⁶ =10⁷ ns。
- 解析:1ms = 10⁶ ns,乘 10 即可。回指第三节单位换算陷阱。
题 3(改编真题,中):程序循环访问 a[0]、a[1]、a[2]……这种行为主要利用了哪种局部性?
- A. 时间局部性 B. 空间局部性 C. 全局局部性 D. 随机局部性
- 答案:B。
- 解析:数组元素紧挨着存,读了 a[0] 下一轮读 a[1],是"邻居一起用"。回指第三节局部性原理。
题 4(自编,难):Cache 20ns、主存 200ns,希望平均访问时间不超过 Cache 的 1.2 倍,命中率至少多少?
- 答案:目标 = 1.2×20 = 24ns。列不等式 h×20 + (1−h)×200 ≤ 24 → 20h + 200 − 200h ≤ 24 → −180h ≤ −176 → h ≥ 176/180 ≈0.978,即 97.8%。
- 解析:反向求命中率套路,和例 2 同款。回指第四节例 2。
题 5(改编真题,难):下列哪种存储结构对程序员完全透明?
- A. 内存 B. Cache C. 磁盘 D. 寄存器
- 答案:B。
- 解析:Cache 由硬件自动管理,程序员无感知。回指第五节真题 4(2009 架构师)。
八、本篇技术英语
高频词
- cache[kæʃ]「开-许」|高速缓存
- register[ˈredʒɪstə®]「瑞-姐-斯-特」|寄存器
- memory[ˈmeməri]「迈-么-瑞」|内存
- hierarchy[ˈhaɪərɑːki]「嗨-尔-阿-K」|层次结构
- latency[ˈleɪtənsi]「雷-腾-西」|延迟
真实句子(康奈尔大学 CS3410 课程笔记原文)
句 1:“You can characterize the overall performance by computing the average memory access time (AMAT) for the entire memory system.”
三步拆读:先找动作词——can characterize(能刻画);再找谁在动——You(你);修饰词跳过——by computing… 是"靠算什么"。拼大意:你可以靠算整个存储系统的平均访存时间(AMAT)来刻画整体性能。
断句位置:You can characterize the overall performance / by computing the average memory access time (AMAT) / for the entire memory system.
关键生词:characterize「开-瑞克-特-赖兹」刻画;overall「欧-我-瑞欧」整体的。跟读动作:手机词典搜这句,听 3 遍跟着读 1 遍。
句 2:“The average access time is: t_avg = t_hit + r_miss × t_miss”
这就是本篇公式的英文原版。动作词是 is(是),主语 The average access time(平均访问时间)。t_hit 命中时间,r_miss 失效率,t_miss 失效时间。跟读时把 r_miss 念"ar-miss"。你会发现这个公式跟你手推的一模一样——国外教材和咱考点说的是同一件事。
真实场景练习
打开康奈尔课程页 https://www.cs.cornell.edu/courses/cs3410/2025fa/notes/caches.html ,Ctrl+F 搜 “average memory access time”,把搜到的那句翻译出来、对着念两遍。认得出 AMAT 这个缩写,以后看英文教材、报错提示、技术文档都不怵。
心理松绑
发音不标准没关系,能读个大概就行。
九、必背清单
考前一天把这十条过一遍,每条都是能直接写进卷子的短句:
- 寄存器最快,约 1ns,容量几百字节。
- Cache 几 ns,主存几十到几百 ns,磁盘几 ms。
- 内存到磁盘差约一百万倍,1ms = 10⁶ ns。
- 越快的存储越小越贵,越慢的越大越便宜。
- Cache 的使命:挡住 CPU 直接冲内存。
- 时间局部性:刚用过的很快还要用。
- 空间局部性:刚访问的旁边的马上也要用。
- 命中率 h 是找着的概率,失效率 = 1 − h。
- 平均访问时间 = h×t_Cache + (1−h)×t_主存。
- 求命中率是一元一次方程,除负数记得不等号反向。
十、速记表 + 复习计划
| 考点 | 一句话 |
|---|---|
| 四层顺序 | 寄存器 → Cache → 主存 → 磁盘 |
| 速度量级 | 1ns → 几ns → ~100ns → ~10ms |
| 局部性 | 时间+空间,Cache 有用的理由 |
| 公式 | t = h·t_c + (1−h)·t_m |
| 易错 | h 是命中率;ns/ms 先统一单位 |
这张表考前五分钟扫一眼,比临时抱佛脚强。
本篇复习计划(1-3-7 天):今天把公式从笨算法推一遍、例 2 自己算到 98.3%;明天自测五题重做一次,错哪题回哪节;周末把本篇和第 03 篇流水线、第 04 篇磁盘调度串起来过——都属于计算机系统基础计算题组,做题手感是通的。
下篇预告:第 03 篇流水线计算——一条指令拆成五步,五拨人同时干,为什么全厂速度由最慢那一步说了算?
互动提问:命中率只能做到 90%,主存 100ns、Cache 10ns,平均访问时间是多少?评论区算算看。
本篇就到这儿。合上书你应该能跟人讲明白:CPU 为什么不直接读硬盘、Cache 凭什么有用、那条公式怎么从笨算法里长出来。三块都讲到,这篇就没白读。