资讯动态

计算机体系结构期末复习:流水线、Cache与多处理器核心考点

发布时间:2026/10/1 18:22:30 来源:尧图企业网站定制
期末复习这东西最怕的就是“书翻了一遍脑子里啥也没留下”。尤其是计算机体系结构/计算机系统结构这门课它不像操作系统那样有一堆明确的机制可以背也不像组成原理那样偏硬件细节它卡在中间——既要你理解硬件怎么设计又要你懂软件怎么配合最后还得能算一堆性能指标。我当年复习的时候也是被折磨得不行后来重新梳理了知识框架才发现这门课的核心逻辑其实很清晰它就是在讲“怎么让计算机跑得更快”所有章节都是围绕这个目标展开的。这篇复习笔记是我结合教材胡伟武《计算机体系结构教学与习题指导》第2版和课程重点整理的目前还在持续更新中。内容覆盖了指令系统、流水线、存储层次、多处理器这些核心模块每一部分都尽量用“人话”把原理讲清楚再配上典型例题和易错点。不管你是刚开始复习第一遍还是考前冲刺查漏补缺这篇文章的梳理思路都值得你花半小时过一遍至少能帮你把知识脉络理清楚知道哪些是必考点、哪些地方容易踩坑。1. 这门课到底在考什么先建立全局认知1.1 别急着背概念先搞懂学科主线我见过太多同学复习计算机体系结构上来就抱着课本从第一章背到最后一章结果背到存储系统的时候前面指令流水线已经忘干净了。这门课的知识点之间是有强逻辑关联的你需要先建立一个整体框架。计算机体系结构这门课核心研究的问题其实只有一个如何让计算机系统运行得更快、更高效。围绕这个核心整个学科分成了几条主线指令系统设计软件和硬件的接口也是计算机体系结构的“起点”。指令集是精简好还是复杂好寻址方式有哪些寄存器够不够用这些都是从这里展开的。流水线技术第一条主线“加快单条指令执行”的延伸。既然一条指令执行需要多个阶段那就让这些阶段重叠起来像工厂流水线一样。这是提升CPU吞吐率最核心的手段。存储层次结构CPU跑得再快如果内存跟不上也是白搭。Cache、主存、虚拟存储这一整套金字塔结构就是用“局部性原理”来弥合CPU和内存之间的速度鸿沟。多处理器与并行计算单核频率已经到瓶颈了那就堆多核。于是有了多核架构、一致性协议、互联网络这些内容。这四条主线不是孤立的它们之间有天然的递进关系指令集定义好了才能设计流水线流水线跑起来了才发现存储是瓶颈存储优化到极致又发现单核性能到头了于是走向多核。1.2 体系结构和组成原理的区别别搞混了很多同学会把“计算机体系结构”和“计算机组成原理”当成同一门课但其实它们侧重点不同。我复习的时候踩过这个坑一开始按照组成原理的套路去复习体系结构结果发现很多地方对不上。简单来说计算机组成原理讲的是“硬件是怎么做出来的”——比如ALU怎么实现加法、寄存器堆怎么读写、总线的时序怎么控制。它是偏向数字电路层面的。计算机体系结构讲的是“硬件和软件怎么配合”——比如指令集怎么设计才能让编译器好生成代码Cache的块大小取多少才能让命中率最高多核之间怎么通信才能减少延迟。打个不太恰当的比方组成原理是在看“一栋楼的钢筋混凝土结构”体系结构是在看“这栋楼的户型设计和房间功能分区”。后者关心的是“住得舒不舒服、动线合不合理”而不是“墙里埋的什么型号的钢筋”。搞清楚这个区别你的复习重心就不会跑偏这门课的重点是量化分析、权衡取舍而不是背门电路和时序图。1.3 我整理的复习主线和时间分配建议如果你还剩两周左右的复习时间我建议你把精力按照下面这个比例来分配指令系统与流水线占比大约35%。这是这门课的地基考计算题的概率极高比如计算流水线加速比、CPI等需要重点掌握。存储层次与Cache占比约30%。Cache的映射方式、命中率计算、平均访问时间计算都是高频考点。多处理器与并行体系结构占比约20%。重点在于理解并行度来源、一致性协议的基本思想以及性能评价方法如Amdahl定律。性能评价与量化分析占比约15%。Amdahl定律、CPU性能公式、MIPS/MFLOPS等这些是贯穿全课程的计算工具会渗透到上述所有章节中。我的建议是先花两天时间过一遍“性能评价”和“指令系统”的基础概念然后用一周时间主攻流水线和存储层次这两座大山最后留三天做真题、查漏补缺。不要一开始就钻进多处理器的细节里那里内容多且杂性价比不高。2. 必考核心模块一指令系统与流水线深挖2.1 指令系统设计——RISC和CISC之争到底在争什么指令系统是计算机体系结构里最“根正苗红”的内容。它回答的问题是CPU到底要提供哪些指令给程序员和编译器使用复习这一章的时候最关键的是理解RISC和CISC的设计哲学差异而不是死记它们各自的特点列表。CISC复杂指令集计算机的思路是“指令功能越强越好”。一条指令最好能完成一个复杂操作比如“从内存取一个数和一个寄存器相加再存回内存同时更新标志位”。这样汇编程序员写起来很舒服一条指令顶好几条。但问题在于指令越复杂硬件实现就越难而且很多复杂指令实际使用频率很低属于“花了大量晶体管做出来一年也用不了几次”的浪费。RISC精简指令集计算机的思路反过来“指令功能越简单越好”。所有指令都是定长的格式规整寻址方式很少大部分指令在单周期内就能完成。看起来每条指令能干的事情变少了但好处是硬件设计简单、主频可以做得更高而且编译器可以通过指令调度来优化执行顺序。IBM 801、Stanford MIPS、Berkeley RISC这些经典项目都是走这条路线的。复习RISC的几个核心特征我建议你这样记忆指令格式规整长度固定方便流水线取指和译码不需要复杂的变长指令解析逻辑。只有Load/Store指令访问内存其它指令都是寄存器到寄存器的运算。这个特征极其重要它为后面流水线设计扫清了障碍。寄存器数量多编译器有更大的调度空间可以减少访存次数。指令功能简单便于用硬件直接实现不需要微程序控制。这里有一个常见的考点陷阱为何说RISC更适合流水线关键就在于“Load/Store架构”和“指令格式规整”。如果一条指令既能访存又能运算那它在流水线里既要用ALU又要访存很容易造成结构冲突而把访存和运算分开流水线每个阶段的功能就清晰多了。2.2 流水线基础——吞吐率的数学原理流水线的思想特别好理解洗菜、切菜、炒菜这三件事如果串行做做三顿饭要花三份总时间但如果一个人负责洗菜、一个人切菜、一个人炒菜三个人同时开工第二顿饭的洗菜可以和第一顿饭的炒菜同时进行效率自然就上去了。计算机的指令执行也可以分成取指IF、译码ID、执行EX、访存MEM、写回WB这几个阶段。如果把每个阶段看作一个独立的硬件模块让指令像流水一样依次流过这几个阶段那么理论上每个时钟周期都能完成一条指令CPU的吞吐率就能最大化。复习到这里有两个公式是你无论如何都要掌握的吞吐率Throughput 单位时间内完成的指令数。 对于k级流水线如果每级耗时相同且没有阻塞理想吞吐率就是每周期1条指令。加速比Speedup 非流水线执行时间 / 流水线执行时间。以经典的五级流水线为例如果一条指令的指令周期是T由5个等长的级组成非流水线完成n条指令需要 5nT而流水线完成n条指令需要 (5n-1)T。当n足够大时加速比趋近于5。我复习的时候算过一个具体例子假设每条指令在非流水线CPU上需要10ns在五级流水线上每级需要2ns连续执行1000条指令非流水线时间 1000 × 10ns 10000ns流水线时间 5 1000 - 1× 2ns 2008ns加速比 ≈ 10000 / 2008 ≈ 4.98这个数字说明流水线不能无限提升性能还要受限于流水线级数和指令条数。当你算出来的加速比不是整数5时不要惊讶这是正常的因为流水线有建立时间和排空时间。2.3 流水线冒险——三大冲突及其解决方案流水线真正的难点不是懂原理而是处理“冒险”Hazard。所谓冒险就是流水线中后面指令需要依赖前面指令的结果但前面指令的结果还没算出来导致流水线不得不阻塞。三大冒险分别是结构冒险结构冲突、数据冒险数据冲突、控制冒险控制冲突。结构冒险是指两条指令同时需要访问同一个硬件资源。比如如果指令存储器和数据存储器是同一个那么取指阶段和访存阶段就不能同时进行。解决办法很简单分开指令Cache和数据Cache或者让访存阶段和取指阶段错开。这个知识点考概念题的概率很高选择题喜欢问“以下哪个属于结构冒险的解决方案”。数据冒险是指后续指令需要用到前面指令的计算结果前面指令还在执行中。比如ADD R1, R2, R3 ; R1 R2 R3 SUB R4, R1, R5 ; 需要R1的值如果不加处理SUB指令在译码阶段读寄存器时ADD指令还没到写回阶段R1还是旧值。解决方案有三种插入气泡Stall让SUB指令等几个周期代价是性能损失。数据转发Forwarding/Bypassing在ADD指令计算出结果后直接把结果通过旁路送到SUB指令的执行阶段不用等写回。这是考试重点要能画出转发路径。编译器调度Compile-time Scheduling调整指令顺序把不相关的指令插入到两条有依赖的指令之间。控制冒险是分支指令带来的问题。当遇到分支指令时流水线不知道该取哪条指令——是顺序下一条还是跳转目标处理办法有冻结流水线等到分支结果出来再取指简单但慢。预测分支Branch Prediction预测跳转或顺序执行猜对了就无损失猜错了需要冲刷流水线。延迟分支Delayed Branch把分支指令后面的一条指令放到“延迟槽”里无论跳转与否都会执行相当于用指令调度的方式掩盖跳转延迟。MIPS的延迟分支是经典考点因为它体现了RISC设计里“软件和硬件协同”的思想——让编译器来填这个延迟槽而不是靠硬件硬扛。2.4 实战计算题CPI和流水线性能分析考试里最常见的类型是给出一段指令序列让你计算在某种流水线下的总周期数或CPI。这类题目看起来复杂其实只要掌握方法就能稳定拿分。我给你一个实用的解题模板先画出指令序号和它们的依赖关系标出哪些指令之间存在数据依赖、哪些是分支指令。然后判断需要插入多少个气泡或者能否转发。最后逐一统计总周期数。我复习时做过一道非常典型的题目分享给你。假设一个五级流水线采用数据转发机制执行如下指令序列I1: LOAD R1, 0(R2) ; 从内存取数到R1 I2: ADD R3, R1, R4 ; 需要R1 I3: SUB R5, R1, R6 ; 需要R1 I4: OR R7, R3, R8 ; 需要R3第一步分析I1的Load结果在MEM阶段结束时才拿到I2在EX阶段需要用到R1所以I2必须等到I1的MEM阶段完成这中间没法通过转发解决因为地址还没取回来必须插入1个气泡。I3同样需要R1但它比I2晚一条等I2执行时I3还在译码等I1的MEM阶段完成时I3刚好处于EX阶段可以通过转发拿到R1。I4需要I2的R3结果I2的EX阶段完成就可以转发给I4不需要阻塞。总周期数算下来理想情况是5 4 - 1 8周期但因为I2需要等待1个周期所以总共是9个周期。这种题目关键就是画一个流水线时空图把每条指令在每个周期处于什么阶段填进去一眼就能看出谁在等谁。3. 必考核心模块二存储层次结构与Cache3.1 局部性原理——整套存储体系的理论基石你可能会问为什么存储系统要设计成Cache、主存、磁盘这么复杂的层次直接做一块又大又快的存储器不行吗答案是不行因为成本和工艺有限制。而局部性原理正是这套层级设计的“物理学基础”。局部性原理分两种时间局部性如果一个数据被访问了那么它在不久的将来很可能再次被访问。典型例子是循环体中的变量和循环计数器它们在一小段时间内被反复使用。空间局部性如果一个数据被访问了那么它附近的地址也很快会被访问。典型例子是数组遍历访问了a[0]之后马上就会访问a[1]、a[2]。Cache利用这两个特性把最近最可能用到的数据放在离CPU更近的高速存储器里从而让CPU大多数时候都不需要等待慢速主存。这是整个存储层次设计的核心思想。复习局部性原理时我建议你去分析一段简单的程序比如嵌套循环访问二维数组。如果按行优先存放但按列优先遍历Cache命中率会急剧下降因为每次访问都需要加载一个新Cache行空间局部性被完全破坏了。这种题在考试中常以“分析以下程序的Cache性能”的形式出现。3.2 Cache映射方式——直接映射、全相联、组相联Cache的映射方式决定了主存中某个数据块可以放到Cache的哪些位置。三种方式各有优劣是考试必考的概念题。直接映射每个主存块只能映射到Cache的固定行。类似给每个学生分配固定座位简单快速但灵活性差。如果两个经常访问的块映射到同一行就会频繁冲突命中率下降。全相联每个主存块可以放到Cache的任意一行。类似自由座位灵活性最好、命中率最高但查找时需要并行比较所有行硬件代价很大只适合容量很小的Cache比如TLB。组相联折中方案把Cache分成若干组主存块可以放到指定组内的任意一行。比如“两路组相联”就是每组有两个位置可选。这是现代处理器最常用的方案。考试中经常让你算给定主存容量、Cache容量、块大小以及某种映射方式要求计算“Tag、Index、Offset”三个字段的位数。我来演示一个典型计算题。假设主存容量4GB即2^32字节Cache容量64KB即2^16字节块大小32字节即2^5字节采用四路组相联映射计算过程块内偏移Offset log2(块大小) 5位Cache行数 Cache容量 / 块大小 2^16 / 2^5 2^11行组数 行数 / 每组路数 2^11 / 4 2^9组组索引Index log2(组数) 9位Tag位数 地址总位数 - Index位数 - Offset位数 32 - 9 - 5 18位三者的关系可以写成地址 Tag | Index | Offset。每次访问时CPU先根据Index找到对应的组然后用Tag和组内每一行的Tag并行比较匹配成功且有效位为1就命中。这个计算流程特别容易出错的地方是忘记“行数除以路数得到组数”很多人直接拿Cache行数去算Index位数导致Index多算2位、Tag少算2位。我当年考试就在这里丢过分希望你别踩。3.3 Cache替换策略和写策略组相联Cache的组内位置不够用时就要替换。常用策略有这么几种LRU最近最少使用替换最长时间没有被访问的行。实现需要维护访问信息硬件成本较高但命中率好。FIFO先进先出替换最早进入的行。实现简单但可能把刚被频繁访问的块换出去。随机替换随机选取一行替换实现最简单性能也不算太差。写策略则分成两大类写直达Write Through写Cache的同时也写主存。实现简单数据一致性好但访存次数多、速度慢。写回Write Back只写Cache并用脏位Dirty Bit标记该行被修改过等该行被替换出去时才写回主存。速度快但实现复杂需要处理一致性问题。复习到这里我强烈建议你去研究一下这两个概念和Cache命中率的关系。考试常见的坑点是如果题目没有明确说明是写分配还是写不分配你就要根据写直达/写回策略去判断。写直达通常配合写不分配写回通常配合写分配这个对应关系要记牢。3.4 平均访存时间公式——必拿分的关键Cache部分的计算题基本上是围绕平均访存时间AMAT展开的。核心公式是平均访存时间 命中时间 缺失率 × 缺失代价这个公式看着简单但做题时容易忽略“缺失率”和“缺失代价”的单位换算。我举一个二级Cache的计算题例子。假设L1 Cache命中时间为1个时钟周期缺失率为5%L2 Cache命中时间为10个时钟周期缺失率为20%主存访问时间为100个时钟周期计算平均访存时间先算L2的缺失代价由于L2缺失后需要访问主存因此L2的缺失代价是100周期。L2的平均访存时间 L2命中时间 L2缺失率 × L2缺失代价 10 20% × 100 30周期。L1的缺失代价就等于L2的平均访存时间30周期因为L1缺失后要访问L2。所以L1的平均访存时间 L1命中时间 L1缺失率 × L1缺失代价 1 5% × 30 2.5周期。这个题的关键是“嵌套关系”的理解上一级Cache的缺失代价就是下一级Cache的平均访存时间。很多人算出L2的缺失代价后忘了代入L1的公式导致结果差了十万八千里。做题时还要注意缺失率是以“指令数”还是“访存次数”为单位统计的因为不是每条指令都访存。如果题目说“Load/Store指令占20%其中L1缺失率5%”那你计算时需要区分是“所有指令的缺失率”还是“仅访存指令的缺失率”。这个细节考得很频繁建议复习时多做几道变式题。4. 必考核心模块三多处理器与并行体系结构4.1 并行度从哪来——从指令级并行到线程级并行多处理器是课程后半部分的重点。平行世界的核心思路是既然单核频率上不去了那就多放几个核让多个程序或一个程序的多个线程同时跑。并行度有三个层次指令级并行ILP在单核内同时执行多条指令靠流水线、超标量、乱序执行等技术实现。ILP的上限有限一般就几级到几十级。线程级并行TLP多个线程同时执行。可以是在多核上真正并行执行也可以是在单核上时分复用。数据级并行DLP对大规模数据同时执行相同操作典型代表是SIMD指令集和GPU。考试中常考的是Amdahl定律它描述了“只能并行一部分”的情况下并行化带来的加速比上限加速比 1 / [(1 - P) P / N]其中P是可并行部分的比例N是处理器数量。举个例子假设一个程序有70%的部分可以并行化P 0.7使用4个处理器N 4那么加速比 1 / [(1 - 0.7) 0.7/4] 1 / (0.3 0.175) 1 / 0.475 ≈ 2.105注意即使处理器数量趋向无穷大加速比也不会超过1 / (1 - P) 1 / 0.3 ≈ 3.33。这就是Amdahl定律的“残酷”之处串行部分成了瓶颈。所以我复习时常用它来“劝退”那些以为加核心就能无限加速的想法。4.2 多核Cache一致性——MESI协议的核心逻辑多核处理器出现了一个单核时代不存在的问题每个核有自己的L1 Cache同一个内存地址的数据可能被多个核缓存如果其中一个核改了数据其他核的缓存就成了“脏数据”。这就是Cache一致性问题。为了解决这个问题业界提出了MESI协议它把Cache行的状态分成四种MModified已修改该行数据被当前核修改过和主存不一致且只有当前核有这份数据的副本。EExclusive独占当前核独享该行数据和主存一致其他核没有副本。SShared共享多个核都有该行数据的副本且所有副本都和主存一致。IInvalid无效该行数据不可用访问时发生缺失。MESI协议的核心是“监听总线”每个核都在监听其他核的总线操作。比如当核0要写一个处于S状态的行时它会发送一个“写失效”广播通知其他核把对应的副本置为I状态然后自己把状态从S改为M。考试中经常让你分析一个多核场景下某一时刻某个Cache行的状态变化。我的记忆技巧是数据被“读”时要么变成E如果其他核都没有要么变成S如果其他核也有。数据被“写”时该核的Cache行变成M其他核的Cache行变成I。一个经典例题两个核P0和P1初始时主存地址A的数据都在Cache中且都是I状态。P0读AP1读A然后P0写A问P0和P1中A行的状态分别是什么。分析过程P0读AP0发出读请求其他核没有副本所以P0的A行变为E。P1读AP1发出读请求P0监听到后把自己改为SP1的副本也是S。此时两个核都是S。P0写AP0发出写失效广播P1监听到后把自己的A行置为IP0的A行变为M。最终结果P0是MP1是I。这个分析和期末考试题型非常贴合建议亲手推导一遍。4.3 互连网络与并行性能评价多核处理器里核与核之间怎么通信取决于互连网络的设计。常见的有总线、交叉开关、网格等。对这些内容复习重点是理解它们的带宽和延迟特征。总线结构共享串行、便宜但带宽受限交叉开关灵活但硬件成本高网格结构适合大规模并行机但多跳延迟是问题。在这部分你还需要掌握几个性能评价指标并行加速比同Amdahl定律中定义理解串行部分如何限制并行收益。并行效率加速比除以处理器数衡量每个处理器被利用的程度。4核加速比3.2时效率为0.8。可扩展性系统性能是否随处理器数量增加而线性增长。复习时我最推荐的思路是拿一款真实处理器做案例比如用Intel的消费级CPU多核多线程和NVIDIA的GPU对比分析它们的并行度来源、缓存层级设计和访存模型差异。通过真实案例把抽象概念串起来比死记定义要高效得多。5. 常见问题与考场实战经验5.1 我踩过的坑计算题失分点top3复习这门课最令人沮丧的不是不会做而是会做却算错。我把自己踩过的坑和你分享一下希望能帮你避雷。第一是单位不统一。平均访存时间的计算里缺失代价有时以“周期”为单位有时以“纳秒”为单位。做题时如果没统一单位算出来的结果会差出一个数量级。我的习惯是拿到题目先看所有时间单位全部统一后再代入公式。比如1GHz的CPU1周期1ns缺失代价100周期100ns这样才敢放心算。第二是分不清“指令缺失率”和“访存缺失率”。Cache缺失率通常是指“访存次数中缺失的比例”但有些题目会直接给“指令的缺失率”。碰到这种情况要看清楚题目给的程序里访存指令占比换算成每指令缺失率才能进行计算。第三是流水线的“建立时间和排空时间”漏算。非流水线执行n条指令总时间是n×每条指令时间流水线执行n条指令k级总时间是(kn-1)×每级时间。很多人会写成k×n×每级时间这就不对了。5.2 概念题的快速记忆方法概念题虽然不如计算题分值高但胜在容易得分。我是用了“连词记忆法”来搞定那些容易混淆的概念RISC和CISC看到“Load/Store”就想RISC看到“微程序”就想CISC。三种冒险看到“同抢一个部件”想结构冒险看到“数据依赖”想数据冒险看到“分支跳转”想控制冒险。三种映射看到“一对一”想直接映射看到“一对多”想组相联看到“多对多”想全相联。两种写策略“写直达”想“内存实时更新”“写回”想“脏位延迟更新”。当你把概念用“关键词触发器”组织起来考试时看到题干的特征词就能快速锁定答案不需要在多个选项之间犹豫。5.3 考前24小时该怎么用最后一天不适合再学新知识了适合做三件事第一把老师课件里的例题重新做一遍。每个学校的期末出题风格都相对稳定老师的例题往往就是考点的浓缩版。我复习时发现期末考试里至少有30%的题能在平时作业和课件例题里找到“原型”。第二把之前做错的题拿出来看一遍错因。这个概念说起来轻松但真正做到的人不多。你会发现錯题集中在你对公式条件理解不清晰的地方比如什么时候该用组数算Index什么时候该用行数算。把这些条件重新默写一遍比做十道新题还有用。第三根据自己学校老师的出题风格预测你可能遇到的题型。如果老师喜欢出综合分析大题那你考前可以重点过一遍“一套完整计算流程”——比如给出程序片段、Cache参数、流水线配置然后让你算总执行时间。这种融合了流水线和Cache的题是最常见的压轴大题。5.4 更新中的复习资料库怎么用最有效因为这篇文章目前还标着“更新中”我最后再说说如何利用这种持续更新的复习笔记。不要把它当一本完整的书来背。它目前的定位是“知识骨架核心例题解析”更适合你完成第一遍课本阅读后用它来检验自己是否掌握了核心概念。每一章后面的计算题我都建议你盖上答案先手算一遍再对照步骤检查。后续我会继续补充的内容包括更多院校的真题解析尤其是hnu和国科大计算机体系结构课程的期末题型、胡伟武教材课后习题的重点题精讲以及一些易混淆概念的专题辨析比如超标量和超长指令字的区别、一致性和连贯性的区别。如果你在复习过程中遇到了不懂的题目欢迎在评论区留言我会挑典型问题补充到笔记里来。我个人体会是计算机体系结构这门课本质上训练的是“量化思维”——不凭感觉说哪个方案好而是用公式算出来到底快了多少。掌握这种思维方式的标志就是当你看到“计算机系统结构”这个词时脑子里浮现的不再是一堆名词解释而是一条清晰的决策链从指令集设计到流水线优化从存储分层到多核并行每一步都在做同一件事——榨干每一分硬件性能。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑