☰
计算机组成与体系结构期末复习指南:从补码到流水线的核心考点与避坑
2026/10/21 16:38:53 网站建设 项目流程

简介:这份《西安电子科技大学-计算机组成与体系结构-期末总结》PDF,面向正在备考该课程的本科生与考研复习者,帮助梳理课程核心考点、建立章节知识框架。内容覆盖计算机系统分类、冯·诺依曼结构、软硬件分类与逻辑等价性、七层层次结构、体系结构定义、Amdahl定律及机器字长、MIPS等主要技术指标,并延伸至定点与浮点表示、原码补码反码移码等数据表示重点,适合期末冲刺与知识点查漏补缺。资源包共1个PDF文件,约6.2MB,单文件结构便于通读与打印。目前已有2165人学习下载,说明其内容对课程复习具有一定参考价值。读者可借此快速回顾各章要点,对照课堂笔记整理出题方向,尤其适合需要系统串联硬件结构与数据表示、在有限时间内完成多轮复习的学生使用。

1. 从一份期末总结PDF说起:计算机组成与体系结构到底该复习什么

每年期末前,总有人把整本教材翻了三遍,结果拿到卷子还是懵——因为计算机组成与体系结构这门课,知识点不是线性的,而是层层嵌套的。你背了Cache映射方式,却不知道它和主存地址划分怎么联动;你记住了流水线五级结构,却算不对数据冒险需要插入几个气泡。这份“期末总结.pdf”之所以被反复传阅,核心价值不在于它覆盖了多少页,而在于它把散落在各章的硬件逻辑串成了一条线:数据通路怎么走、控制器怎么发信号、存储层次怎么兜底、I/O怎么收尾。适合正在备考的本科生,也适合工作后想回头补体系结构底子的开发者。接下来我不复述PDF内容,而是按我自己的复习路径,把每个模块拆成能动手推演、能自检对错的步骤。

2. 数据表示与运算:从补码到浮点数的三个必算环节

2.1 为什么补码能统一加减法:从模运算推一遍

很多人背了“正数原码不变,负数取反加一”就上考场,遇到溢出判断又卡住。根子在于没理解补码本质是模运算。以8位为例,模是 (2^8=256)。一个负数 (-x) 的补码就是 (256 - x)。比如 (-3) 的补码是 (253),二进制 (11111101)。这样 (5 + (-3)) 就变成 (5 + 253 = 258),超过256自动丢弃,得到 (2),结果正确。

这个推导直接决定了溢出判断规则:两个同号数相加,结果符号变了就是溢出。因为模运算下,正+正如果超过最大值,会“绕回”负数区间。考试里常考的是给你两个补码数,让你判断是否溢出并说明原因。我一般会让学生先算十进制真值,再看是否超出 ([-128, 127]),最后用二进制验证符号位。

注意:溢出和进位是两回事。进位是最高位向更高位的 carry,溢出是符号位逻辑错误。选择题里经常把这两个混在一起考。

2.2 IEEE 754单精度浮点数:手算转换的固定流程

浮点数是期末必考大题,通常要求把十进制小数转成32位IEEE 754格式,或者反过来。我总结了一个五步法,每次按顺序做就不会乱:

第一步,把十进制数写成二进制科学计数法,比如 (12.375 = 1100.011 \times 2^0),再规格化为 (1.100011 \times 2^3)。 第二步,提取符号位:正数为0,负数为1。 第三步,计算阶码:指数 (3) 加上偏置值 (127),得到 (130),转成8位二进制 (10000010)。 第四步,提取尾数:规格化后小数点后的 (100011),补零到23位。 第五步,拼接:符号位 + 阶码 + 尾数。

反过来,给一个32位十六进制,先拆三段,阶码减127得真实指数,尾数前补1,再移位。这里最常见的坑是忘记隐藏的整数位1,以及阶码全0和全1的特殊情况(非规格化数、无穷大、NaN)。期末通常不考特殊值,但选择题会问“阶码为0时表示什么”,答案是非规格化数,此时尾数不补1。

2.3 定点乘法与除法:用Booth算法和恢复余数法手推

Booth算法是补码乘法的标准考点。它的核心是看乘数最低位和附加位的变化:00或11不变,01加被乘数,10减被乘数,然后算术右移。我建议考试时直接列部分积表格,每一步写清楚操作和移位后的结果。比如计算 ((-3) \times 5),先转成补码,被乘数 (-3) 的8位补码是 (11111101),乘数 (5) 是 (00000101),附加位初始0。按Booth规则走8轮,最后取高8位和低8位拼接。

除法用恢复余数法更直观:每次试减被除数,如果余数为负就恢复并商0,否则商1。手算时注意余数左移时补0,以及最后余数的符号修正。这部分期末通常给6到8分,步骤分很重,哪怕结果算错,过程对也能拿大半。

3. 存储层次:Cache映射、替换与写策略的完整推演

3.1 直接映射Cache:地址划分与命中判断

直接映射是最常考的结构。假设Cache有16行,每行32字节,主存地址32位。那么块内偏移占5位((2^5=32)),行号占4位((2^4=16)),剩下的23位是标记。给你一个地址 (0x12345678),先转二进制,取低5位得偏移,再取接下来4位得行号,剩下的就是标记。判断是否命中,就看该行当前标记是否等于地址标记,且有效位为1。

这里有个高频陷阱:题目说“按字节编址”还是“按字编址”。按字编址时,地址最低位不是字节偏移,需要先除以字长。我见过太多人在这里翻车,明明映射方式写对了,地址划分却错了。

3.2 组相联与全相联:替换算法的手工模拟

组相联是直接映射和全相联的折中。假设Cache有8组,每组2行,块大小16字节。地址划分变成:偏移4位,组号3位,标记25位。访问一个地址时,先定位到组,然后在该组的2行里比较标记。如果都不命中,就要替换。LRU算法需要记录每行的最近访问时间,FIFO只看进入顺序,随机替换则没有规律。

期末常考的是给一个访问序列,让你画出每步Cache内容的变化。我一般建议用表格,列头写“访问地址、组号、命中/缺失、替换前该组内容、替换后该组内容”。这样即使算错,老师也能看到你的思路。全相联的替换更复杂,因为要比较所有行,但考试通常只考LRU,且访问序列不会太长。

3.3 写回法与写直达:什么时候写主存

写策略是选择题和大题都可能涉及的点。写直达(write-through)每次写Cache都同时写主存,实现简单但带宽消耗大。写回(write-back)只写Cache,并设置脏位,直到该行被替换时才写回主存。考试里常问:写回法下,替换时如果脏位为0,需要写主存吗?答案是不需要。

还有一个细节:写不命中时,写直达通常采用“不按写分配”,直接写主存,不调块;写回通常采用“按写分配”,先把块调入Cache再写。这个区别在选择题里反复出现,记住“写回配按写分配,写直达配不按写分配”基本能应付。

4. 指令系统与流水线:从数据冒险到流水线冲突的排查

4.1 指令格式与寻址方式:操作数在哪里

指令系统这章看似零散,其实就两条线:指令格式和寻址方式。指令格式考的是定长/变长、操作码扩展。比如给你一个指令字长16位,要求支持64条指令和8个通用寄存器,问操作码至少几位。先算寄存器编号占3位,两个操作数就是6位,剩下10位给操作码,最多1024条,满足64条。如果还要支持立即数,就要重新分配位数。

寻址方式常考立即寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、相对寻址。相对寻址的偏移量是相对于PC的,计算有效地址时是PC当前值加偏移。这里有个坑:PC当前值是指令执行时的PC,还是取指后的PC?不同教材定义不同,考试时看题目给的说明,如果没说明,默认是取指后PC,即当前指令地址加指令长度。

4.2 五级流水线:理想加速比与三种冒险

五级流水线(取指、译码、执行、访存、写回)是体系结构的核心考点。理想情况下,k级流水线处理n条指令的时间是 (k + (n-1)) 个周期,加速比接近k。但实际有冒险。

结构冒险:硬件资源冲突,比如指令和数据同时访存。解决方法是分离指令Cache和数据Cache。 数据冒险:后一条指令需要前一条的结果。解决方法是转发(forwarding)和插入气泡(stall)。转发能把ALU结果直接送给下一条指令,但load-use冒险必须插一个气泡,因为数据在访存后才可用。 控制冒险:分支指令导致下一条取指地址不确定。解决方法是分支预测,静态预测(如总是预测不跳转)或动态预测(如两位饱和计数器)。

期末大题通常给一段汇编代码,让你画出流水线时空图,标出哪些周期需要停顿。我一般会先列出每条指令的五个阶段,然后逐周期检查数据依赖。比如:

I1: LW R1, 0(R2) I2: ADD R3, R1, R4 I3: SUB R5, R3, R6

I1在周期5写回R1,I2在周期3需要R1,所以I2必须等到周期5之后才能执行,中间插入两个气泡。如果用了转发,I1在周期4访存结束就能把数据给I2,只需插一个气泡。这个分析过程必须写清楚,否则老师不知道你是真懂还是蒙的。

4.3 流水线冲突排查:从时空图反推停顿原因

很多同学画完时空图,发现某条指令莫名其妙停了一个周期,却说不清原因。我教一个排查顺序:先看结构冲突,检查同一周期是否有两条指令抢同一个部件;再看数据冒险,检查RAW、WAR、WAW,五级流水线只可能RAW;最后看控制冒险,检查分支指令后是否取错了地址。

如果题目给了转发和分支预测的条件,一定要在时空图旁边标注“转发生效”“预测正确”等字样。期末阅卷时,这些标注就是得分点。另外,流水线寄存器的作用是锁存中间结果,画图时不要漏掉每个阶段之间的寄存器。

5. 总线与I/O:中断、DMA与总线仲裁的避坑清单

5.1 中断处理全流程:从请求到返回的六个步骤

中断是I/O部分的必考内容。完整流程是:中断请求、中断判优、中断响应、保护现场、中断服务、恢复现场、中断返回。考试常问“中断响应发生在哪条指令执行完后”,答案是当前指令执行结束后,CPU检查中断请求线。

保护现场时,PC由硬件自动压栈,通用寄存器由中断服务程序负责保存。中断屏蔽字用来调整优先级,比如屏蔽掉低优先级中断。这里有个易错点:中断隐指令不是真正的指令,是硬件自动执行的,包括关中断、保存断点、引出中断服务程序。

5.2 DMA与中断的区别:数据传送谁做主

DMA和中断最本质的区别是:中断方式下,数据传送由CPU执行程序完成;DMA方式下,数据传送由DMA控制器直接完成,CPU只负责初始化和后处理。DMA请求的是总线使用权,不是CPU。周期挪用(cycle stealing)是DMA常用的方式,每次挪用一两个总线周期,不影响CPU访存。

考试里常给一个场景,问该用中断还是DMA。判断标准是数据量大小和传输速率。大量高速数据用DMA,少量低速用中断。另外,DMA的优先级高于中断,因为DMA不处理就会丢数据。

5.3 总线仲裁:链式查询与计数器定时查询的取舍

总线仲裁考得不多,但选择题会出现。链式查询简单,但优先级固定,离控制器近的设备优先。计数器定时查询灵活,优先级可以轮转,但需要更多控制线。独立请求方式最快,但线最多。期末通常只考概念,记住每种方式的优缺点即可。

注意:总线带宽计算是送分题,公式是总线宽度乘以总线频率。比如32位总线,频率100MHz,带宽就是 (32/8 \times 100M = 400MB/s)。别把位和字节搞混。

6. 期末复习的避坑与排查:五个血泪教训

6.1 坑一:Cache地址划分时忘记块内偏移单位

现象:算出来的标记位和行号总是对不上答案。 原因:题目说“按字节编址”,块大小32字节,偏移应该是5位;但如果按字编址,字长4字节,偏移就要先除以4再取位。 解决:读题时先圈出“编址单位”和“块大小单位”,统一换算成字节再算位数。

6.2 坑二:流水线时空图漏画流水线寄存器

现象:时空图看起来对,但老师扣分说“缺少寄存器”。 原因:五级流水线每级之间都有寄存器,画图时要用竖线隔开,并标注IF/ID、ID/EX等。 解决:画图前先画六条竖线,代表五个阶段和四个寄存器,再填指令。

6.3 坑三:浮点数阶码计算忘记加偏置

现象:阶码写成指数的二进制,结果全错。 原因:IEEE 754单精度偏置是127,双精度是1023,必须加上偏置再转二进制。 解决:手算时先写“指数+偏置=阶码真值”,再转二进制,养成习惯。

6.4 坑四:中断优先级判断时忽略屏蔽字

现象:明明高优先级中断来了,却判断为不响应。 原因:当前中断服务程序的屏蔽字可能屏蔽了该中断。 解决:做中断题时,先画出当前屏蔽字,再逐位判断哪些中断被允许。

6.5 坑五:总线带宽计算混淆MHz和MT/s

现象:带宽算出来差8倍。 原因:总线频率有时给的是时钟频率,有时给的是数据传输率。DDR总线一个时钟周期传两次。 解决:看清题目给的是“总线频率”还是“数据传输率”,前者要乘以2(如果是DDR),后者直接用。

7. 用一张自检表把整本书串起来

复习到最后,最怕的是知识点都会,但一做综合题就乱。我的习惯是考前三天拿出一张A4纸,画一个自检表,每一行是一个模块,每一列是“核心公式”“常考题型”“易错点”“手算验证”。比如数据表示这行,核心公式是补码转换和IEEE 754五步法,常考题型是十进制转浮点、补码溢出判断,易错点是偏置和隐藏位,手算验证就自己出两个数转一遍。

存储层次这行,核心公式是地址划分位数计算和平均访问时间 (T = h \times T_c + (1-h) \times T_m),常考题型是给访问序列画Cache变化,易错点是写策略和替换算法的组合。流水线这行,核心公式是加速比和吞吐率,常考题型是画时空图并计算停顿,易错点是load-use冒险必须插气泡。I/O这行,核心是中断流程和DMA区别,常考题型是判断该用哪种方式,易错点是中断隐指令和屏蔽字。

这张表不用写满,每个模块写三五行就行。写完后,拿一套往年题,不看答案,按表里的易错点逐题检查。如果某道题卡住了,立刻回到对应章节的推导过程,而不是直接看答案。我当年期末就是靠这个方法,从模考60多分提到卷面90+。后来工作里遇到体系结构相关的问题,比如性能调优时分析Cache命中率、排查流水线停顿,这套自检习惯依然管用——先定位模块,再套公式,最后手算验证。希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询