☰
计算机体系结构期末复习指南:从性能公式到并行计算的核心考点
2026/10/1 4:15:20 网站建设 项目流程

每到期末,计算机体系结构(很多学校叫计算机系统结构)这门课,总能精准地让一批人开始怀疑人生。平时听课觉得“不就是讲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指令(CPI=1),20%是Load(CPI=2),20%是分支(CPI=3),那么CPI = 0.6×1 + 0.2×2 + 0.2×3 = 1.6。这类题在真题里出现频率极高,难度不高但非常容易漏算,比如忘了加访问存储器的额外周期,或者把比例算成整数次数而不是占比。

第三个公式是Amdahl定律:

加速比 = 1 ÷ [ (1 - f) + f / S ]

其中f是可改进部分占原执行时间的比例,S是该部分改进后的加速倍数。它告诉我们一个很残酷的事实:改得再快,总加速比也被不可改进部分压着。f=0.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/3,0.8/S = 0.1333,S = 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 + funct7;I型是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缺失后去L2,L2再缺失才去主存,则AMAT = L1命中时间 + L1缺失率 × (L2命中时间 + L2缺失率 × 主存代价)。这种题把各级参数代入即可,注意缺失率是“本级”的缺失率,别混成全局缺失率。

Cache三个映射方式是必考:直接映射、全相联、组相联。地址拆成三块:标记(Tag)、索引(Index)、块内偏移(Offset)。直接映射是用Index直接决定唯一的Cache组,硬件简单但冲突率高;全相联是所有块随意放任何位置,冲突率低但比较器成本高;组相联是折中:分成若干组,组内多路选择。考点是给定参数算位数:某Cache容量64KB,块大小64B,4路组相联,物理地址32位,则Cache共有1024个块(=64KB÷64B),组数为256(=1024÷4),因此Index占8位,块内Offset占6位,Tag占32-8-6=18位。做这类题最容易翻车的地方是忘记先把容量除以块大小,或者把路数误当成组数去算。真题里还会反过来考:已知Tag位数和容量,反推相联度,本质就是同一套公式倒着用。

替换算法要掌握LRU(最近最少使用)、FIFO、随机三种,并会画访问序列的替换过程。写策略是两个独立维度的组合:写命中时,写直达(write through)同步写下级存储,写回(write back)只写Cache、标记脏位,替换回写;写缺失时,写分配(write allocate)先把块从下级取到Cache再写,非写分配(no-write allocate)直接写下级存储。这四个组合中,实际常见的是“写回+写分配”和“写直达+非写分配”。简答题问你“为什么写直达适合没必要保留多份的场景”,可以用“简化一致性”来答。

4.2 虚拟存储与TLB,别和Cache混为一谈

虚拟存储主要靠页表把虚拟地址翻译成物理地址,缺页时由操作系统负责从磁盘换入。TLB(快表)是页表项的Cache,专门缓存最近用到的虚拟页号到物理页号的翻译关系。期末爱考的是“一张图看懂访存流程”:虚拟地址先查TLB,TLB命中拿到物理页号,再访问Cache;TLB缺失则查页表,可能触发缺页异常。这里有个易错点:如果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和多核给你的是权衡的战场。别怕踩坑,现在踩过的坑,都是考场上替你挡分的朋友。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询