408错题日记5
错题日记 05 · 操作系统
[OS] 多道程序的”失序”代价
Question
下列选项中,不属于多道程序设计的基本特征的是()。
A. 制约性 B. 间断性 C. 顺序性 D. 共享性
My Answer
我的选择:B 理由:误以为”间断性”是个坏词。
Correct Answer
正确答案:C(顺序性) 正解:
- 单道程序的特征:封闭性、顺序性、可再现性。程序 A 跑完,再跑程序 B,这叫顺序。
- 多道程序的特征:多道、宏观上并发、微观上交替。因为大家都在抢资源,互相制约,导致执行过程走走停停(间断性)。因此,多道程序彻底失去了顺序性。
Error Pattern
望文生义——误以为”间断性”是个坏词,所以选了 B。实际上,正是因为多道程序在内存里并发执行,大家走走停停(等待 I/O 或 CPU 时间片),才会表现出间断性。
Core Concept
- 多道程序设计
- 单道 vs 多道特征对比
Expected Context
- 笔记路径:小何的OS弱点、进程与线程
- 检索关键词:多道程序设计特征、间断性、顺序性、制约性、共享性、并发失去顺序性、单道特征(封闭性/顺序性/可再现性)
Fix Plan
“并发”的同义词就是”大家一起乱成一锅粥(失去顺序)“。只要有并发,就绝对没有顺序性。
同类题预警:若题目改为”下列选项中,属于单道程序设计的基本特征的是”,答案会完全反转——选顺序性。单道程序串行执行,具备封闭性、顺序性、可再现性三大特征。
变式自测:多道程序设计的三大基本特征是?(提示:A 是单道特征,C 是分时特征,D 是实时特征。答案:制约性、间断性、共享性(B)。)
[OS] 系统特征的张冠李戴
Question
下列关于操作系统的叙述中,正确的是()。
A. 批处理操作系统必须在响应时间内处理完一个任务 B. 实时操作系统必须在规定时间内处理完来自外部的事件
My Answer
我的选择:A 理由:依然把”响应时间”和”批处理”缝合在了一起。
Correct Answer
正确答案:B 正解:
- 批处理系统:追求的是吞吐量(周转时间),它根本没有响应时间的概念(因为没有人和它交互)。
- 分时系统:追求的是响应时间(你敲击键盘,屏幕出字的时间)。
- 实时系统:追求的是规定时间(Deadline 截止时间)。
Error Pattern
肌肉记忆报错——依然把”响应时间”和”批处理”缝合在了一起。
Core Concept
- 批处理 / 分时 / 实时系统的核心目标
Expected Context
- 笔记路径:小何的OS弱点、进程与线程
- 检索关键词:批处理系统吞吐量、分时系统响应时间、实时系统截止时间 Deadline、四大 OS 阵营
Fix Plan
核心绑定:批处理 ⇔ 吞吐量;分时 ⇔ 响应时间;实时 ⇔ 规定时间(截止时间)。
同类题预警:此题与”小何的OS弱点”模块三(四大 OS 阵营)中的”批处理 ⇔ 吞吐量”绑定完全一致。
变式自测:“分时操作系统追求的核心目标是响应时间”——这句话对吗?(答案:对。分时系统通过时间片轮转,在秒级内响应用户操作。)
[OS] 引发态切换的”元凶”(错题群)
Question
典型错题群映射:
- Q19【2013 真题】:会导致用户态切换到内核态的操作是?→ 整数除以零(异常)切换;read 系统调用(Trap)切换。
- Q22【2015 真题】:不可能导致态切换的是?→ NOT R0(通用寄存器算术运算)不切换,纯用户态操作。(之前错过完全一样的题)
My Answer
我的选择:各题错误(且是重复踩坑)。 理由:没有分清”谁在请求”和”谁在处理”。
Correct Answer
正确答案:见 Question 中的映射结论(除零、read → 切换;NOT R0 → 不切换)。 正解: 之所以反复出错,是因为没有分清”谁在请求”和”谁在处理”。
- 异常(Exception / 内中断):如整数除零、缺页。用户程序自己算着算着崩溃了,硬件大喊一声”出大问题了”,强行把方向盘交给内核态。
- 系统调用(Syscall / 访管 Trap):如 read() 读文件。用户程序遇到自己没权限干的事(碰硬盘),于是主动执行一句 Trap 指令。这句指令执行在用户态,但它的结果是触发硬件陷入内核态。
Error Pattern
没有分清”谁在请求”和”谁在处理”。
Core Concept
- 用户态 → 内核态切换
- 异常
- 系统调用
Expected Context
- 笔记路径:小何的OS弱点、进程与线程、指令系统
- 检索关键词:用户态 → 内核态切换、异常(除零/缺页)、系统调用 Trap、read、NOT R0、执行地 vs 处理地四象限
Fix Plan
只要是在用户态发生了”自己搞不定”或”出格”的事情(不管是故意请求系统调用,还是不小心除以零),都会立刻切换到内核态。只有像 NOT R0 这种在自己沙盒里自娱自乐的安全操作,才不会引起切换。
同类题预警:本题的核心陷阱与”小何的OS弱点”模块二(执行地 vs 处理地四象限矩阵)中象限 Ⅲ(混合触发区)完美对应——事件发生在用户态,但处理在内核态。
变式自测:以下哪个操作不会导致用户态切换到内核态?(提示:纯算术操作,不涉及任何特权资源。答案:MOV R1, R2(C)。)
[OS] 系统调用 vs 系统内部机制
Question
【2021 年统考真题】下列选项中,通过系统调用完成的操作是()。
A. 页置换 B. 进程调度 C. 创建新进程 D. 生成随机整数
My Answer
我的选择:B 理由:混淆了”OS 帮我做的事”与”OS 自己要做的事”。
Correct Answer
正确答案:C(创建新进程) 正解: 判断一个操作是不是”系统调用”,就问自己:“我写 C/C++ 代码的时候,能不能调一个函数主动干这件事?”
- 创建新进程:对应 C 语言的 fork() 函数,应用程序主动求 OS → 是系统调用。
- 进程调度、页置换:操作系统的”后台管家”偷偷做的事,应用程序既看不见,也无法主动请求 → 不是系统调用。
- 生成随机整数:调库函数 rand() 算一算就行,连内核都不用进,纯用户态搞定。
Error Pattern
混淆了”OS 帮我做的事”与”OS 自己要做的事”。系统调用是操作系统提供给应用程序(程序员)的接口;进程调度是 OS 内部的后台机制,程序员无法通过代码强行请求。
Core Concept
- 系统调用
- 库函数
- OS 内部机制
Expected Context
- 笔记路径:小何的OS弱点、进程与线程
- 检索关键词:系统调用 Syscall、库函数 rand、fork、进程调度、页置换、OS 内部机制、应用程序主动请求
Fix Plan
“能主动写代码调用的”是系统调用——但注意:rand() 是库函数,不是系统调用!它底层也可能调 getpid() 之类的系统调用来获取熵,但作为程序员视角,rand() 属于 C 标准库的封装,不是裸系统调用。D 选项”生成随机整数”的关键在于——用户态算随机数不需要进内核。
同类题预警:此题与前一题(引发态切换的元凶)形成递进关系——前一题:什么会引发切换?(异常、中断、Trap);这一题:什么是通过系统调用(Trap 的一种)?(只有应用程序主动请求的才算)。页置换会引发缺页异常(切换),但缺页异常是硬件触发的,不是应用程序主动调用的,所以页置换不是系统调用。
变式自测:以下哪个操作属于系统调用?(提示:read() 对应 C 语言中的文件读取函数。答案:读取文件 read()(C)。)
[OS] 中断处理的”接力棒”机制
Question
【2022 年统考真题】执行系统调用的过程涉及下列操作,其中由操作系统完成的是()。
I. 保存断点和程序状态字 II. 保存通用寄存器的内容 III. 执行系统调用服务例程 IV. 将 CPU 模式改为内核态
A. I、III | B. II、III | C. II、IV | D. II、III、IV
My Answer
我的选择:C 理由:硬件与软件的边界模糊,以为前几秒操作系统是有意识的。
Correct Answer
正确答案:B(II、III) 正解:这是一场硬件和软件的完美接力赛:
- 第一棒(纯硬件自动完成,OS 还没介入):保存断点(PC)和程序状态字(PSW)(对应 I);将 CPU 模式改为内核态(对应 IV);根据中断号查中断向量表,找到 OS 的入口地址。
- 第二棒(操作系统接管执行):OS 做的第一件事就是保存通用寄存器的内容(保护现场)(对应 II);OS 执行具体的系统调用服务例程(如去读磁盘)(对应 III);处理完毕,OS 恢复通用寄存器,执行 IRET 指令返回。 所以由 OS 完成的是 II、III。
Error Pattern
硬件与软件的边界模糊——只要发生中断/系统调用,前几秒钟操作系统是没有意识的!必须靠纯硬件(硅电路)强制把大门撞开。
Core Concept
- 中断处理流程
- 硬件 vs 软件分工
- 系统调用
Expected Context
- 笔记路径:小何的OS弱点、进程与线程、指令系统
- 检索关键词:中断处理流程、硬件 vs 软件分工、保存断点 PC/PSW、保存通用寄存器、切内核态、IRET、中断向量表
Fix Plan
硬件隐指令负责”换衣服(切内核态)+ 记地址(PC/PSW)“;OS 软件负责”存包裹(通用寄存器)+ 干正事(服务例程)”。
同类题预警:注意区分两种”保存”——保存断点(PC)和 PSW 是硬件自动完成的(让 CPU 知道中断结束后回到哪);保存通用寄存器是 OS 负责的(保护被中断程序的运算中间结果不被覆盖)。
变式自测:中断响应过程中,由硬件(而不是操作系统)完成的操作包括?(提示:保存通用寄存器是 OS 进入中断程序后做的。答案:保存断点、关中断、修改 PSW 的模式位(B)。)
[OS] 中断向量表的数据结构
Question
【2023 年统考真题】在操作系统内核中,中断向量表适合采用的数据结构是()。
A. 数组 B. 队列 C. 单向链表 D. 双向链表
My Answer
我的选择:B 理由:逻辑脱节,没意识到中断发生时系统处于十万火急的状态。
Correct Answer
正确答案:A(数组) 正解:
- 什么是中断向量表?它就像是内存里的”114 查号电话簿”,左边是中断类型号(0 号除零,14 号缺页…),右边是对应的处理程序内存地址(中断向量)。
- 为什么必须是数组?硬件给出一个整数编号(如中断号 14),必须在 O(1) 时间内极速算出处理程序的内存地址。只有数组(连续物理内存)能实现”首地址 + 中断号 × 表项大小”的瞬间定位寻址。
- 为什么不能是链表或队列?这两种数据结构需要从头开始一个个检查,时间复杂度 O(n),根本不适合中断处理这种对速度要求极高的场景。
Error Pattern
逻辑脱节——中断发生时,系统处于十万火急的状态,怎么能用队列或者链表去慢慢遍历找处理程序的地址呢?
Core Concept
- 中断向量表
- 数组的随机存取特性
Expected Context
- 笔记路径:小何的OS弱点、栈与队列、指令系统
- 检索关键词:中断向量表、数组随机存取 O(1)、中断号、就绪队列 O(n)、随机存取 vs 顺序存取
Fix Plan
中断向量表就像电话簿,必须是数组才能快速查找。任何需要遍历的结构都不行!
同类题预警:这道题表面考 OS 中断,实际考的是数据结构的随机存取 vs 顺序存取:需要按编号瞬间定位 → 数组(随机存取 O(1));不需要按编号查找,只需按顺序处理 → 队列(如就绪队列、I/O 请求队列)。
变式自测:进程管理中的就绪队列适合采用哪种数据结构?(提示:就绪队列中的进程需要按顺序被调度。答案:队列(B)。)
术语表
- 多道程序设计:内存中同时存放多道程序,在管理程序的控制下交替执行,提高 CPU 利用率。
- 单道程序特征:封闭性、顺序性、可再现性——程序独占系统资源。
- 批处理系统:追求吞吐量最大化,无交互性,无响应时间概念。
- 分时系统:通过时间片轮转提供人机交互,追求响应及时性(秒级)。
- 实时系统:在严格截止时间(Deadline)内完成任务,追求实时性(毫秒级)。
- 系统调用(Syscall):操作系统提供给应用程序的接口,应用程序通过 Trap 指令主动进入内核态请求服务。
- 库函数:编程语言自带的函数封装,如 rand(),可能在底层调用系统调用,但从编程视角看不必进内核。
- 异常(Exception):内中断,指令执行过程中由 CPU 内部检测到的错误(除零、缺页、越权等),强制切换到内核态处理。
- 中断向量表:存储中断号与中断处理程序地址对应的表,采用数组结构实现 O(1) 查找。
- 硬件 vs 软件分工:中断响应时,硬件保存 PC/PSW、切内核态;OS 保存通用寄存器、执行服务例程。
相关链接
cd ..