Appearance
408
操作系统
中断、异常与系统调用
一、定位信息
- 所属圈层:核心层
- 前置知识:了解CPU用户态/内核态的概念(OS-01-03),了解指令执行周期
- 知识网络位置:中断是OS运行的核心驱动力——时钟中断驱动进程调度,I/O中断驱动设备管理,系统调用是用户程序请求OS服务的唯一途径。本单元与CPU调度(OS-02-06)、进程切换(OS-02-08)直接关联
- 考点热度等级:H级(高频重点)——近5年选择题出现≥4次,综合题也频繁涉及
二、知识点讲解
2.1 中断(Interrupt)
定义:来自CPU外部的事件,与当前执行的指令无关,是异步的。
来源:外部设备(如键盘输入、磁盘I/O完成)、时钟定时信号
处理过程:
- 外部设备向CPU发送中断请求信号
- CPU在每条指令执行末尾检查中断请求
- 若有中断且中断开启(IF=1),则保存当前进程上下文
- 跳转到中断处理程序(根据中断向量表查找入口地址)
- 执行中断处理
- 恢复上下文,返回原程序继续执行
分类:
- 可屏蔽中断:可通过关中断指令屏蔽,如I/O中断
- 不可屏蔽中断(NMI):无法屏蔽,如电源掉电、硬件故障
2.2 异常(Exception)
定义:由CPU内部事件引起,与当前执行的指令直接相关,是同步的。
- 类型:
| 类型 | 触发原因 | 处理方式 | 举例 |
|---|---|---|---|
| 故障(Fault) | 执行指令时发现的可恢复错误 | 修复后重新执行该指令 | 缺页异常、段错误 |
| 陷阱(Trap) | 有意执行的特殊指令 | 执行下一条指令 | 系统调用(trap指令) |
| 终止(Abort) | 不可恢复的严重错误 | 终止进程 | 硬件故障、非法指令 |
2.3 系统调用(System Call)
定义:用户程序请求操作系统内核服务的编程接口,是用户态进入内核态的主动通道。
- 本质:执行一条特殊的陷入指令(
trap/syscall/int 0x80),触发从用户态到内核态的切换 - 常见系统调用分类:
| 类别 | 功能 | 例子 |
|---|---|---|
| 进程控制 | 创建/终止/等待进程 | fork()、exit()、wait() |
| 文件管理 | 文件读写/创建/删除 | open()、read()、write() |
| 设备管理 | 设备请求/释放 | ioctl()、read()、write() |
| 信息维护 | 获取/设置系统信息 | getpid()、time() |
| 通信 | 进程间通信 | pipe()、shmget() |
- 系统调用的执行步骤:
- 用户程序将系统调用号和参数放入指定寄存器
- 执行陷入指令(
trap),CPU切换到内核态 - OS根据系统调用号查找系统调用表,找到对应处理函数
- 执行内核函数,完成服务
- 将返回值放入寄存器,执行中断返回指令
- CPU回到用户态,用户程序继续执行
2.4 中断、异常、系统调用三者对比
| 维度 | 中断 | 异常 | 系统调用 |
|---|---|---|---|
| 触发源 | CPU外部设备 | CPU内部(当前指令) | 用户程序主动执行trap指令 |
| 同步/异步 | 异步 | 同步 | 同步 |
| 与指令关系 | 与当前指令无关 | 与当前指令直接相关 | 有意执行 |
| 模式切换 | 用户态→内核态 | 用户态→内核态 | 用户态→内核态 |
| 处理后行为 | 继续执行下一条指令 | 故障→重新执行;陷阱→继续下一条 | 继续执行下一条指令 |
| 典型例子 | 键盘输入、时钟 | 缺页、除零 | fork()、read() |
三、记忆与理解辅助
- 口诀:"中断外来异步生,异常内部同步成,系统调用用户请"——三者的触发源和同步特性
- 异常三种类型口诀:"故修(故障修复重执行),陷续(陷阱执行下一条),终止(终止不可恢复)"
- 系统调用流程一句话:"放参数→执行trap→查表→执行→返回"五步完成一次系统调用
- 中断 vs 异常核心区别:中断是"外面的事打扰了你",异常是"你自己做的事出了问题"
四、例题与精解
例题1(基础巩固)
题目:下列事件中,属于异常(Exception)的是( )
A. 时钟中断 B. 键盘输入中断 C. 缺页故障 D. 磁盘I/O完成中断
命题意图:考查中断与异常的区分。
精解:
- 审题分析:核心区分点——中断来自CPU外部(异步),异常来自CPU内部(同步)
- 解题思路:逐项判断事件的触发源
- 完整步骤:
- A选项:时钟中断来自外部时钟硬件,属于中断,不是异常
- B选项:键盘输入中断来自外部键盘设备,属于中断
- C选项:缺页是CPU执行访存指令时发现页不在内存中,由当前指令触发,属于异常(故障类)
- D选项:磁盘I/O完成中断来自外部磁盘控制器,属于中断
- 方法反思:判断中断还是异常,关键看事件源——外部设备→中断,CPU内部执行指令→异常
答案:C
例题2(中等提升)
题目:用户程序调用 printf("Hello") 的过程中,以下说法正确的是( )
A. printf直接执行系统调用,将字符串写入屏幕 B. printf是库函数,通过系统调用(如write)请求内核服务 C. printf运行在内核态,直接操作显示设备 D. printf不需要系统调用,直接在用户态完成输出
命题意图:考查库函数与系统调用的关系。
精解:
- 审题分析:需要区分库函数和系统调用的关系
- 解题思路:
printf是C标准库函数,不是系统调用本身;实际输出需要通过内核的I/O服务 - 完整步骤:
- A选项:不准确。
printf本身是库函数,不是直接的系统调用。它内部会调用write系统调用 - B选项:正确。
printf是标准库函数,在用户态运行,当需要实际输出时,通过write等系统调用请求内核完成I/O操作 - C选项:错误。
printf运行在用户态,只有系统调用陷入内核后才在内核态执行 - D选项:错误。屏幕输出涉及I/O操作,必须通过内核完成,需要系统调用
- A选项:不准确。
- 方法反思:库函数(如
printf)是用户态代码,系统调用(如write)是进入内核态的通道。库函数可能封装了系统调用,但不等于系统调用
答案:B
五、考情分析
- 考查频次:近5年约4–5次
- 常见题型:选择题为主,综合题中偶尔涉及系统调用过程
- 分值占比:2分/题(选择题)
- 命题趋势:近年倾向于考查中断/异常/系统调用三者的区分,以及系统调用的完整执行流程。可能与进程调度(时钟中断驱动)结合出题
六、易错点提醒
错误表现:将系统调用等同于库函数 错误原因:
printf、malloc等库函数经常被误认为系统调用 正确理解:库函数运行在用户态,系统调用是进入内核态的服务请求。库函数可能封装了系统调用(如printf内部调write),但不是系统调用本身错误表现:认为缺页异常处理后会执行下一条指令 错误原因:混淆了故障(Fault)和陷阱(Trap)的返回行为 正确理解:缺页属于故障类异常,处理完成后重新执行触发缺页的那条指令,而不是执行下一条
错误表现:认为中断可以在任意时刻发生 错误原因:忽略了CPU在关中断状态下不响应中断 正确理解:中断响应需要CPU开中断(IF=1),且在每条指令执行末尾才检查中断请求
错误表现:混淆中断向量表和系统调用表 错误原因:两者都是"查表跳转",但用途不同 正确理解:中断向量表存放各类中断/异常处理程序的入口地址;系统调用表存放各系统调用对应的内核处理函数地址
七、来源标注
- 依据2026考研统考408大纲
- 依据《计算机操作系统》(汤小丹/汤子瀛版)第1章
- 依据《操作系统概念》(Silberschatz版)第1–2章
- 依据王道考研408操作系统辅导讲义