《计算机组成原理》模拟卷 A + 小白深度解析

命题依据:老师透露的考试结构 + 白中英教材例题风格 + 课堂/实验/作业重点题型。 满分 100 分,建议用时 120 分钟。先合上解析自己做一遍,再看后半部分的详解。 解析对 0 基础特别友好:每题都给【最终答案】【详细步骤】【🌱大白话理解】【⚠️最容易错的坑】【评分点】。 配套:先读 01_知识图谱与考点地图 与 02_a+b学习手册,做完本卷如有疑问回去定位章节。


第一部分 试卷(请先独立作答)

一、选择题(每题 1.5 分,共 15 分)

  1. SRAM 和 DRAM 的根本区别在于( )。 A. SRAM 用电容存储、DRAM 用触发器存储 B. SRAM 用触发器(双稳态电路)存储、DRAM 用电容存储 C. SRAM 需要刷新、DRAM 不需要 D. SRAM 速度更慢、DRAM 速度更快

  2. 早期冯·诺依曼计算机是以( )为中心的。 A. 存储器 B. 运算器 C. 控制器 D. 输入输出设备

  3. 字长为 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

  4. IEEE754 单精度浮点数的阶码偏移量(偏置值)为( )。 A. 64 B. 127 C. 128 D. 1023

  5. 主存与 Cache 之间的三种映射方式中,块冲突概率最高的是( )。 A. 全相联映射 B. 直接映射 C. 组相联映射 D. 三者相同

  6. “只有取数(LOAD)和存数(STORE)指令才能访问存储器”是( )的典型特征。 A. CISC B. RISC C. 向量机 D. 微程序控制器

  7. 相对寻址方式中,操作数的有效地址 EA =( )。 A. A B. (A) C. (PC) + A D. (变址寄存器) + A

  8. 与程序中断方式相比,DMA 方式响应请求的时机是( )。 A. 一条指令执行结束时 B. 一个机器周期(总线周期)结束时 C. 一段程序结束时 D. 任意时刻立即

  9. 微程序控制器中,控制存储器(CM)存放的是( )。 A. 机器指令 B. 微指令 C. 操作数 D. 程序

  10. 在流水线中,如果后一条指令需要使用前一条指令的运算结果,这种相关称为( )。 A. 结构相关 B. 数据相关(RAW) C. 控制相关 D. 名称相关

二、判断题(每题 1.5 分,共 15 分)

对的写 T,错的写 F。

  1. ( )DRAM 因为使用电容存储,电荷会泄漏,所以需要定期刷新。
  2. ( )补码中,正数的补码等于其原码,负数的补码等于其反码末位加 1。
  3. ( )Cache 对所有程序员都是透明的,程序员不需要也不能直接管理 Cache。
  4. ( )DMA 传输期间,CPU 完全停止工作,等待 DMA 传完才继续。
  5. ( )中断响应发生在一条指令执行结束之后。
  6. ( )硬连线控制器比微程序控制器速度更快,但修改设计更困难。
  7. ( )总线带宽指的是总线的物理根数(总线宽度)。
  8. ( )流水线的理论最大加速比等于流水段数 k。
  9. ( )在存储层次中,Cache 解决的是速度问题,虚拟存储器解决的是容量问题。
  10. ( )RISC 指令长度可变,CISC 指令长度固定。

三、简答题(每题 5 分,共 15 分)

  1. (流水线时空图) 某指令流水线分为 IF(取指)、ID(译码)、EX(执行)、MEM(访存)、WB(写回)共 5 段,每段耗时 1 个时钟周期。请画出连续执行 4 条指令(I1~I4,无数据相关)的流水线时空图。

  2. (地址线与数据线) 某存储芯片容量为 4K x 8 位。请问该芯片有多少根地址线?多少根数据线?简述你的计算方法。

  3. (芯片地址分配) 某系统 CPU 有 16 根地址线(地址范围 0000HFFFFH)。现有一块 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位00000H ~ 1FFFH(低4位部分)
片1组0高4位00000H ~ 1FFFH(高4位部分)
片2组1低4位12000H ~ 3FFFH(低4位部分)
片3组1高4位12000H ~ 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(最高)11111111
B01110111
C00110011
D(最低)00010001

🌱 大白话: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 ────→│

详细解释:

  1. T10:B、D 同时请求 → 响应 B(B>D),设屏蔽字 = 0111
  2. T15:A 请求 → A 位=0(开放)→ 打断 B → 保存 B 现场 → 转 A 服务程序,设屏蔽字 = 1111
  3. T20:C 请求 → C 位=1(被屏蔽)→ C 不响应,C 挂起等待
  4. A 服务完成 → 恢复 B 现场 → 继续执行 B,屏蔽字恢复为 0111 → C 位=1,C 仍被屏蔽
  5. B 服务完成 → 恢复主程序现场 → 回到主程序,屏蔽字恢复为全开放(0000)
  6. 挂起的有 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

  1. SRAM 用触发器、DRAM 用电容——别说反
  2. 进位 ≠ 溢出——双符号位判断,两位不同才是溢出
  3. IEEE754 阶码偏移 127 + 隐藏位 1
  4. Cache 组数 = 行数 / 路数——别忘了除以路数
  5. 流水线时钟周期取最慢段——不是平均值
  6. 字段译码编码位数要 +1——多一个”全不选”状态
  7. DMA 在机器周期末响应、中断在指令执行末响应——别搞混
  8. 中断屏蔽字:1=屏蔽、0=开放——看清题目约定(有的教材反过来)

考前最后检查清单

  • SRAM vs DRAM 的 5 个区别背住了吗?
  • 补码加减法的竖式能一步不漏地写出来吗?
  • 芯片扩展的三种类型和连线画法练过 2 遍以上吗?
  • 流水线 Tk = k + (n-1) 公式和加速比 Sp = T_serial / T_pipeline 会用吗?
  • 微指令直接编码 vs 字段译码的位数计算会算吗?
  • DMA 传输率和中断占比的计算练过吗?
  • 中断屏蔽字能闭着眼睛写出来吗?
  • 编程题中 pthread 创建线程、加锁的基本流程看懂了吗?

所有题目已独立解算并核对,数值与步骤均可放心对照。祝考试顺利!