I/O 控制方式

四种 I/O 控制方式不是四个并列的选项,而是一条由同一个问题推着走的演进链:

CPU 太快、外设太慢,如何让 CPU 少为 I/O 浪费时间。

每一种方式都在回答”这次又把 CPU 从哪一段工作里解放出来了”,四种方式因此可以用两个维度贯穿始终:数据由谁搬,以及 CPU 每隔多久被打扰一次。抓住这两条,四种方式的全部优缺点都是推论。

机制

程序直接控制方式

CPU 向控制器发出 I/O 命令后,不断地循环读取状态寄存器,检查设备是否就绪;就绪后由 CPU 把一个字从控制器的数据寄存器搬到内存,然后重复这个过程,直到全部数据传送完毕。

它的问题不在于慢,而在于”轮询”这个动作本身:CPU 在等待期间什么都不能干,只能一遍遍地问”好了没”。这种等待称为忙等。

由此得到一个反直觉但高频的结论:程序直接控制方式下,请求 I/O 的进程不会进入阻塞态——它一直占着 CPU 在轮询,始终处于运行态。

中断驱动方式

CPU 发出 I/O 命令后就转去执行其他程序,不再轮询。设备准备好之后,由控制器向 CPU 发出中断请求,CPU 响应中断、转去执行中断服务程序,把数据从控制器搬到内存,然后返回原程序。

这一步解放的是”等待”:CPU 在设备工作期间可以做别的事,进程也主动放弃 CPU 进入阻塞态,等 I/O 完成后被唤醒。

但数据仍然是 CPU 一个字一个字搬的,而且每传送一个字就要中断一次。对磁盘这种一次要传几千字节的设备,中断次数高得无法接受。

DMA 方式

DMA(直接存储器存取)的核心是让数据不再经过 CPU:在 DMA 控制器的控制下,数据直接在设备与内存之间成块传送。

DMA 控制器中有四类寄存器:命令/状态寄存器 CR(接收命令、反映状态)、内存地址寄存器 MAR(存放数据在内存中的地址)、数据寄存器 DR(暂存数据)、数据计数器 DC(记录还剩多少字节要传)。

完整过程分三段:

① 预处理——CPU 执行驱动程序,把内存起始地址、传送字节数、传送方向写进 DMA 控制器的寄存器,然后启动 DMA。这一段是 CPU 干的活。

② 数据传送——DMA 控制器接管总线,成块地在设备与内存之间搬数据,全程不经过 CPU。CPU 在此期间执行别的程序,请求 I/O 的进程处于阻塞态。

③ 后处理——传送完毕后 DMA 向 CPU 发出中断,CPU 执行中断服务程序做善后(检查错误、唤醒进程等)。

这一步解放的是”搬运”:CPU 只在头尾各出现一次,中间几千字节的搬运完全不参与。中断频率从”每个字一次”降到”每个数据块一次”。

通道控制方式

通道是一个专门的处理机,有自己的指令系统。 CPU 只需向通道发出一条指令,指明通道程序在内存中的位置和要操作的设备,通道就会自主执行这段通道程序,完成一整批 I/O 操作(可能涉及多个数据块、甚至多台设备),全部完成后才向 CPU 发出一次中断。

这一步解放的是”组织”:连”这批数据分几次搬、每次搬到哪”都不用 CPU 操心了。中断频率进一步降到”每一组数据块一次”。

四种方式的演进因此有一条清晰的主线:

轮询解放不了任何东西 → 中断解放了”等待” → DMA 解放了”搬运” → 通道解放了”组织”。

CPU 干预频率随之从”每个字且全程忙等”降到”每个字”、“每个块”、“每组块”。

边界

程序直接控制方式不会使进程阻塞

疑问点:哪些 I/O 方式会导致用户进程进入阻塞态

  1. 下列几种 I/O 方式中,会导致用户进程进入阻塞态的是( )。 I. 程序直接控制 II. 中断方式 III. DMA 方式

答案 II、III。

判据是”进程有没有主动交出 CPU”:

程序直接控制方式下,进程一直在执行轮询循环——它没有交出 CPU,也没有等待任何事件被唤醒,始终处于运行态。它确实在”等”,但那是占着 CPU 在等。

中断方式和 DMA 方式下,进程发出 I/O 请求后就主动放弃了 CPU,进入阻塞队列等待 I/O 完成中断把它唤醒,这才是阻塞态的定义。

这条辨析容易错,是因为直觉上会觉得”轮询更像在等待”。 但阻塞态的定义是”因等待某事件而暂时无法运行”,轮询的进程随时都在运行,只是在做无用功。

DMA 三阶段中 CPU 与进程各处什么状态

疑问点:DMA 预处理与后处理阶段的执行主体与进程状态

  1. DMA 传输前需要进行预处理,传输后需要进行后处理,则下列说法中正确的是( )。 A. 预处理程序运行在用户态,后处理程序运行在内核态 B. 负责预处理和后处理程序的进程都是请求 I/O 的进程 C. 预处理阶段不需要 CPU 参与,后处理阶段需要 CPU 参与 D. 预处理阶段请求 I/O 的进程处于运行态,后处理阶段处于阻塞态

答案 D。 把三阶段和”谁在跑、跑在哪个态”一一对上,四个选项就都能判:

预处理阶段,CPU 正在执行设备驱动程序去设置 DMA 寄存器。这段代码是由请求 I/O 的那个进程通过系统调用陷入内核后执行的,所以该进程处于运行态,且运行在内核态。

传送阶段,进程已阻塞,DMA 控制器在搬数据。

后处理阶段,DMA 发出中断,CPU 转去执行中断处理程序。此时请求 I/O 的进程还没有被唤醒,仍处于阻塞态——正是这个中断处理程序之后才会把它唤醒。

逐项排除:A 错在”预处理运行在用户态”——设置 DMA 寄存器是特权操作,只能在内核态。B 错在”后处理也是请求 I/O 的进程”——后处理是中断处理程序,中断可能打断任何一个正在运行的进程,与请求 I/O 的那个进程无关。C 错在”预处理不需要 CPU”——预处理恰恰全靠 CPU。

中断处理过程中哪些由硬件完成

疑问点:中断处理过程中一定不由硬件完成的工作

  1. 在接收和处理一个输入设备的中断的过程中,一定不由硬件来完成的工作是( )。 A. 判断产生中断的类型 B. CPU 模式由用户态切换到内核态 C. 主机获取设备输入 D. 保存用户程序的断点

答案 C。

判据是:中断响应阶段的动作由硬件(中断隐指令)完成,中断处理阶段的动作由软件完成。

B 保存断点、切换到内核态、跳转到中断入口,这三件事都属于”中断响应”,由 CPU 硬件在响应中断的那一瞬间自动完成,没有任何一条指令对应它们(因此称为”隐指令”)。D 同理。

A 判断中断类型在向量中断中由硬件通过中断向量识别中断源,因此不是”一定不由硬件完成”——题干问的是”一定不”,只要存在由硬件完成的情形就排除。

C 主机获取设备输入指的是把数据从控制器的数据寄存器读进内存,这必须由中断处理程序(软件)执行读指令来完成,硬件不会自己搬。在中断驱动方式下这正是 CPU 要干的那件事。

DMA “不经过 CPU” 的准确含义

“不经过 CPU”说的是数据不流经 CPU 的寄存器,而不是”CPU 完全不受影响”。

DMA 控制器与 CPU 共享同一条总线。DMA 传送时要占用总线,CPU 在这段时间内无法访问内存——这称为周期窃取。因此 DMA 传输仍然会拖慢 CPU,只是拖慢的程度远小于让 CPU 自己搬。

准确表述是:DMA 使数据传送不再消耗 CPU 的指令周期,但仍然消耗总线带宽。

中断驱动方式与 DMA 方式的中断次数

这是最能体现两者差别的一条:

中断驱动方式每传送一个字就中断一次。 传 1000 个字就要中断 1000 次,每次中断都要保存现场、执行中断服务程序、恢复现场,开销巨大。

DMA 方式在整个数据块传送完毕后才中断一次。 传 1000 个字仍然只中断一次。

这就是为什么块设备(磁盘)用 DMA、字符设备(键盘)用中断:键盘本来就是一个字符一个字符地来,用 DMA 没有意义;磁盘一次几千字节,用中断会把 CPU 淹没。

对照速查

程序直接控制中断驱动DMA通道控制
数据由谁搬CPUCPUDMA 控制器通道
传送单位字字数据块一组数据块
数据流向设备→控制器→CPU→内存设备→控制器→CPU→内存设备→控制器→内存(不经 CPU)设备→控制器→内存
CPU 干预频率极高(全程忙等)高(每个字)中(每个块)低(每组块)
进程是否阻塞否,一直运行态是是是
解放了什么—等待搬运组织
DMA 三阶段谁在干请求 I/O 的进程
预处理CPU(内核态执行驱动程序)运行态
数据传送DMA 控制器阻塞态
后处理中断处理程序仍是阻塞态
DMA 控制器四类寄存器作用
CR 命令/状态接收命令、反映状态
MAR 内存地址数据在内存中的地址
DR 数据暂存数据
DC 数据计数还剩多少字节
中断过程谁完成
保存断点、切换到内核态、跳转入口硬件(中断隐指令)
判断中断类型可由硬件(向量中断)
把数据从控制器读进内存软件(中断处理程序)

考点

  • 四种方式的演进主线:解放等待 → 解放搬运 → 解放组织
  • 程序直接控制方式不会使进程阻塞(占着 CPU 忙等,仍是运行态)
  • 中断驱动每个字中断一次,DMA 每个数据块中断一次
  • DMA 三阶段中,预处理和后处理都要 CPU;后处理时进程仍处于阻塞态
  • 后处理由中断处理程序完成,不一定是请求 I/O 的进程
  • DMA 不经过 CPU 指的是不经过 CPU 寄存器,但仍占总线(周期窃取)
  • 中断过程中保存断点与模式切换由硬件,获取设备输入由软件
  • 块设备配 DMA,字符设备配中断

链接