Skip to content

2011年 408 操作系统 第 26 题

操作系统2011年选择题2分

题目

用户程序发出磁盘 I/O 请求后,系统的正确处理流程是( )。

错因

B

把中断处理放在驱动之前——但中断是 I/O 完成后硬件主动发的信号,不可能在驱动启动 I/O 之前就先发中断。顺序倒置。

C

让用户程序绕过 syscall 直接调驱动——不可能,用户态访问不到内核态的驱动代码,必须经过 syscall 切到内核才能调用驱动。把驱动放第二位违反了用户态/内核态的边界。

D

同 C 的错(用户程序直接调驱动),还把中断放在 syscall 之前——逻辑混乱,无法成立。

总解析

I/O 请求处理的标准流程(自顶向下处理 → 自底向上响应):

1. 用户程序           ← 调用 read(fd, ...)
   ↓ trap
2. 系统调用处理程序   ← 切到内核态、参数校验、分发到具体设备

3. 设备驱动程序       ← 把通用请求翻译成磁盘控制器命令、启动 I/O
   ↓ 等待
   (硬件传输数据)
   ↑ 完成
4. 中断处理程序       ← 响应磁盘"传输完毕"中断、唤醒等数据的进程
   ↑ 驱动收尾
   ↑ 数据返回用户进程

关键约束

约束说明
用户 → syscall用户态不能直接进内核,必须经 trap
syscall → 驱动驱动是内核代码,syscall 在内核态调用驱动接口
驱动 → 中断驱动启动 I/O 后等待,硬件完成后发中断 → 中断处理

中断处理在最后——它是"硬件完成后才回到 OS"的那一步,不可能放在前面。任何把中断放在驱动之前的流程都不成立。

逐项核对:

  • A 用户 → syscall → 驱动 → 中断:✓ 正确顺序
  • B:中断放在驱动前 ✗
  • C:用户绕过 syscall 直接调驱动 ✗
  • D:同 C + 中断在 syscall 前 ✗

最终答案是 A

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题