长题综合题实践
PPT 讲通用原则;本页按题型整理历年实践。不要把长题按年份孤立地刷,而要先判断它属于哪一种模型。
题目关键信息
读题时先回答:
- 有哪些对象?
- 哪些量会变化?
- 哪些量是初始值或不变量?
- 什么事件会触发变化?
草稿不抄全文,只保留:
对象:
初始状态:
不变量:
触发事件:
转移规则:
待求量:
常见题型
| 题型模型 | 常见对象 | 草稿载体 |
|---|---|---|
| 数据流 | 指令、寄存器、数据通路、表达式 | 数据流和字段表 |
| 地址映射 | Cache、TLB、页表、inode、磁盘块 | 地址分解链 |
| 事件状态 | 调度、页面置换、中断、DMA | 时间线和状态表 |
| 结构约束 | 树、图、排序、哈夫曼、目录 | 结构图和不变量 |
| 协议状态机 | TCP、可靠传输、路由 | 报文/序号/窗口表 |
模型选对后,题干中的数字和条件才有位置可放。
一个简单的自检方法是:如果读完题目后,草稿上还没有出现“对象、初值、规则”这三类词,说明你还停留在阅读,还没有开始建模。
数据流题:先写语义,再写编码
这类题常见于 2010、2013、2016、2017、2018、2022、2026 的指令系统、数据通路和流水线大题。
固定流程:
读字段或读图 → 写语义动作 → 画数据流 → 编码/填控制信号
看到“某指令执行后寄存器变成什么”“填写控制信号”“用若干条指令实现表达式”,草稿第一行先写:
读谁 → 算什么 → 写回谁
这一步先解决操作数方向和数据去向,避免一上来就陷入二进制位串。
指令格式、寻址与表达式
2010 年第 43 题、2013 年第 44 题、2016 年第 45 题、2022 年第 43 题 和 2026 年第 43 题 都把主存/寄存器宽度、字段解释、机器指令执行或表达式翻译组合在一起。它们应该串成:
指令格式 → 字段含义 → 执行一条指令 → 设计指令序列
实现 y=16x-5 时先写:
x 地址 → load → x 值 → 左移 4 位 → 加 -5 → store → y 地址
最后才把每一步填回 R/I/M 型字段。按字节编址只决定主存单元宽度,不能直接推出寄存器宽度。
这些题的数字和图形虽然不同,但都可以还原成“读取什么、计算什么、写回什么”的数据流;先写语义动作,再处理位字段、寻址或时序。不同年份分别侧重有效地址、流水线阶段、异常影响和 ISA 边界,适合对照训练。
数据通路与控制信号
2013 年第 44 题、2017 年第 44 题、2018 年第 44 题、2025 年第 44 题 和 2026 年第 44 题 代表数据通路与控制信号题。不要先背控制信号的 0/1,先问:
| 信号 | 自然语言问题 |
|---|---|
| MARSrc | 内存地址来自 PC 还是 ALU |
| ALUASrc | ALU A 端接 PC 还是寄存器 |
| ALUBSrc | ALU B 端接寄存器、常数还是立即数 |
| RegWr | 本周期是否写通用寄存器 |
| RegWSrc | 写回数据来自 ALU 还是 MDR |
| RegDst | 写哪个寄存器字段 |
再按本周期动作倒推信号:取指需要读 M[PC] 和计算 PC+2,左移需要选择立即数、写回 ALU 结果和目标寄存器。
它们的图和信号名称不同,但都遵循“先确定阶段动作,再确定硬件选择”:2013 年可练多周期阶段,2017 年可练动态调度,2018 年可练流水线时钟,2025 年可练控制器与 Cache 联动,2026 年可练具体控制信号表。
复盘时问:错在字段切分、操作数方向、扩展方式、阶段时序还是写回路径?
地址映射题:画完整访问链
这类题包括 2010、2013、2014、2015、2018、2019、2021、2023、2024、2026 的 Cache、TLB、分页和文件系统综合题。
统一画成:
虚拟/逻辑地址
→ 页号、块号、块内偏移
→ TLB 或页表
→ 物理地址
→ Cache 的组号/标记
→ 主存或磁盘数据块
每一层都问:
- 地址如何分字段?
- 这一层缺失时访问什么?
- 结果如何成为下一层输入?
看到“地址为……,问命中/缺页/访问次数”,草稿第一行先写:
地址 = 哪个页/块?当前走到哪一层?这一层失败后去哪?
不要先套总公式。先确定访问链,最后才累计次数或拆地址字段。
TLB、页表与 Cache
可用 2010 年第 44 题、2014 年第 45 题、2018 年第 44 题、2019 年第 46 题 和 2024 年第 45 题 递进练习。TLB 缺失、缺页和 Cache 缺失不是同一种“没找到”:它们发生阶段不同,处理者和额外访存次数也不同。
可以按难度递进练习:2010 年先练 Cache/TLB 命中路径,2014 年加入页表和缺页,2018 年把访问过程画成完整时序,2019 年综合 Cache 与虚存,2024 年专门区分“地址转换阶段检测什么”和“Cache 阶段检测什么”。
文件 inode 与索引块
2012 年第 46 题、2014 年第 46 题、2016 年第 47 题、2019 年第 46 题、2022 年第 45 题 和 2026 年第 46 题 都可拆成:
inode 号 → inode 表盘块
文件偏移 → 逻辑块号 + 块内偏移
逻辑块号 → 直接/一级间接/二级间接
目录删除 → 目录项、inode、数据块、位图一致更新
先统一单位:块大小、inode 大小、每块 inode 数、地址项容量。删除非空目录不能只删目录项,还要释放子文件和目录自身涉及的所有元数据。
共同方法都是先画“目录项 → inode → 数据块”的关系,再统一单位,最后处理删除、共享或访问次数。
看到“最多访问多少个块/表项”,逐层列访问,不要凭印象相加。
事件状态题:事件不等于立即变化
适用于 2011、2012、2014、2015、2017、2018、2020、2021、2026 的调度、中断、DMA 和页面置换题。
通用表格:
| 时刻/步骤 | 事件 | 当前状态 | 规则更新 | 下一状态 |
|---|
每行写完整链条:
事件 → 触发条件 → 状态更新 → 下一选择
看到“到达、完成、时间片、中断、请求、唤醒”等词,草稿第一行先写:
下一次事件是谁?事件发生的时刻能不能立即改变状态?
这能防止把“事件已经发生”误写成“调度/处理已经完成”。
处理机调度
2012 年第 45 题、2014 年第 47 题、2017 年第 46 题、2020 年第 45 题、2021 年第 45 题 和 2026 年第 45 题 都要区分到达、运行完成、时间片用完、阻塞和唤醒分别触发什么状态转移。题目若额外规定“只有时钟中断时才触发抢占”,到达事件就不会自动抢占;时间片耗尽和被高优先级进程抢占也可能采用不同的优先级更新规则。
2012 年练基本状态转移,2014 年练“必做动作”和状态边界,2017 年练时间片参数对调度的影响,2020 年练父子进程和调度事件的组合,2021 年练时间片轮转中的队列变化。每题都用同一张“时刻—事件—队列—下一进程”表。
中断与 DMA
对照 2015 年第 45 题、2016 年第 44 题、2018 年第 43 题、2020 年第 44 题 和 2021 年第 45 题,都要拆开:
产生请求 → CPU 允许中断 → 指令结束响应
→ 硬件保存断点 → 服务程序保存其余现场
2015 年重点是异常类型和现场保存,2016 年重点是“缺页/除零/DMA 结束”分类,2018 年重点是中断允许状态,2020 年重点是可屏蔽与不可屏蔽中断,2021 年重点是多重中断的响应顺序。它们共同训练的是时序,而不是孤立定义。
DMA 请求的是总线使用权,DMA 控制器负责数据搬运;CPU 负责初始化和结束处理。不要把“请求资源”和“实际传输”混为一谈。
页面置换
页面置换题要在每次访问后更新页框内容、访问位和替换指针。可对照 2014 年第 45 题、2018 年第 45 题 和 2023 年第 43 题。只在最后一步画结果,容易漏掉中间一次替换造成的后续影响。
结构约束题:每一步检查不变量
树、图、排序、哈夫曼和文件目录题的共同做法是:
操作前状态 → 执行操作 → 检查不变量 → 操作后状态
| 题型 | 关键不变量 | 历年例子 |
|---|---|---|
| 二叉搜索树/AVL | 左小右大、平衡因子受限 | 2009 年第 5 题、2010 年第 5 题、2013 年第 6 题、2015 年第 4 题、2019 年第 4 题 |
| B 树 | 关键字顺序、结点容量、孩子范围 | 2009 年第 8 题、2012 年第 9 题、2013 年第 10 题、2018 年第 8 题、2022 年第 8 题 |
| 快速排序 | 每趟后枢轴位置确定 | 2010 年第 10 题、2014 年第 11 题、2019 年第 10 题、2023 年第 11 题、2024 年第 8 题 |
| 哈夫曼树 | 每轮合并当前最小两个权值 | 2010 年第 6 题、2015 年第 3 题、2017 年第 6 题、2018 年第 5 题、2023 年第 4 题 |
| 图遍历/拓扑 | 已访问集合和边约束 | 2010 年第 8 题、2011 年第 7 题、2014 年第 7 题、2016 年第 7 题、2018 年第 8 题 |
| 文件目录 | 目录项、inode、块和位图一致 | 2016 年第 47 题、2019 年第 46 题、2026 年第 46 题 |
不要只追踪题目问的一个结点或一个元素;每一步都检查整体结构是否仍满足定义。
看到“插入、删除、合并、遍历一趟后”,草稿第一行先写:
操作前必须满足什么?操作后哪些关系一定不能被破坏?
协议状态机题:先写不变量
TCP 综合题可对照 2010 年第 47 题、2011 年第 47 题、2012 年第 47 题、2013 年第 47 题、2015 年第 47 题、2018 年第 47 题、2020 年第 47 题、2022 年第 47 题、2023 年第 47 题、2025 年第 47 题 和 2026 年第 47 题。先写:
数据按字节消耗序号
SYN/FIN 各消耗一个序号
ACK = 期望收到的下一个序号
发送窗口 = min(cwnd, rwnd)
再按握手、数据传输、ACK 到达、拥塞窗口变化、挥手的顺序建表。报文段数量不等于序号消耗量,ACK 本身不消耗序号。
看到 seq、ack、窗口或 RTT,草稿第一行先写四条不变量,而不是先画报文:数据按字节占序号,SYN/FIN 各占一个序号,ACK 指向下一个期待序号,发送窗口取两个窗口的较小值。
2010、2013 年适合练连接建立和确认号,2015、2018 年加入窗口与重传条件,2020、2022 年适合练拥塞控制和 RTT,2025、2026 年再把握手、数据传输和连接释放放进同一条时间线。
多小问之间:显式传递中间结果
常见依赖链:
指令字段 → 有效地址 → 数据流
页号/块号 → 访问层级 → 访问次数
调度结果 → 下一时刻队列 → 总调度次数
SYN/数据长度 → ACK/FIN 序号 → 释放时刻
每得到一个中间结果,立即写回“当前状态”栏,并标记它会被哪些小问使用。这样即使某一小问算错,也能保住后续步骤分。
五种草稿模板
数据流:输入 → 运算 → 写回
地址链:地址 → 字段 → 映射 → 下一层
时间线:时刻 → 事件 → 规则 → 状态
结构图:操作前 → 操作 → 不变量 → 操作后
协议表:方向 → seq/ack → 窗口 → 下一状态
刷题时先强制选择一种模板,再开始计算。模板选对后,长题中的条件会自然落位。
如果一题同时出现两种模型,按“外层过程 + 内层计算”组合:例如调度题用时间线,某次访存再用地址链;TCP 题用协议表,窗口计算再用公式。不要强行用一张表承载所有信息。
复盘模板
每道长题保留四份材料:
- 压缩题干:5~8 行,只写对象、初值、规则、问题;
- 规则表:把所有“如果……那么……”单独列出;
- 状态表/数据流:保存关键中间结果;
- 错误归因:知识缺口、漏读条件、单位错误、状态未更新或计算失误。
复盘目标是缩短“题干 → 模型”的时间,而不是背下某一年的答案。
按科目落笔:让过程分可见
综合题的最终数值只是结果,阅卷还要能看出关键依据。每个小问至少留下“公式/规则 + 代入或状态变化 + 结论”三段;不能只写一个没有来源的数字。
| 科目 | 落笔顺序 | 必查项目 |
|---|---|---|
| 数据结构 | 画结构 → 标每次操作 → 写遍历/序列 | 下标、结点容量、平衡/有序不变量 |
| 组成原理 | 字段切分 → 语义动作 → 数据通路/地址计算 | 位数、字节/字、符号扩展、时序 |
| 操作系统 | 列事件时间线 → 更新队列/页框/块 → 汇总 | 抢占条件、访问顺序、单位和边界 |
| 计算机网络 | 列方向和序号 → 更新 ACK/窗口 → 判断状态 | 字节长度、SYN/FIN、窗口取最小值 |
训练顺序:先单模型,再跨模型
不要把 2009—2026 年题目按年份连续刷完就结束。建议每个模型至少完成三轮:
- 识别轮:限时读题,只写对象、初值、规则和模板,不求算完;
- 推演轮:遮住答案,按事件/数据流逐步更新状态,写出可复核过程;
- 迁移轮:把同一模型的不同年份混排,再做一题含两个模型的综合题。
每轮结束记录“建模耗时、计算耗时、检查耗时”和唯一主错误。这样能区分是知识不会,还是状态表没有维护好。
交卷前的反向检查
先从答案反查题目要求,再从最后状态反查每次转移:答案的对象、单位、编号和小问顺序必须一一对应;每个数字都能在草稿中找到公式或上一步状态来源。若无法反查,通常意味着漏写条件,不能只靠直觉确认。