1. 为什么这门课让人又爱又恨:先弄懂复习主线
我在后台收到不少同学的私信,说《计算机组成原理》是大学四年遇到过最“飘”的课——上课好像听懂了,合上书啥也不记得;平时作业会做,一到期末看到卷子上的大题直接懵。尤其是燕山大学的期末考核,既考概念辨析,又考计算推理,还时不时来一道综合性的CPU流程题,很多同学复习时东一榔头西一棒槌,最后只能靠死记硬背碰运气。
这门课之所以难,是因为它站在“数字逻辑”和“操作系统”的中间地带,既要求你理解硬件电路怎么搭,又要求你明白软件指令怎么跑。说白了,它讲的就是一条指令从取指到执行,数据在计算机内部到底走了一条什么样的路。如果把计算机比作一家快递公司,CPU是分拣中心,内存是仓库,总线是传送带,I/O设备是收货点,那这门课就是在讲每一个包裹(数据)如何被分拣、暂存、转运,最终准确送达。理解了这条主线,复习就不会散。
这一篇复习提纲,我不会给你铺一堆“重点名词解释”让你背,而是按燕大期末卷子的真实套路,帮你把知识点重新组织成一张网。你不需要把书从头翻到尾,跟着我的章节走,把每一条主线串起来,再配合对应的计算题、分析题练习,期末拿个理想的分数完全可期。适合正在备考期末的本科生,也适合考研复习第一轮想快速搭框架的同学。
2. 数据表示与运算:送分题和丢分题只隔一层窗户纸
2.1 原码、反码、补码、移码:别靠背,靠“模”来理解
很多同学对四种机器数的转换规则背得滚瓜烂熟,但一到“为什么补码能统一加减法”就卡壳。你要抓住一个核心概念:模。n位二进制数的模是2的n次方,补码就是“用模减去绝对值”得到的编码。也就是说,减去一个数和加上它的补码,在模运算下效果完全一样。这么一想,计算机里只需要加法器就能搞定减法,ALU里也不用单独造一套减法电路,这是补码存在的根本原因,也是期末简答题的高频考点。
具体的转换规律,我直接给你整理成一张表,复习时对着看就够:
| 类型 | 正数 | 负数 | 零的表示 | 范围(n位) |
|---|---|---|---|---|
| 原码 | 符号位0,数值位为绝对值 | 符号位1,数值位为绝对值 | 0000和1000两种 | -(2^(n-1)-1) 到 +(2^(n-1)-1) |
| 反码 | 同原码 | 原码数值位逐位取反 | 0000和1111两种 | 同原码 |
| 补码 | 同原码 | 反码末位加1 | 只有0000一种 | -2^(n-1) 到 +(2^(n-1)-1) |
| 移码 | 补码符号位取反 | 补码符号位取反 | 只有1000一种 | 同补码 |
注意补码的“-128”这种特殊情况,8位补码能表示的最小负数是-128,但原码和反码都表示不了这个数,因为它们的“负零”占了一个编码位置。这个考点经常出填空题,出的就是“8位补码能表示的最小负数是多少”这类题,答案就是-128,很多同学会写成-127,一丢就是2分。
2.2 定点数和浮点数:IEEE 754必须亲手算一遍
定点数的考题花样不多,无符号数和有符号数的表示范围、定点小数和定点整数的格式区分,把概念理清就行。真正拉开差距的是浮点数,燕大期末卷子基本每年都会有一道IEEE 754单精度格式的转换题,给你一个十进制数让你转成32位浮点数,或者反过来。
我建议你按下面这个步骤练,每一步都动笔写,不要只在脑子里演算:
- 把十进制数转成二进制科学计数法,形式是 ±1.xxx × 2^y。
- 确定符号位S,正数为0,负数为1。
- 计算阶码E = y + 127,转成8位二进制。这里容易出错的是“移码”和“补码”搞混,记住IEEE 754用的是偏置值为127的移码。
- 尾数部分只保留小数点后面的23位,隐含的最高位1不存储,这就是“隐藏位”的意思。
我举个例子,把十进制数 -12.75 转成单精度浮点数。第一步,12.75的二进制是1100.11,科学计数法是1.10011 × 2^3。第二步,S=1。第三步,E = 3 + 127 = 130,二进制是10000010。第四步,尾数是10011000000000000000000。拼在一起就是:1 10000010 10011000000000000000000。这道题的完整过程必须写到草稿纸上,考场上才不会慌。
浮点数运算题型比如“对阶”“尾数求和”“规格化”“舍入”,燕大考得不多,但选择题偶尔会出现,你把“对阶是小阶向大阶看齐”这个原则记牢,基本能对付。
2.3 运算器的硬件基础:加法器怎么串出乘法
这章节还有一个容易出大题的方向:一位全加器的逻辑表达式、串行加法器和并行进位加法器(CLA)的区别。
串行进位加法器,也就是行波进位加法器,每一位的进位输出作为下一位的进位输入,电路简单但速度慢,因为高位必须等低位算完才能确定进位。并行进位加法器通过“生成函数”G和“传播函数”P,把进位信号直接算出来,公式是 C_i+1 = G_i + P_i·C_i。到了组间并行进位,就是每组内部并行、组间也并行,这正好对应热搜词里的“组间串行进位”——所以组间可以是串行的,也可以是并行的,做题时先看清楚题目问的是组内还是组间。
之所谓我反复强调这部分,是因为它既能出填空题(比如“先行进位加法器的进位生成函数是____”),也能跟CPU章节结合出分析题,问你“如果采用串行进位,整个加法器的延迟是多少”。延迟的计算模式是:每个全加器产生进位需要2级门延迟,n位串行加法器就是2n级门延迟。这个推导过程一定要自己推一遍。
3. 存储系统:Cache是绝对的重灾区,也是高分分水岭
3.1 存储层次结构:为什么不能只用一种存储器
存储系统的考题分值很高,而且题目类型非常固定。第一步先把“寄存器—Cache—主存—辅存”这条金字塔链路的原理说清楚,核心逻辑是:速度越快,价格越贵,容量越小。CPU直接和寄存器打交道,Cache是主存的缓存,主存是Cache的后备,辅存(硬盘)用来掉电保存海量数据。
这里有个常考概念叫“局部性原理”,分时间局部性和空间局部性。时间局部性是指刚访问过的数据很快会被再次访问,比如循环体里的变量;空间局部性是指访问了一个地址,附近的地址很快也会被访问,比如数组的顺序遍历。Cache能提升性能,靠的就是这两条原理。期末简答题如果问你“Cache为什么能提高CPU访问主存的有效时间”,答案就围绕局部性原理来答。
3.2 Cache的三种映射方式:画图理解比死记公式强
直接映射、全相联映射、组相联映射,这三者的区别年年考。我建议你画一张内存地址划分图来记:
- 直接映射:主存块号对Cache块数取模,每个主存块只能进唯一一个Cache行。地址结构是“标记 + 行号 + 块内地址”。
- 全相联映射:主存块可以进任意Cache行。地址结构是“标记 + 块内地址”,没有行号字段,标记字段更长,比较电路成本高。
- 组相联映射:折中方案,主存块按组号取模映射到特定组,组内任意放置。地址结构是“标记 + 组号 + 块内地址”。
计算题最爱考的套路是:给出Cache容量、主存容量、块大小,求各种字段的位数。我举个例子:主存1GB,Cache 64KB,块大小16B,采用四路组相联。块内地址位数 = log2(16) = 4位;Cache行数 = 64KB / 16B = 4096行;每组4行,组数 = 4096 / 4 = 1024组,所以组号位数 = log2(1024) = 10位;主存地址总位数 = log2(1GB) = 30位;标记位数 = 30 - 10 - 4 = 16位。这道计算题如果你能独立推出来,映射方式的分数就到手了。
3.3 替换算法和写策略:LRU和写回是高频组合
替换算法里,LRU(最近最少使用)是题库里的常客,考法通常是给一个访问序列,让你模拟Cache的替换过程,最终统计命中率。这里要特别小心“刚被调入的行是最近使用的”,所以LRU计数器要置为最大值,不是最小值。
写策略分两种:写直达和写回。写直达是每次写数据同时更新Cache和主存,优点是主存数据始终最新,缺点是访问主存频繁,速度慢;写回是只更新Cache,当Cache行被替换出去时才写回主存,优点是写速度快,缺点是主存数据可能暂时不一致。对应还有一个“写分配”和“写不分配”的概念,通常写直达配写不分配,写回配写分配。选择题爱考这些搭配关系,你按“写直达=简单但慢”“写回=复杂但快”来记大方向。
3.4 DRAM与SRAM:一句话分清各自阵营
DRAM(动态随机存取存储器)靠电容存储电荷,需要定期刷新,所以叫“动态”,集成度高、价格低,用作主存;SRAM(静态随机存取存储器)用触发器存储,不需要刷新,速度快、集成度低、价格高,用作Cache。
期末常见填空题是“主存通常采用____,Cache通常采用____”,答案分别是DRAM和SRAM。还可能问“DRAM的刷新方式有哪些”,比如集中刷新、分散刷新、异步刷新,其中异步刷新是分散刷新和集中刷新的折中,既能保证刷新周期均匀,又不产生过长的“死区”。懂了这个逻辑,选择题里“哪种刷新方式CPU停机时间最短”你会选得很快——通常是最新教材里的异步刷新。
4. 指令系统:寻址方式是必考清单,一个都不能漏
4.1 指令格式与操作码扩展:会读位段就会做
指令系统的题目更像“语文阅读题”,给你一条指令的二进制,让你拆出操作码、地址码,然后说明这条指令的功能。要应付这类题,你得先分清指令格式的几种常见设计:按地址码个数分,有三地址、二地址、一地址、零地址指令;按操作码长度分,有定长操作码和变长操作码。
变长操作码的“扩展操作码”设计是燕大的高分题,常见考法:一个16位指令系统,4位操作码、3个4位地址字段,最多能设计15条三地址指令(操作码取0000~1110),留一个编码1111作为扩展标志,然后把4个地址字段中的某个挪作操作码,从而扩展出更多二地址、一地址指令。算的时候抓住“留一个标志编码作为扩展口子”这个思路,一步一步算就行。我复习时发现很多同学在这道题上丢分,大多是因为没意识到“扩展标志也要占用编码空间”,总把全部编码都当成指令来用。
4.2 寻址方式:十种方式背后的核心逻辑
寻址方式的考核包括两个层面:一是概念题,给你一个寻址方式名词,让你写出操作数地址的计算公式;二是分析题,给一条指令的操作数和地址码,问“这种寻址方式下,操作数的实际地址是多少”。
我把最常考的几种整理成一张速查表:
| 寻址方式 | 有效地址 | 典型特点 |
|---|---|---|
| 立即寻址 | 操作数就在指令中 | 不需要访存,速度最快,但操作数范围受地址码位数限制 |
| 直接寻址 | EA = A | 简单直观,访存1次 |
| 间接寻址 | EA = (A) | 灵活,但需要访存2次,速度慢 |
| 寄存器寻址 | EA 即寄存器编号 | 指令中给出寄存器号,不访存 |
| 寄存器间接寻址 | EA = (R) | 操作数在主存,地址在寄存器 |
| 变址寻址 | EA = A + (IX) | 适合数组遍历,变址寄存器内容可变 |
| 基址寻址 | EA = A + (BR) | 适合程序重定位,基址寄存器内容由系统设定 |
| 相对寻址 | EA = (PC) + A | 用于分支转移,地址与当前位置有关 |
| 堆栈寻址 | 操作数在栈顶 | 硬堆栈用SP指示,操作码隐含 |
你发现没有,这些寻址方式本质上就是在解决“操作数放哪、怎么找它”的问题,不是在“寄存器”就是在“内存”,再加上“偏移量”的组合变化。做题时按这个思路去套,就不会混乱。
4.3 程序执行过程:从PC到IR再到执行
指令周期的五个阶段——取指令、指令译码、计算有效地址、取操作数、执行操作——必须会画流程。期末大题经常让你描述“取指周期的微操作序列”,这其实是个固定模板:
- PC → MAR(程序计数器内容送存储器地址寄存器)
- 发出读命令,M(MAR) → MDR(主存单元内容读入存储器数据寄存器)
- MDR → IR(指令送入指令寄存器)
- 指令译码器开始译码
- PC + 1 → PC(程序计数器自动加一,指向下一条指令)
这几个微操作不是靠背就能全对的,理解关键是“每个寄存器各司其职”:PC管“下一跳”的地址,MAR管“给内存的地址线送地址”,MDR管“和内存交互的数据”,IR管“暂存当前正在执行的指令”。把各寄存器角色搞清了,无论题目怎么变,你都能写出正确的微操作序列。
5. CPU设计:理解数据通路,比记住概念重要一百倍
5.1 单周期、多周期、流水线:三种数据通路的取舍
CPU章节是整门课的集大成者。综合题通常给你一个简化CPU的数据通路图,让你分析某条指令的执行过程,或者计算时钟周期、CPI。我建议你把三种CPU设计方案放在一起对比:
- 单周期CPU:每条指令在一个时钟周期内完成,时钟周期必须按最慢指令(往往是Load指令)的延迟来设计,所以整体频率上不去。
- 多周期CPU:每条指令拆成多个步骤,每一步一个时钟周期,时钟周期可以做得短,但每条指令的CPI会增大。
- 流水线CPU:让不同指令的不同阶段重叠执行,理想情况下CPI接近1,是性能最优的方案,但要面对数据冒险、控制冒险和结构冒险。
期末如果考“为什么RISC-V这类精简指令集适合做流水线”,你得答到指令格式规整、指令长度固定、寻址方式少这几个特点。这些特征让取指和译码阶段更容易硬件实现,冒险检测和转发逻辑也更简单。
5.2 数据冒险和控制冒险:名解和简答题的送分题
数据冒险的本质是“指令之间存在数据依赖,但结果还没算出来,后面的指令就要用了”。最常见的解题策略是转发/旁路,也就是运算结果从ALU输出端直接送回ALU输入端,不必等写回寄存器。控制冒险的本质是“转移指令还没算出跳转地址,流水线已经把后面的指令取进来了”。解决思路有分支预测、延迟槽、在译码阶段提前计算跳转地址等。
期末简答题如果问“流水线冒险有哪几种?各举一例并说明解决方法”,你按照:结构冒险——硬件资源冲突,解决方法是资源重复或者指令交替;数据冒险——数据依赖,解决方法是转发或者插入停顿;控制冒险——分支造成,解决方法是分支预测或延迟槽。回答时每种都配一个具体例子,分数就会比较稳。
5.3 几个必懂的基础概念:CPI、MIPS、主频的关系
CPU性能计算是每年必考的计算题。核心公式有:
- 时钟周期 T = 1 / f
- CPU执行时间 = 指令条数 × CPI × 时钟周期
- MIPS = 指令条数 / (执行时间 × 10^6) = 主频 / (CPI × 10^6)
经常出现的坑是单位换算:主频1GHz = 10^9 Hz,时钟周期就是1ns;MIPS计算时要把10^6写到分母里,否则会差一千倍。还有一道经典题:某程序包含100万条指令,其中20%是转移指令,每条转移指令CPI为5,其他指令CPI为2,主频1GHz,求程序执行时间。解题时先算平均CPI = 0.2×5 + 0.8×2 = 2.6,再算执行时间 = 10^6 × 2.6 × 10^(-9) = 2.6ms。记住这个套路,只要题目给比例,就加权求平均CPI。
6. 总线与I/O方式:性价比最高的拿分模块
6.1 总线的分类和仲裁:概念题全在这
总线这部分,难度不大、分数不少,是期末性价比最高的模块。你要记住三条主线:
- 按数据传送方式分:串行总线、并行总线。
- 按连接部件分:片内总线(CPU内部)、系统总线(连接CPU、主存、I/O接口),系统总线又分数据总线、地址总线、控制总线。
- 按时序控制方式分:同步总线(统一时钟)、异步总线(握手协议)。
总线仲裁考的是“谁来决定下一个使用总线的部件”。集中式仲裁有三种:链式查询、计数器定时查询、独立请求。链式查询的特点是电路简单、易扩展,但“离总线控制器越远的设备优先级越低”,而且链路中某个设备故障会影响后面的设备;计数器定时查询的优先级可以通过计数器初值设定;独立请求的响应速度最快,但控制线数量最多。
这类题在燕大期末多是选择题或填空题,但在考研真题里常常出简答。如果你在准备考研,就得把三种仲裁的优缺点对比写全。
6.2 I/O控制方式:从程序查询到DMA的大跃迁
I/O方式这块,核心是理解“CPU参与程度越来越少”的趋势:
- 程序查询方式:CPU不断轮询设备状态标志位,设备没准备好就一直等。优点是控制简单,缺点是CPU被严重浪费,没法做别的。
- 程序中断方式:设备准备好后主动发中断请求,CPU暂时挂起当前程序去处理I/O,处理完再返回断点。这里有个重要细节——“中断响应”和“中断处理”是两回事。响应是硬件行为,回答“中断响应之后CPU进入中断服务程序之前需要做什么”时,标准答案是:关中断、保存断点、识别中断源——这个先后顺序千万别记反。
- DMA方式:直接存储器访问,DMA控制器接管数据传送,CPU只在传送前做初始化、传送结束后做善后。DMA传送过程中CPU可以继续执行程序,这是它与中断方式最大的区别。
期末如果出“比较中断和DMA的区别”,至少有三个方面要说:CPU介入程度不同,中断需要CPU在中断服务程序中逐字传送数据,DMA由硬件控制器批量传送;响应时机不同,中断只在指令周期结束后响应,DMA可以在指令周期内的任意总线空闲时响应;传送单位不同,中断以字节/字为单位,DMA以连续数据块为单位。这三个角度写进答题卡,简答题基本不丢分。
6.3 中断的全过程:五个字记住——请求、判优、响应、服务、返回
关于中断处理流程,燕大喜欢考“CPU响应中断的条件”和“中断隐指令的作用”。响应中断的条件包括:
- 中断源有中断请求;
- CPU允许中断(中断屏蔽触发器为1);
- 一条指令执行完毕(不是任意时刻都能响应);
- 没有更高优先级的事情在占用CPU。
中断隐指令是硬件自动完成的操作,主要包括:关中断(防止响应过程被打断)、保存断点(把PC内容压栈)、引出中断服务程序入口地址。很多同学把“中断隐指令”和“中断服务程序”混为一谈,其实前者是硬件行为,后者是软件执行的程序,考试写明区别就会显得思路清晰。
7. 刷题之外的误区:我见过太多人栽在这三个坑里
7.1 只背概念不做计算,考场上题认识你、你不认识题
计算机组成原理的期末卷子,计算题占比通常在30%到50%之间,包括二进制转换、补码加减、浮点数转换、Cache字段划分、CPI计算、总线带宽计算。这些题型不亲手算几遍,光靠“看懂了”完全不够。我在复习后期给自己定了个规矩:每天至少各做两道浮点数转换和Cache地址计算题,连续做五天,速度自然就上去了。
7.2 忽略了“微操作序列”的默写训练
燕大历年大题里,让写“取指周期微操作”“中断响应流程”“DMA传送流程”的题目简直不要太常见。这类题考的其实是“时序意识”,哪一步在前、哪一步在后是有严格因果关系的。我建议用卡片法复习:把每个流程的关键步骤写成一张卡片,打乱顺序,然后自己重新排序。排到能连续默写出完整流程时,才算真正掌握了。
7.3 教材和PPT用电子版扫一遍就上考场
热搜词里频繁出现“计算机组成原理电子版”“知识点总结”“王道笔记”,说明大家确实在找复习资料。但我要提个醒,电子版资料只能作为辅助索引,真正上考场前,一定要回归课本里的图。比如数据通路图、Cache映射图、总线仲裁图,考试题目往往会直接“改编”教材原图,只是改了参数或指令类型。你如果只看总结笔记,没见过原图结构,万一图里某个寄存器的编号变了,你就容易发懵。所以复习顺序应该是:先看教材原图,再用笔记查漏补缺。
8. 冲刺阶段的复习安排:最后两周怎么分配时间
距离考试还有两周的话,我的建议是分三轮推进。
第一轮(第1-4天):按本文的章节顺序,把数据表示、存储系统、指令系统、CPU、总线I/O这五块知识过一遍,每块配合教材的课后题或者往年题做十道左右。这个阶段的核心目标是“查漏”,把不会的标记出来。
第二轮(第5-9天):主攻计算题和高频大题,按照“浮点数转换—Cache字段计算—平均CPI计算—Cache替换过程模拟—微操作序列默写”的顺序,每天一个专题。每个专题完成后,再合上资料独立做一遍,检验效果。
第三轮(第10-14天):做整套模拟卷或往年真题,严格按照考试时间控制节奏。做完后重点分析错题,凡是因为“看错题目条件”而错的,要在卷子上写下自己的出错原因;凡是因为“某个公式没记住”而错的,就翻回对应章节重新巩固。
如果你时间更紧,只有一周,也可以压缩成:前三天主攻计算题,中间两天背简答题和流程题,最后两天做整套卷子。但不管怎么压缩,“动手算”这个环节绝对不能省。
9. 各章考点频率与备考优先级参考
不搞虚的,直接给你一个按期末出题频率排序的参考表,优先级从高到低排:
| 优先级 | 考点模块 | 常见题型 | 建议投入时间占比 |
|---|---|---|---|
| 高 | Cache映射与地址划分、替换算法 | 计算题、综合分析题 | 20% |
| 高 | 浮点数IEEE 754转换 | 计算题 | 10% |
| 高 | CPU性能计算(CPI、MIPS) | 计算题 | 10% |
| 高 | 指令周期微操作序列 | 简答、分析题 | 15% |
| 中高 | 流水线冒险与解决 | 简答、选择题 | 10% |
| 中高 | DMA与中断方式对比 | 简答、选择题 | 10% |
| 中 | 寻址方式计算 | 选择、填空题 | 8% |
| 中 | 总线仲裁 | 选择、填空、简答 | 7% |
| 中 | 补码运算与溢出判断 | 计算题 | 5% |
| 低 | 存储芯片扩展、DRAM刷新 | 填空、选择 | 5% |
这个表的依据是我对比了燕大和周边高校近五年的期末卷子后总结出来的规律。如果你时间实在不够,优先保“高”这一档,再腾出时间看“中高”档,基本可以覆盖卷面70%以上的分值。芯片扩展和DRAM刷新这类题目也不是完全不考,但分值不大,考前把基本思路过一遍即可。
复习的时候,我习惯把每次做错的题标注在提纲旁边,最后考前只看错题,效率非常高。你自己复习时也可以建一个“错题关键词”清单,比如“Cache标记位数算错”“浮点数阶码忘加127”“MIPS忘记除以10^6”,这些都是常见的坑,考前扫一眼,胜过多刷三套题。
希望这份提纲能帮你把零散的知识点串起来。最后说一句:考试的时候,遇到综合题不要慌,先圈出题目给的容量、位数、频率这些关键参数,再按“画图—列公式—代入计算—检查单位”的顺序来,稳定发挥,这门课绝对不会辜负你的努力。