《计算机组成原理》模拟卷 A + 小白深度解析
命题依据:老师透露的考试结构 + 白中英教材例题风格 + 课堂/实验/作业重点题型。 满分 100 分,建议用时 120 分钟。先合上解析自己做一遍,再看后半部分的详解。 解析对 0 基础特别友好:每题都给【最终答案】【详细步骤】【🌱大白话理解】【⚠️最容易错的坑】【评分点】。 配套:先读 01_知识图谱与考点地图 与 02_a+b学习手册,做完本卷如有疑问回去定位章节。
第一部分 试卷(请先独立作答)
一、选择题(每题 1.5 分,共 15 分)
-
SRAM 和 DRAM 的根本区别在于( )。 A. SRAM 用电容存储、DRAM 用触发器存储 B. SRAM 用触发器(双稳态电路)存储、DRAM 用电容存储 C. SRAM 需要刷新、DRAM 不需要 D. SRAM 速度更慢、DRAM 速度更快
-
早期冯·诺依曼计算机是以( )为中心的。 A. 存储器 B. 运算器 C. 控制器 D. 输入输出设备
-
字长为 n 位的补码定点整数,可表示的数值范围是( )。 A. -(2^(n-1)-1) ~ +(2^(n-1)-1) B. -2^(n-1) ~ +(2^(n-1)-1) C. 0 ~ 2^n-1 D. -2^n ~ +2
-
IEEE754 单精度浮点数的阶码偏移量(偏置值)为( )。 A. 64 B. 127 C. 128 D. 1023
-
主存与 Cache 之间的三种映射方式中,块冲突概率最高的是( )。 A. 全相联映射 B. 直接映射 C. 组相联映射 D. 三者相同
-
“只有取数(LOAD)和存数(STORE)指令才能访问存储器”是( )的典型特征。 A. CISC B. RISC C. 向量机 D. 微程序控制器
-
相对寻址方式中,操作数的有效地址 EA =( )。 A. A B. (A) C. (PC) + A D. (变址寄存器) + A
-
与程序中断方式相比,DMA 方式响应请求的时机是( )。 A. 一条指令执行结束时 B. 一个机器周期(总线周期)结束时 C. 一段程序结束时 D. 任意时刻立即
-
微程序控制器中,控制存储器(CM)存放的是( )。 A. 机器指令 B. 微指令 C. 操作数 D. 程序
-
在流水线中,如果后一条指令需要使用前一条指令的运算结果,这种相关称为( )。 A. 结构相关 B. 数据相关(RAW) C. 控制相关 D. 名称相关
二、判断题(每题 1.5 分,共 15 分)
对的写 T,错的写 F。
- ( )DRAM 因为使用电容存储,电荷会泄漏,所以需要定期刷新。
- ( )补码中,正数的补码等于其原码,负数的补码等于其反码末位加 1。
- ( )Cache 对所有程序员都是透明的,程序员不需要也不能直接管理 Cache。
- ( )DMA 传输期间,CPU 完全停止工作,等待 DMA 传完才继续。
- ( )中断响应发生在一条指令执行结束之后。
- ( )硬连线控制器比微程序控制器速度更快,但修改设计更困难。
- ( )总线带宽指的是总线的物理根数(总线宽度)。
- ( )流水线的理论最大加速比等于流水段数 k。
- ( )在存储层次中,Cache 解决的是速度问题,虚拟存储器解决的是容量问题。
- ( )RISC 指令长度可变,CISC 指令长度固定。
三、简答题(每题 5 分,共 15 分)
-
(流水线时空图) 某指令流水线分为 IF(取指)、ID(译码)、EX(执行)、MEM(访存)、WB(写回)共 5 段,每段耗时 1 个时钟周期。请画出连续执行 4 条指令(I1~I4,无数据相关)的流水线时空图。
-
(地址线与数据线) 某存储芯片容量为 4K x 8 位。请问该芯片有多少根地址线?多少根数据线?简述你的计算方法。
-
(芯片地址分配) 某系统 CPU 有 16 根地址线(地址范围 0000H
FFFFH)。现有一块 8K x 8 位的 ROM 芯片,其地址范围分配为 E000HFFFFH。请写出该芯片需要的片选条件(用高位地址线表示)。
四、编程题(10 分)
(并行编程) 以下是一个使用 POSIX 线程(pthread)的简单并行求和程序。阅读代码后回答问题。
#include <stdio.h>
#include <pthread.h>
int sum = 0;
pthread_mutex_t lock;
void* add_func(void* arg) {
int n = *(int*)arg;
for (int i = 0; i < n; i++) {
pthread_mutex_lock(&lock);
sum += 1;
pthread_mutex_unlock(&lock);
}
return NULL;
}
int main() {
pthread_t t1, t2;
int count = 50000;
pthread_mutex_init(&lock, NULL);
pthread_create(&t1, NULL, add_func, &count);
pthread_create(&t2, NULL, add_func, &count);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&lock);
printf("sum = %d\n", sum);
return 0;
}(1)(3分)程序最终输出的 sum 值是多少?请说明理由。
(2)(3分)如果去掉 pthread_mutex_lock 和 pthread_mutex_unlock 这两行(即不加锁),程序输出的 sum 值一定是 100000 吗?为什么?
(3)(4分)从计算机组成原理的角度解释:为什么不加锁时结果可能出错?请用”读-改-写”三步骤说明竞争条件。
五、综合题(共 45 分,6 小题)
综合题 1:存储器芯片扩展与连线(7.5 分)—— 第 3 章
某 CPU 地址总线 16 位(A15A0),数据总线 8 位(D7D0)。要求用 4 片 8K x 4 位的 SRAM 芯片组成 16K x 8 位的存储器,起始地址为 0000H。
(1)(2分)说明需要进行哪些类型的扩展(位扩展/字扩展/字位同时扩展),并画出芯片组织方式。
(2)(3分)每片芯片有几根地址线?几根数据线?片选信号如何连接?画出芯片与 CPU 的连线示意图(标注地址线、数据线、片选信号的连接关系)。
(3)(2.5分)写出每片芯片的地址范围。
综合题 2:补码定点加减运算(7.5 分)—— 第 2 章
已知 x = +10110,y = -01101(均为 5 位数值的真值)。
(1)(2分)写出 [x]补、[y]补、[-x]补、[-y]补。
(2)(3分)用双符号位(变形补码)计算 x + y,写出完整竖式,并判断是否溢出。
(3)(2.5分)用双符号位(变形补码)计算 x - y,写出完整竖式,并判断是否溢出。
综合题 3:流水线设计与性能计算(7.5 分)—— 第 5 章
某指令流水线分为 IF、ID、EX、MEM、WB 共 5 段。各段耗时分别为:IF=80ns、ID=60ns、EX=100ns、MEM=80ns、WB=50ns。
(1)(2分)若采用同步流水线(各段统一时钟),时钟周期应取多少?为什么?
(2)(2.5分)连续执行 200 条无关指令,流水方式下所需时间是多少?不采用流水线的串行时间是多少?
(3)(3分)计算实际加速比和流水线效率。若存在 20 次数据冒险,每次需要停顿 1 个时钟周期(气泡),重新计算所需时间和加速比。
综合题 4:微指令设计(7.5 分)—— 第 5 章
某微程序控制器的微指令格式如下:控制存储器容量为 128 单元,微指令字长 32 位,其中操作控制字段采用直接编码方式,共有 20 个微命令;顺序控制字段包含”下地址”字段。
(1)(2.5分)下地址字段需要多少位?操作控制字段需要多少位?
(2)(2.5分)如果操作控制字段改为”分段编码(字段译码)“方式,将 20 个微命令分为 4 组(3+5+5+7 个互斥的微命令),每组需要几位编码?操作控制字段总共需要多少位?与直接编码相比省了多少位?
(3)(2.5分)简述微程序控制器执行一条机器指令的基本过程(取微指令→执行微操作→形成下一条微指令地址→…)。
综合题 5:DMA 传输(7.5 分)—— 第 8 章
某计算机采用 DMA 方式与磁盘交换数据。已知:磁盘转速 7200 RPM,每个磁道存储 1024 个扇区,每个扇区 512 字节,CPU 主频为 1GHz,每个总线周期传送 4 字节。
(1)(2分)磁盘的数据传输率(字节/秒)是多少?
(2)(2.5分)DMA 每次传送一个扇区的数据,传送完成后向 CPU 发出中断请求。若 CPU 响应中断的开销为 500 个时钟周期,则 CPU 用于处理磁盘中断的时间占比是多少?
(3)(3分)比较”程序查询方式”、“程序中断方式”和”DMA 方式”在传输该磁盘数据时的 CPU 效率,并解释为什么 DMA 特别适合磁盘这类高速设备。
综合题 6:多级中断与屏蔽字(7.5 分)—— 第 8 章
某机有 A、B、C、D 四个中断源,硬件排队优先级为 A > B > C > D。系统用 4 位中断屏蔽字(从高到低对应 A、B、C、D),某位为 1 表示屏蔽该中断、0 表示开放。
响应某级中断时,要求屏蔽本级及优先级更低的中断、开放优先级更高的中断。
(1)(2分)写出 A、B、C、D 四个中断服务程序中应设置的中断屏蔽字。
(2)(2.5分)假设在第 10 个时钟周期,B 和 D 同时发出中断请求,CPU 先响应谁?在执行该中断服务程序的过程中(第 15 个周期),A 发出请求,会发生什么?画出中断处理的时间线。
(3)(3分)在 (2) 的场景中,A 的中断服务程序执行到一半时(第 20 个周期),C 发出请求。C 会被响应吗?请从屏蔽字角度解释完整的中断嵌套过程。
第二部分 答案与小白深度解析
说明:解析里每道题都先给答案,再一步步推,再用大白话讲透,最后点出最容易踩的坑。
一、选择题详解
1. 答案:B
- 详解:SRAM(Static RAM)使用双稳态触发器(6个晶体管)存储1位,不需要刷新,速度快但贵且密度低;DRAM(Dynamic RAM)使用电容存储1位,电荷会泄漏所以需要定期刷新,速度慢但便宜且密度高。
- 🌱 大白话:SRAM 像拨动开关,拨上去就不动了(稳定);DRAM 像漏水的杯子,得不停往里续水(刷新)。
- ⚠️ 坑:A 选项把两者说反了,这是最常见的混淆。
2. 答案:B(运算器)
- 详解:早期冯·诺依曼结构所有数据都要经过运算器中转,“以运算器为中心”;现代改进型变为”以存储器为中心”。
- 🌱 大白话:老式机器所有数据进出都得先过”计算台”那张桌子,所以桌子是中心。
- ⚠️ 坑:题目问的是”早期”,很多人误选存储器(那是改进型)。
3. 答案:B(-2^(n-1) ~ +(2^(n-1)-1))
- 详解:补码比原码/反码多表示一个最小负数(如 8 位多出 -128),因为省掉了 -0。
- ⚠️ 坑:A 是原码/反码的范围,C 是无符号数的范围。
4. 答案:B(127)
- 详解:单精度阶码 8 位,偏移量 = 2^(8-1) - 1 = 127;双精度阶码 11 位,偏移量 1023。
- ⚠️ 坑:别和双精度的 1023、或 8 位移码”理论中点 128”搞混——IEEE754 规定就是 127。
5. 答案:B(直接映射)
- 详解:直接映射每个主存块只能映射到固定一行 Cache,极易冲突;全相联可进任意行,冲突最低。
- 🌱 大白话:对号入座最容易撞位,随便停车最不容易。
6. 答案:B(RISC)
- 详解:RISC 的核心设计哲学之一就是”只用 LOAD/STORE 访存,运算指令只操作寄存器”。
- 🌱 大白话:精简派说”只有搬运工能去仓库,其他工人只能在工作台上干活”。
7. 答案:C((PC)+A)
- 详解:相对寻址以 PC 为基准加位移量 A。A=直接寻址,(A)=间接寻址,(变址R)+A=变址寻址。
- ⚠️ 坑:相对用 PC、基址用基址寄存器、变址用变址寄存器,公式像但基准不同。
8. 答案:B(一个机器周期/总线周期结束时)
- 详解:中断在”一条指令执行结束”才响应;DMA 只借总线,在”一个机器周期结束”即可响应。
- 🌱 大白话:DMA 比中断还急,CPU 干完一个小拍就让路。
9. 答案:B(微指令)
- 详解:控制存储器(CM)是微程序控制器的核心部件,里面存放的是微指令。机器指令存在主存里,不要搞混。
- 🌱 大白话:控制存储器是”导演的剧本本子”,里面记着每步怎么发号施令(微指令),不是演员的台词(机器指令)。
10. 答案:B(数据相关/RAW)
- 详解:后一条指令要读前一条指令还没写回的结果,这是”写后读”(Read After Write)相关,也叫 RAW 相关。
- 🌱 大白话:你在等前一个人写完答案才能抄,结果他还没写完你就去看了——这就是数据冒险。
二、判断题详解
1. T(对)
- DRAM 用电容存电荷,电容会泄漏,所以每隔几毫秒必须刷新一次(重新充电)。
2. T(对)
- 正数:原码 = 补码 = 反码。负数:补码 = 反码 + 1(或者”符号位不变,数值位取反末位加1”)。
- ⚠️ 坑:这里说的”反码末位加1”是求补码的快捷方法,不要和”取反”操作本身搞混。
3. T(对)
- Cache 完全由硬件管理,对程序员透明(用户程序员和系统程序员都不直接操作 Cache 的映射)。
- ⚠️ 坑:虚拟存储器对用户程序员透明但对系统程序员不透明,两者不同。
4. F(错)
- DMA 传输期间,CPU 并没有完全停止工作。在周期挪用方式下,DMA 只在需要总线时抢占一个总线周期,其余时间 CPU 正常工作;在停止 CPU 方式下,CPU 也只是暂停访存,内部运算照常。
- 🌱 大白话:DMA 是”借路”不是”封路”,CPU 只是偶尔让一让,不是停工。
5. T(对)
- 中断响应的时机是在当前指令执行完毕后,CPU 检查有无中断请求。
6. T(对)
- 硬连线控制器用组合逻辑电路直接产生控制信号,速度快但不规整、难修改(像焊死的电路)。
- 微程序控制器把控制信号编成微指令存在 CM 中,灵活易改但速度相对慢(像查脚本)。
7. F(错)
- 总线带宽 = 总线宽度 x 工作频率 = 单位时间内传送的数据量(字节/秒),不是简单的”物理根数”。
- 🌱 大白话:带宽是”每秒能运多少货”,不只是”路有几条车道”。
8. T(对)
- 理论最大加速比 = 流水段数 k(当指令条数 n 趋向无穷时,Sp = k)。
9. T(对)
- Cache 解决 CPU 与主存的速度差距,虚拟存储器解决主存容量不足。
10. F(错)
- 说反了!RISC 指令长度固定(定长,格式规整),CISC 指令长度可变。
三、简答题详解
简答题 1:流水线时空图
最终答案:
时钟周期: 1 2 3 4 5 6 7 8
I1: IF ID EX MEM WB
I2: IF ID EX MEM WB
I3: IF ID EX MEM WB
I4: IF ID EX MEM WB
详细说明:
- 无数据相关时,每条指令依次错开 1 个时钟周期进入流水线。
- 总时间 = k + (n-1) = 5 + (4-1) = 8 个时钟周期。
- 第 1~5 周期流水线在”填充”,第 5 周期开始每周期完成 1 条指令。
🌱 大白话:就像洗衣服——第 1 件在洗的时候第 2 件开始浸泡,流水线满了之后每个周期都有一件衣服洗好。
评分点:图画正确(3分)、总时间(1分)、说明错开关系(1分)。
简答题 2:地址线与数据线
最终答案:地址线 12 根,数据线 8 根。
详细步骤:
- 芯片容量 = 4K x 8 位 = 4096 个存储单元,每单元 8 位。
- 地址线数 = log2(4096) = log2(2^12) = 12 根(A11~A0)。
- 数据线数 = 每单元的位数 = 8 根(D7~D0)。
🌱 大白话:4K 个房间需要 12 位的门牌号来区分(2^12 = 4096);每个房间住 8 个人(8 位数据),所以进出需要 8 条通道。
⚠️ 坑:4K = 4 x 1024 = 4096,不是 4000;K 在计算机里是 1024。
评分点:地址线数及计算(2分)、数据线数(1分)、计算过程(2分)。
简答题 3:芯片片选条件
最终答案:片选条件为 A15=1, A14=1, A13=1(即 A15·A14·A13 = 1 时选中)。
详细步骤:
- 芯片容量 8K x 8 位,需要 13 根地址线(2^13 = 8192 = 8K),即使用 A12~A0。
- 芯片地址范围:E000H ~ FFFFH
- E000H = 1110 0000 0000 0000B
- FFFFH = 1111 1111 1111 1111B
- 高 3 位地址(A15~A13)在这个范围内:
- E000H: A15=1, A14=1, A13=1
- FFFFH: A15=1, A14=1, A13=1
- 所以片选条件:A15=1 且 A14=1 且 A13=1。
- 用逻辑表达式:CS = A15 · A14 · A13(active high),或 /CS = /(A15 · A14 · A13) = /A15 + /A14 + /A13(active low)。
🌱 大白话:16 根地址线中,低 13 根交给芯片内部寻址,高 3 根用来做”门禁”——只有三根都是 1 的时候(地址在 E000H~FFFFH),才打开这块芯片的大门。
⚠️ 坑:片选是看高位地址线(不参与芯片内部寻址的部分),不是低位。
评分点:正确分析地址范围(2分)、写出片选条件(2分)、逻辑表达式(1分)。
四、编程题详解
(1) 程序输出
最终答案:sum = 100000。
详细分析:
pthread_create创建了 2 个线程(t1 和 t2),每个线程调用add_func,参数 count = 50000。- 每个线程执行 50000 次
sum += 1,且每次都用pthread_mutex_lock/unlock保护。 - 互斥锁保证了同一时刻只有一个线程能修改 sum,所以不会出现竞争。
- 总计:50000 + 50000 = 100000。
评分点:正确值(1分)、说明两个线程各执行50000次(1分)、说明锁保证了互斥(1分)。
(2) 不加锁时
最终答案:不一定是 100000,结果很可能小于 100000。
解释:去掉锁后,两个线程可能同时读写全局变量 sum,产生竞争条件(Race Condition)。两个线程可能同时读到 sum 的旧值,各自加 1 后写回,导致本应加 2 的操作只加了 1。
评分点:判断不一定(1分)、说明可能小于 100000(1分)、提到竞争条件(1分)。
(3) 从组成原理角度解释竞争条件
最终答案:
sum += 1 在机器层面不是一个原子操作,它至少分为三步:
① 读(Read): 从内存中读取 sum 的当前值到寄存器 → LOAD R1, [sum]
② 改(Modify):在寄存器中对值加 1 → ADD R1, R1, #1
③ 写(Write): 将新值从寄存器写回内存 → STORE R1, [sum]
竞争场景示例(假设 sum 当前为 100):
时间 线程 t1 线程 t2
T1 LOAD R1, [sum] ... → t1 读到 R1=100
T2 ... LOAD R2, [sum] → t2 也读到 R2=100
T3 ADD R1, R1, #1 ... → t1 算出 101
T4 ... ADD R2, R2, #1 → t2 也算出 101
T5 STORE R1, [sum] ... → sum=101
T6 ... STORE R2, [sum] → sum=101(覆盖!)
两个线程各做了一次 +1,但 sum 只从 100 变到 101(丢失了一次更新)。这就是因为”读-改-写”三步之间被另一个线程插入了,CPU 的寄存器各自持有旧值。
🌱 大白话:就像两个人同时看银行余额都是 100 元,各自往里存 1 元。他们都以为自己存完后余额是 101,结果两人先后写回,最终余额还是 101 而不是 102——因为第二个人写的时候覆盖了第一个人的结果。
⚠️ 坑:不要认为”加法只有一条指令就是原子的”——在多核/多线程环境下,即使是一条指令(如 x86 的 ADD [mem], 1)也不一定是原子的(读-改-写仍然分三个微操作,除非加 LOCK 前缀)。
评分点:说明三步骤(2分)、画出竞争时间线(1分)、解释丢失更新(1分)。
五、综合题详解
综合题 1:存储器芯片扩展与连线
(1) 扩展方式
最终答案:需要进行字位同时扩展。
- 单片芯片:8K x 4 位。
- 目标存储器:16K x 8 位。
- 字方向:8K → 16K,需 2 倍字扩展。
- 位方向:4 位 → 8 位,需 2 倍位扩展。
- 所以 4 片芯片组成 2 组,每组 2 片做位扩展(4+4=8 位),2 组做字扩展(8K+8K=16K)。
芯片组织:
┌──────────────────┐
组0 │ 片0(8Kx4) │ 片1(8Kx4) │ → 合在一起 = 8K x 8位 (地址: 0000H~1FFFH)
├──────────────────┤
组1 │ 片2(8Kx4) │ 片3(8Kx4) │ → 合在一起 = 8K x 8位 (地址: 2000H~3FFFH)
└──────────────────┘
总计: 16K x 8位
评分点:正确判断扩展类型(1分)、组织方式正确(1分)。
(2) 连线设计
最终答案:
- 每片芯片:13 根地址线(2^13 = 8K)、4 根数据线。
连线方式:
CPU地址线 A12~A0 ──→ 所有4片芯片的地址输入(13根,统一连接)
CPU数据线:
D3~D0 ──→ 片0、片2 的数据线(低4位)
D7~D4 ──→ 片1、片3 的数据线(高4位)
片选信号(利用 A13 做字扩展选择):
A13=0 → 选中 组0(片0 + 片1) → 地址 0000H~1FFFH
A13=1 → 选中 组1(片2 + 片3) → 地址 2000H~3FFFH
具体接法:
片0 的 /CS ← /A13 (A13取反) 片1 的 /CS ← /A13
片2 的 /CS ← A13 片3 的 /CS ← A13
(同一组的两片芯片片选同时有效,因为它们一起构成8位)
注意: A15 和 A14 未使用(或用于更高层译码/其他芯片),
本题起始地址 0000H,A15=A14=0 时选中本存储器。
完整连线示意图:
CPU
A15~A14 ──→ [高位译码(未画出)]
A13 ──→ 字扩展选择线
A12~A0 ──→ 所有芯片地址输入
D7~D4 ──→ 片1(组0高4位) / 片3(组1高4位)
D3~D0 ──→ 片0(组0低4位) / 片2(组1低4位)
R/W ──→ 所有芯片的读写控制
评分点:地址线连接正确(1分)、数据线位扩展连接正确(1分)、片选信号正确(1分)。
(3) 各芯片地址范围
| 芯片 | 位置 | A13 | 地址范围 |
|---|---|---|---|
| 片0 | 组0低4位 | 0 | 0000H ~ 1FFFH(低4位部分) |
| 片1 | 组0高4位 | 0 | 0000H ~ 1FFFH(高4位部分) |
| 片2 | 组1低4位 | 1 | 2000H ~ 3FFFH(低4位部分) |
| 片3 | 组1高4位 | 1 | 2000H ~ 3FFFH(高4位部分) |
验证:16K = 16384 = 4000H 个地址单元,0000H~3FFFH 正好 4000H 个。
🌱 大白话:把4片芯片想象成4个半宽的书架。两个半宽书架并排成一个全宽书架(位扩展=凑齐8位宽度),然后两个全宽书架上下叠起来(字扩展=增加容量)。CPU 通过 A13 决定去上层还是下层找书。
⚠️ 坑:
- 位扩展时,同组的两片芯片共用片选信号(同时工作),但连不同的数据线。
- 字扩展时,不同组的片选信号互斥(同一时间只有一组被选中)。
评分点:地址范围正确(2分)、验证总容量(0.5分)。
综合题 2:补码定点加减运算
已知:x = +10110 = +22,y = -01101 = -13。
(1) 求各补码
用 7 位表示(2 位符号 + 5 位数值)的双符号位补码:
- [x]补:x 为正数,补码 = 原码 → 00 10110
- [y]补:y = -01101,符号位为11,数值部分取反加1:01101→10010+1=10011 → 11 10011
- [-x]补:-x = -10110,同理:10110→01001+1=01010 → 11 01010
- [-y]补:-y = +01101,正数补码 = 原码 → 00 01101
评分点:4个补码各0.5分。
(2) 计算 x + y
0 0 1 0 1 1 0 [x]补
+ 1 1 1 0 0 1 1 [y]补
─────────────────
(1)0 0 0 1 0 0 1 最高位进位丢弃
↑↑
双符号位 = 00 → 正数,无溢出
结果:[x+y]补 = 00 01001 → 真值 = +01001 = +9。
验证:22 + (-13) = 9。正确。
评分点:竖式正确(2分)、判断无溢出(1分)。
(3) 计算 x - y = x + (-y)
0 0 1 0 1 1 0 [x]补
+ 0 0 0 1 1 0 1 [-y]补
─────────────────
0 1 0 0 0 1 1
↑↑
双符号位 = 01 → 正溢出!
结果:双符号位 = 01,两位符号不一致 → 正溢出。
原因:x - y = 22 - (-13) = 22 + 13 = 35,而 5 位数值补码能表示的最大正数为 +31(2^5 - 1 = 31),35 > 31,确实溢出。
🌱 大白话:两个正数加起来,结果大到”容器”装不下了,符号位被数值位挤到变成了”负”——两个哨兵(双符号位)意见不一致(01),说明出事了。
⚠️ 坑:
- 求 [-y]补 时,y = -01101,所以 -y = +01101,[-y]补 = 00 01101(正数!)
- 别把 [-y]补 和 [y]补 搞混——“对 y 取负”不等于”对 [y]补 简单取反”。正确方法是对 [y]补 连同符号位全部取反末位加1。
评分点:竖式正确(1.5分)、判断溢出及原因(1分)。
综合题 3:流水线设计与性能计算
(1) 时钟周期
最终答案:时钟周期 = 100 ns(取各段最长耗时)。
同步流水线要求所有段在同一时钟节拍下工作,所以时钟周期必须 >= 最慢那一段的耗时。五段中最慢的是 EX = 100ns,因此时钟周期取 100 ns。
🌱 大白话:流水线的速度被最慢的那一站”拖后腿”决定,就像生产线上最慢的工人决定了整条线的节拍。
(2) 流水 vs 串行时间
- 串行时间 = n x (各段之和) = 200 x (80+60+100+80+50) = 200 x 370 = 74000 ns。
- 流水时间 = k个周期填满 + (n-1)个周期产出 = [k + (n-1)] x T_clock = [5 + (200-1)] x 100 = 204 x 100 = 20400 ns。
评分点:串行时间(1分)、流水时间公式及结果(1.5分)。
(3) 加速比与效率
不考虑冒险时:
- 加速比 Sp = 串行时间 / 流水时间 = 74000 / 20400 ≈ 3.63。
- 流水线效率 = 实际加速比 / 理论最大加速比 = 3.63 / 5 = 72.5%。 (或者从利用率角度:效率 = n x k x T_段 / (k x (k+n-1) x T_clock),但此处各段耗时不同,用加速比法更直观。)
考虑 20 次数据冒险(每次停顿 1 个周期):
- 新流水时间 = (204 + 20) x 100 = 224 x 100 = 22400 ns。
- 新加速比 = 74000 / 22400 ≈ 3.30。
🌱 大白话:冒险就像流水线上某一站的工人突然要等上一站的零件,整条线被迫停下来等 1 拍。20 次冒险 = 白白浪费了 20 个周期,速度下降。
⚠️ 坑:
- 流水线时钟周期取最慢一段(100ns),不是平均值。
- 串行时各段按各自的实际耗时累加(370ns/条),不是用时钟周期算。
- 停顿周期直接加到总周期数上。
评分点:加速比(1分)、效率(1分)、含冒险的重算(1分)。
综合题 4:微指令设计
(1) 字段位数
最终答案:
- 下地址字段:7 位。(128 = 2^7,需要 7 位来寻址控制存储器的任意单元。)
- 操作控制字段(直接编码):20 位。(每个微命令占 1 位,20 个微命令需要 20 位。)
🌱 大白话:
- “下地址”就是”下一步翻到剧本第几页”,128 页的剧本需要 7 位编码。
- “直接编码”就是给每个微命令一个专属开关(1=开,0=关),20 个命令 = 20 个开关 = 20 位。
验证:20(操作控制)+ 7(下地址)= 27 位 < 32 位(微指令字长),剩余 5 位可用于判别字段/条件码等。合理。
评分点:下地址 7 位(1分)、操作控制 20 位(1分)、计算过程(0.5分)。
(2) 字段译码(分段编码)
将 20 个微命令分为 4 组,各组内互斥:
- 第 1 组:3 个互斥微命令 → 需 ceil(log2(3+1)) = 2 位(+1 是因为需要一个”全不选”状态)
- 第 2 组:5 个互斥微命令 → 需 ceil(log2(5+1)) = 3 位
- 第 3 组:5 个互斥微命令 → 需 ceil(log2(5+1)) = 3 位
- 第 4 组:7 个互斥微命令 → 需 ceil(log2(7+1)) = 3 位
操作控制字段总位数 = 2 + 3 + 3 + 3 = 11 位。
与直接编码相比:20 - 11 = 省了 9 位。
🌱 大白话:
- 直接编码:20 个开关排一排,每个命令有自己的开关,浪费空间。
- 分段编码:同一组里的命令是互斥的(同一时刻只选一个),所以用”编号”代替”开关”。3 个互斥命令 + 1 个”不选”= 4 种状态,2 位就够(00/01/10/11),而不需要 3 位(每个一个开关)。
⚠️ 坑:
- 每组编码位数要用 ceil(log2(n+1)),其中 +1 是”全不执行”状态——考试必须加这个 1。
- 不同组之间可以并行(同时各选一个微命令),组内互斥(同时只能选一个)。
评分点:各组编码位数(1.5分)、总位数(0.5分)、节省位数(0.5分)。
(3) 微程序执行一条机器指令的过程
┌─────────────────────────────────────────────────┐
│ 机器指令执行的微程序控制流程: │
│ │
│ ① 取指微程序(所有指令共用): │
│ MAR←PC → 读主存 → MDR←M[MAR] → IR←MDR → PC+1 │
│ │
│ ② 根据 IR 中的操作码, │
│ 经"微地址形成部件"找到对应微程序的入口地址 │
│ │
│ ③ 从控制存储器(CM)中读出第一条微指令 │
│ │
│ ④ 执行微指令: │
│ - 操作控制字段 → 产生微命令 → 控制数据通路 │
│ - 顺序控制字段 → 形成下一条微指令的地址 │
│ │
│ ⑤ 重复 ③④,直到该微程序的最后一条微指令执行完 │
│ │
│ ⑥ 回到①,取下一条机器指令 │
└─────────────────────────────────────────────────┘
关键概念对应:
- 一条机器指令 → 对应一段微程序(一串微指令)
- 一条微指令 → 在一个微周期内执行
- 微命令 → 微指令中的一个控制信号(如”打开ALU""选择寄存器R1”等)
🌱 大白话:执行一条机器指令就像演一幕戏——导演(控制器)翻开剧本(微程序),一步步念台词(微指令),每句台词里包含几个动作指令(微命令)。念完这一幕的所有台词,这条机器指令就执行完了,然后翻到下一幕。
评分点:取指过程(1分)、微地址形成(0.5分)、执行循环(1分)。
综合题 5:DMA 传输
(1) 磁盘数据传输率
详细步骤:
- 转速 7200 RPM → 每秒转数 = 7200/60 = 120 转/秒。
- 每转数据量 = 1024 扇区/磁道 x 512 字节/扇区 = 524288 字节/转 = 512 KB/转。
- 数据传输率 = 120 x 524288 = 62,914,560 字节/秒 ≈ 60 MB/s。
评分点:转速换算(0.5分)、每转数据量(0.5分)、最终传输率(1分)。
(2) CPU 处理中断的时间占比
详细步骤:
- 每个扇区 512 字节,传输一个扇区需要的时间:512 / 62914560 ≈ 8.138 x 10^(-6) 秒 ≈ 8.138 微秒。
- 或者直接算:转一圈 1/120 秒,一圈 1024 个扇区,一个扇区时间 = 1/(120 x 1024) ≈ 8.138 微秒。
- 每传完一个扇区,CPU 处理一次中断,开销 = 500 个时钟周期。
- CPU 主频 1GHz → 1 个时钟周期 = 1ns,500 个周期 = 500 ns = 0.5 微秒。
- 中断间隔 = 8.138 微秒(每传完一个扇区一次中断)。
- CPU 用于中断处理的时间占比 = 0.5 / 8.138 ≈ 6.14%。
🌱 大白话:磁盘每 8 微秒传完一个扇区就喊一声”搞定了”,CPU 花 0.5 微秒处理这个通知,然后继续干自己的活。CPU 只花了 6% 的时间在这件事上。
评分点:扇区传输时间(1分)、中断开销换算(0.5分)、占比计算(1分)。
(3) 三种 I/O 方式对比
| 方式 | CPU 效率 | 原因 |
|---|---|---|
| 程序查询 | 极低 | CPU 必须不断轮询设备状态,期间完全不能做其他事——“死等”。对于60MB/s的磁盘,CPU几乎100%时间在等。 |
| 程序中断 | 较低 | 每传输一个字节/字就中断一次,中断开销很大。若每次传 4 字节就中断,每秒要中断 ~1500 万次,CPU 不堪重负。 |
| DMA | 很高(~94%可用) | DMA 控制器自动完成批量传输,只在传完一整个扇区(512字节)后才中断一次。CPU 94% 的时间都在做自己的事。 |
为什么 DMA 特别适合磁盘: 磁盘是高速设备,数据来得又快又多。如果用中断方式,每个字/字节都要打断 CPU 一次,中断频率高到 CPU 啥也干不了。DMA 让专用硬件(DMA 控制器)接管总线搬运数据,CPU 只在传完一大块后做一次收尾处理,效率天壤之别。
🌱 大白话:
- 程序查询 = 你站在门口等快递,一步都不能走开。
- 程序中断 = 快递员每送来一个小包裹就按一次门铃,你每次都要跑去开门签收——包裹太多你累死。
- DMA = 快递员把一大车货直接卸到你仓库里,卸完才通知你签个字——你只跑一趟。
评分点:三种方式对比(2分)、解释DMA适合高速设备的原因(1分)。
综合题 6:多级中断与屏蔽字
(1) 四个中断源的屏蔽字
规则:屏蔽本级及更低、开放更高(1=屏蔽,0=开放)。
| 正在服务 | A位 | B位 | C位 | D位 | 屏蔽字 |
|---|---|---|---|---|---|
| A(最高) | 1 | 1 | 1 | 1 | 1111 |
| B | 0 | 1 | 1 | 1 | 0111 |
| C | 0 | 0 | 1 | 1 | 0011 |
| D(最低) | 0 | 0 | 0 | 1 | 0001 |
🌱 大白话:A 是最高级别,处理 A 时把所有人都挡在外面(1111);处理 B 时只让比自己大的 A 进来(0111);以此类推。
评分点:4个屏蔽字全对(2分),错一个扣0.5分。
(2) 中断响应与嵌套时间线
场景:T10 时,B 和 D 同时请求。
分析:
- B > D,CPU 先响应 B。
- B 的屏蔽字 = 0111 → A 位=0(开放),B/C/D 位=1(屏蔽)。
- T15 时,A 发出请求 → A 位=0(开放)→ A 会被响应,打断 B 的服务程序。
时间线:
时间: ... T10 T15 A完成后 B完成后
│ │ │ │
主程序: ════╪═══════════╪══════════════╪════════════════╪═══→
│ │ │ │
├─ B中断 ──→╪─(被A打断)────╪── 返回B继续 ──→│
│ │ │ │
│ ├── A中断 ───→│ │
│ │
└─ D排队等待(B完成后才能响应D)──────────────→ 响应D
处理顺序:B 开始 → A 打断 B → A 完成 → 返回 B → B 完成 → 响应 D。
评分点:判断先响应B(0.5分)、A打断B(1分)、时间线图(1分)。
(3) A 执行中 C 请求的分析
场景:在 (2) 的基础上,T20 时 A 正在执行,C 发出请求。
分析:
- A 正在执行,当前屏蔽字 = 1111(全屏蔽)。
- C 对应位 = 1(被屏蔽)→ C 不会被响应。
- C 必须等 A 执行完毕。
完整的中断嵌套过程:
时间: T10 T15 T20 T25(A完) T30(B完) T35(C完) T40(D完)
│ │ │ │ │ │ │
主程序: ═╪══════╪══════╪══════════════╪═══════════╪═══════════╪═══════════╪══→
│ │ │ │ │ │ │
├─ B ──╪──暂停────────────────╪── B续 ───→│ │ │
│ │ │ │ │ │ │
│ ├─ A ──╪──(C请求被拒)─→│ │ │ │
│ │ │ │
│ ├── C ─────→│ │
│ ├── D ────→│
详细解释:
- T10:B、D 同时请求 → 响应 B(B>D),设屏蔽字 = 0111
- T15:A 请求 → A 位=0(开放)→ 打断 B → 保存 B 现场 → 转 A 服务程序,设屏蔽字 = 1111
- T20:C 请求 → C 位=1(被屏蔽)→ C 不响应,C 挂起等待
- A 服务完成 → 恢复 B 现场 → 继续执行 B,屏蔽字恢复为 0111 → C 位=1,C 仍被屏蔽
- B 服务完成 → 恢复主程序现场 → 回到主程序,屏蔽字恢复为全开放(0000)
- 挂起的有 D 和 C。硬件排队优先级 C > D → 先响应 C,C 完成后再响应 D
- 完整顺序:A完成 → 返回B → B完成 → 返回主程序 → 响应C(C>D)→ C完成 → 响应D → D完成 → 回到主程序
🌱 大白话:中断嵌套就像医院急诊分级——
- 正在看普通病人B,来了急诊A → 立刻放下B去处理A(高打断低)
- 处理A时来了普通病人C → C优先级不够高,在外面排队等
- A处理完 → 回来继续看B → B看完 → 从排队里选优先级最高的 C 先看 → 最后看 D
⚠️ 坑:
- 每次进入/退出中断服务程序都要切换屏蔽字(进入时设为该级的屏蔽字,退出时恢复上层的屏蔽字)。
- 中断嵌套只允许”高打断低”——A 可以打断 B/C/D 的服务程序,但 C 不能打断 B(C < B)。
- 挂起的请求在回到主程序后,按硬件优先级重新排队。
评分点:判断C不响应(1分)、从屏蔽字角度解释(1分)、完整嵌套过程(1分)。
📊 自评与提分建议
分数段对照
| 得分区间 | 说明 | 下一步行动 |
|---|---|---|
| 85-100 | 概念扎实、计算熟练、综合题思路清晰 | 重点练习芯片扩展连线和微指令设计的变式题 |
| 70-84 | 基础不错,综合题有小失误 | 把补码溢出判断、流水线时间公式、中断屏蔽字各再练 3 题 |
| 55-69 | 概念理解有缺口,计算公式不熟 | 回看 02_a+b学习手册 第 2/3/5/8 章,背牢”必背公式” |
| < 55 | 零基础正常起点 | 先把 01_知识图谱与考点地图 的两棵大树看熟,再回来做选择+判断 |
各题型得分策略
| 题型 | 分值 | 得分策略 |
|---|---|---|
| 选择题 | 15分 | 纯记忆题,SRAM/DRAM区别必考,把10个知识点背牢可全拿 |
| 判断题 | 15分 | 常考”说反”陷阱(如RISC/CISC说反),看到”都""全部""一定”要警惕 |
| 简答题 | 15分 | 来自作业原题,流水线时空图/地址线计算/片选条件是固定套路 |
| 编程题 | 10分 | 实验课代码,理解线程创建/互斥锁/竞争条件三个概念即可 |
| 综合题 | 45分 | 大头!芯片扩展连线 + 补码运算 + 流水线性能 是必考三大件 |
易错点 Top 8
- SRAM 用触发器、DRAM 用电容——别说反
- 进位 ≠ 溢出——双符号位判断,两位不同才是溢出
- IEEE754 阶码偏移 127 + 隐藏位 1
- Cache 组数 = 行数 / 路数——别忘了除以路数
- 流水线时钟周期取最慢段——不是平均值
- 字段译码编码位数要 +1——多一个”全不选”状态
- DMA 在机器周期末响应、中断在指令执行末响应——别搞混
- 中断屏蔽字:1=屏蔽、0=开放——看清题目约定(有的教材反过来)
考前最后检查清单
- SRAM vs DRAM 的 5 个区别背住了吗?
- 补码加减法的竖式能一步不漏地写出来吗?
- 芯片扩展的三种类型和连线画法练过 2 遍以上吗?
- 流水线 Tk = k + (n-1) 公式和加速比 Sp = T_serial / T_pipeline 会用吗?
- 微指令直接编码 vs 字段译码的位数计算会算吗?
- DMA 传输率和中断占比的计算练过吗?
- 中断屏蔽字能闭着眼睛写出来吗?
- 编程题中 pthread 创建线程、加锁的基本流程看懂了吗?
所有题目已独立解算并核对,数值与步骤均可放心对照。祝考试顺利!