
每到期末计算机体系结构很多学校叫计算机系统结构这门课总能精准地让一批人开始怀疑人生。平时听课觉得“不就是讲CPU怎么干活嘛”翻开教材目录才发现性能公式、流水线冒险、Cache映射、多核一致性十个模块八个在烧脑。更麻烦的是这门课既不是纯记忆、也不全是计算它考的是“你会不会像设计师一样权衡取舍”。这篇文章就是帮你把期末复习的路数捋清楚。我会按照公认的复习主线——量化分析、指令集与流水线、存储层次、并行处理四大块把每个模块里老师最爱考的点、最常埋的坑、最实用的解题套路逐一拆开讲再结合我当年备考和后来带学弟学妹复习的经验给你一份可以直接照着执行的复习清单。不管你是考前突击还是想冲高分这份内容都按“性价比”排好了优先级先把基础分全部吃进嘴里再谈区分度。1. 先弄清这门课到底在考什么1.1 体系结构和组成原理不是一回事很多同学把《计算机组成原理》的笔记翻出来以为体系结构就是换了个名字的组成原理这是第一个误会。组成原理讲的是“硬件是怎么实现的”——寄存器怎么接、ALU怎么算、时序怎么走而计算机体系结构研究的是“计算机软硬件之间的功能分配和界面划分”——哪些功能该用硬件提速哪些该交给编译器或操作系统软硬件接口长什么样。胡伟武那本《计算机体系结构教学与习题指导第2版》开篇就直接点明这个主题这也是为什么同样一道题组成原理问你“Cache有几路组相联、索引怎么译码”体系结构会往前再走一步问你“为什么选4路而不是8路容量、功耗、命中率如何权衡”。备考的时候头脑里要先立起这根弦这门课几乎所有考点最终都归结为在性能、功耗、成本、复杂度之间做取舍。1.2 期末卷子的常规“势力分布”不同学校、不同教材试卷结构会有差异但主线高度一致。以国内最常见的高校教学大纲来看期末卷面一般按知识模块出题系统结构的基础与量化分析性能公式、Amdahl定律约占10%到15%指令集体系结构与流水线RISC、MIPS/RISC-V指令格式、流水线冒险与转发、分支预测约占30%甚至更多存储层次Cache映射与替换、写策略、虚拟存储与TLB约占25%到30%并行处理与多核ILP、多发射、Cache一致性、多核加速比约占15%到20%。剩下的可能是一些概念辨析题或开放性设计题。这个分布是复习优先级的重要依据。流水线加存储层次如果算在一起已经超过卷面的一半必须投最多时间性能分析模块虽然占比不高但它是计算题的“入场券”不会公式后面的题基本没法做。所以复习战略应当定为先把性能公式焊死在脑子里再猛攻流水线和Cache最后用并行处理来拉开分差。1.3 复习材料的取舍教材以学校指定为主但如果你手里是胡伟武那本第2版复习重点就非常清晰前面章节讲基础指令集用LoongArch一个非常典型的RISC风格指令集后面章节讲存储、并行和新型架构。胡伟武教材的习题设计得很贴近期末出题风格计算题、简答题、设计题都有课后题值得反复刷。如果学校用的是Hennessy和Patterson的“量化研究方法”经典的5级流水线和MIPS指令集案例就是主线。这里想提醒一句不要把大量时间花在收集网上各种机构的“重点总结”上最值得刷的永远是教材的例题和课后题以及期末前老师给的模拟题。网上资料能帮你查漏补缺但不能替代教材习题的深度。如果课程还配套了模拟器或实验平台不少学校会让学生用MARS、RARS或者自主开发的流水线模拟器跑实验期末前一定要把实验报告中老师强调的“现象”和“结论”翻出来看实验题往往就是卷面分析题的背景故事。2. 性能分析体系结构复习的第一块基石2.1 三个公式期末计算题的主干第一个公式是CPU执行时间的分解CPU时间 指令数 × CPI × 时钟周期时间也可以写作 CPU时间 指令数 × CPI ÷ 时钟频率。这个公式要背到什么程度做梦都能默写。而且要理解每一项受谁影响指令数受ISA和编译器的影响CPI受微结构流水线、Cache、分支预测的影响时钟频率受工艺和微结构深度的影响。期末题里最常见的一种考法就是“改造CPU后某个参数变化问你CPU时间变多少”本质上就是套这个公式。第二个公式是CPI的加权求和CPI Σ (指令类型比例 × 单类指令CPI)比如某程序60%是ALU指令CPI120%是LoadCPI220%是分支CPI3那么CPI 0.6×1 0.2×2 0.2×3 1.6。这类题在真题里出现频率极高难度不高但非常容易漏算比如忘了加访问存储器的额外周期或者把比例算成整数次数而不是占比。第三个公式是Amdahl定律加速比 1 ÷ [ (1 - f) f / S ]其中f是可改进部分占原执行时间的比例S是该部分改进后的加速倍数。它告诉我们一个很残酷的事实改得再快总加速比也被不可改进部分压着。f0.5时就算S→∞总加速比最多只有2倍。所以期末简答题里常考“为什么无限提高单部件速度不能让系统无限变快”答案就是Amdahl定律。下面是一道真题风格的练手题在某个程序里浮点运算占执行时间的80%。假设改进后浮点运算速度变为原来的4倍则总加速比是多少如果要求总加速比达到3倍浮点部分至少需要提升多少倍第一问Speedup 1 / (0.2 0.8/4) 1 / 0.4 2.5。第二问1 / (0.2 0.8/S) 3解得0.2 0.8/S 1/30.8/S 0.1333S 6。所以浮点部分需要提升到6倍。这题的坑就在于很多人第一问做对了第二问把f又当成0.8后就直接写“4倍不行所以需要更大”却没有定量算。考场上一定要动手算不要凭感觉。2.2 关于MIPS和MFLOPS小心被绕进去MIPS每秒百万条指令在教材里经常被拎出来批判它的前提是“指令集相同”才有比较意义不同ISA机器的MIPS数字不可比而且MIPS高不代表性能好——某一台机器可能因为执行了大量简单的无用指令而MIPS很高但实际完成任务的时间更长。MFLOPS同理浮点操作多的测试程序会虚高。期末常出简答题“为什么不用MIPS作为衡量计算机性能的唯一标准”你可以从指令集差异、指令长度差异、编译器优化差异、程序行为差异四个角度作答。这类题不复杂但答全四个点才能拿满分。另外如果学校考“对系统结构透明性”这类概念比如哪些属性对高级语言程序员可见、哪些对汇编程序员可见、哪些对系统程序员可见建议自己整理一个对照表。体系结构这门课的“可见性”问题经常以选择题或判断题形式出现属于那种平时不容易注意到、考完才觉得可惜的送分点。3. 指令集与流水线复习的重头戏3.1 RISC与CISC的对比别只背特点指令集体系结构ISA是软硬件之间的契约RISC和CISC的对比是期末的高频考点。RISC的典型特征指令格式规整通常固定长度、寻址方式少、Load/Store架构只有load和store指令能访问内存运算指令操作数来自寄存器、寄存器数量多、流水线友好。CISC则是指令很丰富、变长指令、复杂寻址典型代表是x86。但是注意现代x86处理器内部早就不直接执行x86指令了而是先翻译成类似RISC的微操作micro-ops再乱序执行这个“CISC外衣RISC内核”的设计思路是简答题常客答的时候要把“译码、翻译、调度、执行”这条链路交代清楚。如果课程用RISC-V或MIPS做例子指令格式题几乎是必考的。以RISC-V为例R型寄存器-寄存器、I型立即数、Load、S型Store、B型分支、U型LUI、AUIPC这几种格式的字段划分必须能画出来R型是opcode rd funct3 rs1 rs2 funct7I型是opcode rd funct3 rs1 imm[11:0]。考试时可能给你一条指令让你填字段或者反过来给你字段让你说是什么指令。这个没有捷径只能把格式表反复默写。MIPS的R型和I型相对更简单如果课程以MIPS为主线就把op、rs、rt、rd、shamt、funct这六个字段的位置和位宽记牢。3.2 五级流水线与三类冒险经典五级流水线取指IF、译码ID、执行EX、访存MEM、写回WB。流水线带来的性能提升约等于级数但实际远达不到就是因为冒险。三类冒险务必分清结构冒险Structural Hazard硬件资源不够引起比如同一个周期既取指又访存指令存储器和数据存储器如果是同一个就冲突。解决思路一是分开指令Cache和数据Cache二是流水线设计成访问资源时错开例如把MEM段放到后半周期WB放到前半周期。期末如果考“为什么现代处理器都有独立的I-Cache和D-Cache”答案就是消除结构冒险。数据冒险Data Hazard下一条指令用到了上一条指令还没写回的结果。RAW读后写在五级流水线中最常见比如 add r1, r2, r3 后面紧跟和r1有关的指令但r1要到WB阶段才写回。解决方法是转发forwarding/旁路bypassing把EX/MEM或者MEM/WB段的结果直接送回EX段的操作数输入端Forwarding救不了的场景例如load-use冒险lw的目标寄存器紧跟下一条指令使用目标数据要等访存结束后才有只能插入气泡stall或者靠编译器调度指令顺序。考试中有一类必考画图题给一段汇编代码画出流水线时空图标出stall和forward的位置这个必须亲手画两三遍才能真正掌握。控制冒险Control Hazard遇到分支或跳转不知道下一条取哪条指令。最简单的处理是“冻结flush”后续指令代价是分支开销等于分支延迟改进的方向是分支预测静态预测如“预测不跳转”、动态预测用分支历史记录以及分支目标缓冲BTB。动态预测的2位饱和计数器是经典内容状态机的四种状态强不跳、弱不跳、弱跳、强跳转换图要会画。课上如果讲了更高级的两级自适应预测器全局历史模式历史把“用历史信息查预测表”的基本思想答出来即可。3.3 超标量、乱序与VLIW的分寸期末如果课程覆盖面广还会考指令级并行的高级内容。超标量Superscalar指每周期发射多条指令硬件动态调度或静态调度VLIW超长指令字则把调度责任推给编译器一条很长的指令里打包多个操作硬件负责简单分发。这两者经常对比考超标量硬件复杂、对旧代码兼容好VLIW硬件简单、依赖编译器但遇到分支延迟和Cache缺失会让编译器很头疼。Tomasulo算法如果是课程重点至少要知道保留站reservation station和公共数据总线CDB各自的作用——前者用于乱序执行后者用于广播结果、解决WAR和WAW的隐患。这一块内容偏难复习时先保证前面的基础题不出错再来啃这些“区分度题”。4. 存储层次拿分性价比最高的模块4.1 从局部性到Cache映射存储层次的根基是程序的局部性原理时间局部性刚访问过的数据很快会再用和空间局部性访问一个数据后邻近的数据很可能被访问。设计Cache时用到的块行就是从空间局部性来的——一次拿一整块而不是一个字节。期末复习请把这张“层次表”刻在脑子里速度从快到慢、容量从小到大、价格从高到低依次是寄存器、L1 Cache、L2 Cache、主存、磁盘/固态盘。平均访问时间公式AMAT 命中时间 缺失率 × 缺失代价是存储层次所有计算题的总基石。多级Cache扩展版本L1缺失后去L2L2再缺失才去主存则AMAT L1命中时间 L1缺失率 × (L2命中时间 L2缺失率 × 主存代价)。这种题把各级参数代入即可注意缺失率是“本级”的缺失率别混成全局缺失率。Cache三个映射方式是必考直接映射、全相联、组相联。地址拆成三块标记Tag、索引Index、块内偏移Offset。直接映射是用Index直接决定唯一的Cache组硬件简单但冲突率高全相联是所有块随意放任何位置冲突率低但比较器成本高组相联是折中分成若干组组内多路选择。考点是给定参数算位数某Cache容量64KB块大小64B4路组相联物理地址32位则Cache共有1024个块64KB÷64B组数为2561024÷4因此Index占8位块内Offset占6位Tag占32-8-618位。做这类题最容易翻车的地方是忘记先把容量除以块大小或者把路数误当成组数去算。真题里还会反过来考已知Tag位数和容量反推相联度本质就是同一套公式倒着用。替换算法要掌握LRU最近最少使用、FIFO、随机三种并会画访问序列的替换过程。写策略是两个独立维度的组合写命中时写直达write through同步写下级存储写回write back只写Cache、标记脏位替换回写写缺失时写分配write allocate先把块从下级取到Cache再写非写分配no-write allocate直接写下级存储。这四个组合中实际常见的是“写回写分配”和“写直达非写分配”。简答题问你“为什么写直达适合没必要保留多份的场景”可以用“简化一致性”来答。4.2 虚拟存储与TLB别和Cache混为一谈虚拟存储主要靠页表把虚拟地址翻译成物理地址缺页时由操作系统负责从磁盘换入。TLB快表是页表项的Cache专门缓存最近用到的虚拟页号到物理页号的翻译关系。期末爱考的是“一张图看懂访存流程”虚拟地址先查TLBTLB命中拿到物理页号再访问CacheTLB缺失则查页表可能触发缺页异常。这里有个易错点如果Cache是物理索引物理标签那么必须等地址翻译完成才能访Cache如果是虚拟索引虚拟标签可以提前但要处理不同进程地址空间的同义词问题。这类综合题把TLB、Cache、页表串在一起建议自己去纸上画一遍完整流程图画完你就能理解为什么现代处理器都对ITLB和DTLB单独设计。Cache缺失类型也是简答题常客强制缺失第一次访问某块、容量缺失工作集超过Cache容量、冲突缺失多块映射到同一组/槽导致反复挤掉。改善方向分别对应增大块大小注意块太大可能增加强制缺失和冲突缺失这里的权衡是个很好的论述题素材、增大Cache容量成本功耗问题、提高相联度或加victim cache。如果期末出开放性设计题比如“现有一个Cache频繁冲突缺失你有哪些优化手段”可以从这几条展开再补一个“预取prefetching”和“编译器优化循环分块”。5. 并行与多核期末卷子里的“压轴题”5.1 指令级并行到线程级并行说到并行体系结构里的主线是从指令级并行ILP到数据级并行DLP再到线程级并行TLP。指令级并行我们在流水线部分已经接触了超标量、乱序执行、VLIW都是ILP手段。数据级并行的典型代表是SIMD指令一条指令同时处理多个数据例如x86的AVX、ARM的NEON。期末如果考向量机或SIMD重点在于“单指令多数据”如何提升吞吐量以及循环向量化的条件循环迭代之间没有依赖。线程级并行则是多核处理器操作系统把线程调度到不同核上硬件提供原子指令比如RISC-V的lr/sc、x86的lock前缀来支撑同步。这些概念性的题适合做选择题或简答题。并行加速比又回到Amdahl定律假设一个程序并行部分占95%串行部分占5%那么就算并行部分加速到无穷大总加速比上限 1/0.05 20倍。这个结论常用来解释“为什么程序不是核数越多越快”。与之对应的是Gustafson定律的视角随着问题规模增大可并行部分占比通常也会增大加速比可以超过Amdahl的悲观上限。两个定律放一起对比是很好的简答题素材答的时候点明“Amdahl固定问题规模Gustafson假设可扩展问题规模”即可。5.2 Cache一致性多核时代躲不开的话题多核和单核最大的区别之一多个核心同时访问共享内存每个核又都有自己的私有Cache。如果核A改了变量x等到核B读x的时候如果它还从自己的Cache里读到旧值程序就崩了。Cache一致性协议解决的就是这件事。MESI协议是必考四种状态分别代表Cache行处于Modified改过但没写回主存、Exclusive只在本Cache且和主存一致、Shared多份拷贝且一致、Invalid无效。状态转换图是期末高频画图题需要按“本地读、本地写、远端读、远端写”四个触发事件把状态迁移记住。总线嗅探bus snooping是保证一致性的基本手段每个核都监听总线上的读写事务发现别人要读自己刚改过的行就让它失效或者把改过的数据写出去。另一个高频考点是false sharing伪共享两个线程分别访问同一Cache行的不同变量虽然访问的变量不同但因为落在同一个Cache行里一方的写操作会让另一方所在核心的整个Cache行失效造成性能雪崩。考试常以一个多线程程序性能问题为背景问你为什么线程数增加性能反而下降答案线索就是伪共享。如果考到存储一致性模型memory consistency model需要区分它和Cache一致性的不同Cache一致性管的是“同一个地址的值在所有Cache里看起来一致”存储一致性管的是“不同地址的读写操作在多个线程看来应该以什么顺序发生”顺序一致性是最直观但最严格的模型弱一致性则允许程序员用显式同步来约束顺序。5.3 Roofline模型和DSA给“区分度题”留一手如果课程偏现代很多研究生课和国科大体系的课程都这样还会涉及Roofline模型和领域专用架构。Roofline模型很简单横轴是计算强度每字节数据上的操作数纵轴是可达性能模型由一条斜线带宽限制区和一条水平线计算上限限制区组成。判断一个程序是存储密集型还是计算密集型就看计算强度是否超过转折点。转折点 峰值计算性能 ÷ 峰值内存带宽。复习时不必深入推导但理解这个模型能帮你回答“如何评估一个加速器设计”这类开放性题。DSA则是近年来体系结构最热门的方向之一从GPU到TPU本质是“为特定工作负载设计的专用架构”。如果期末有论述题问“通用处理器会不会被专用架构取代”可以从能效、成本、软件生态、可编程性几个角度去谈这些内容老师通常会在最后一两节课讲过属于“听过就有分”的题。6. 复习方法、常见题型与避坑心得6.1 一张“期末复习进度表”直接抄我建议按三周到四周的节奏倒排复习具体可以这样分第一周把性能分析模块全部过一遍把公式推导和课后第一章计算题做熟同时每天花半小时背指令格式表把RISC-V/MIPS的字段划分磨到能默写。第二周主攻流水线先看教材的冒险消除例子再挑课后题里至少三道画时空图的题亲手从头画到尾画完对照答案改接着开始刷Cache相关的计算题从地址划分到AMAT层层推进。第三周把并行处理的概念题整理成笔记把MESI状态转换图默写三遍以上然后集中做2到3套真题或模拟题严格按考试时间掐表。最后留两天查漏补缺重点关注错题本里反复犯的错误。这套节奏适合绝大多数同学。如果你是考前一周才开始也不用慌优先级调整为先把Amdahl、CPI、AMAT三个公式背熟然后背Cache地址划分步骤和三类冒险的解决办法接着背MESI四状态转换最后一晚扫一遍概念题。至少保住卷面60%的基础分。6.2 高频题型与答题模板这里整理一个“题型-方法-易错点”速查表做题前先扫一眼这个表能帮你避开最常见的雷区题型解题方法易错点性能加速比套Amdahl公式先找清f和Sf用错要用占总时间的比例不是代码量比例CPI加权比例×周期求和忘了算停顿周期带来的额外CPI流水线时空图按周期逐条推进标stall/forward漏画load-use的1个气泡Cache地址划分先算块数、组数再定Index和Offset位数用路数除以容量导致组数算错Cache缺失率/AMAT代入各级参数注意缺失率是本级的把L2缺失代价直接当主存代价替换算法过程按访问序列模拟LRU/FIFO被填充初始行和已有行搞混MESI状态转换按本地/远端读/写四类事件推演忽略“远端读Modified行”时还会写回总线多核加速比用Amdahl串行比例是瓶颈把“并行核数”直接乘进串行部分答题时有一个通用模板可以保底简答题先给定义再给原因最后给例子或代价分析。例如问“为什么要对Cache索引使用物理地址而不是虚拟地址”可以先说物理索引/物理标签不会产生同义词问题再说但会有地址翻译延迟所以很多处理器采用虚拟索引物理标签作为折中。这种“定义-原因-代价”的三段式回答哪怕细节不完美至少结构是完整的阅卷人不会扣分扣得太狠。6.3 那些年我在复习和考试中踩过的坑最后说几个只有真正做错过的同学才知道的痛点。第一个坑是Amdahl定律里的f考试时我见过太多人把“代码中浮点指令条数占比”当成f来用但Amdahl定律里的f必须是执行时间占比如果题目给的是指令数占比还得先按CPI加权换算成时间占比。这种题就是把性能公式和Amdahl定律联合起来考属于典型的“看起来简单实际上在挖坑”。第二个坑是Cache地址计算时忽略字节寻址题目说地址32位通常指字节地址偏移量算的是块内字节数如果块大小是64B偏移位数就是log2(64)6而不是64。第三个坑是MESI的“远端读”触发的总线事务对方的Modified行会把数据写到总线上让请求方拿到最新值自己变成Shared如果只记住失效而忘了写回状态图就画错了。我还想强调一点考前一定要亲手画至少一道完整的流水线时空图。很多同学看着例题觉得“这有什么难的”一上考场手就抖画着画着就乱了。画图题是体系结构试卷里区分度最高的一类因为它同时考你对冒险检测、停顿位置、转发路径三个知识的掌握而这些东西只看不练是绝对练不出的。我自己当年就是考前刷了五道图题考试时那道“带转发和不带转发的对比图”才能稳稳拿下。说句实在话计算机体系结构这门课复习到最后你会发现它不是在考“背了多少”而是在考“能不能在约束条件下做出好的设计决策”。性能公式给你的是权衡的刻度尺流水线给你的是权衡的显微镜Cache和多核给你的是权衡的战场。别怕踩坑现在踩过的坑都是考场上替你挡分的朋友。