I/O控制方式

要让设备与CPU、内存高效传输数据,操作系统需选择合适的I/O控制方式。不同控制方式在“CPU参与程度”“数据传输效率”上有明显差异,下面依次讲解轮询、中断、DMA这三种核心方式。

一、轮询方式(Programmed I/O,PIO)

早期计算机采用轮询方式控制I/O,核心逻辑是CPU不断主动查询设备状态,直到设备就绪后再传输数据。这种方式下,CPU几乎全程参与,设备未就绪时CPU也无法做其他事,效率较低,但实现简单。

轮询方式的流程可通过以下流程图直观理解:

flowchart LR
    A[CPU:发起I/O请求(如读硬盘)] --> B[CPU:反复查询“设备状态寄存器”]
    B --> C{设备是否就绪?}
    C -- 否 --> B
    C -- 是 --> D[CPU:通过“数据寄存器”传输数据(如从硬盘读数据到内存)]
    D --> E[CPU:继续执行其他任务或新的I/O请求]

具体过程为:

  1. 发起请求:CPU需要设备执行操作(如让硬盘读一块数据),向设备控制器发送命令。
  2. 循环查询状态:CPU不断读取“设备状态寄存器”的值,判断设备是否“就绪”(比如硬盘是否已把数据准备好)。
  3. 传输数据:若设备就绪,CPU直接参与数据传输(如把硬盘数据寄存器中的数据,逐字节或逐块复制到内存)。
  4. 完成操作:数据传输完毕,CPU继续执行后续任务。

类比生活场景:就像你给朋友打电话问“文件准备好了吗”,朋友没准备好,你就挂了电话,过几秒又打过去问,直到朋友说“准备好了”,你再去取文件——这期间你(CPU)的时间都花在“反复询问”上,没法做其他事。

二、中断方式

为解决轮询方式中“CPU空等设备”的问题,中断方式让设备主动通知CPU“我就绪了”,而非CPU反复查询。这样CPU在设备未就绪时,可去执行其他任务,只有设备发出“中断信号”时,CPU才会暂停当前任务,处理I/O传输,大幅提升了CPU利用率。

中断方式的流程可通过以下流程图直观理解:

flowchart LR
    A[CPU:发起I/O请求(如读键盘)] --> B[CPU:继续执行其他任务(无需等待)]
    C[设备:准备好数据后,触发“中断信号”] --> D[CPU:暂停当前任务,响应中断]
    D --> E[CPU:执行“中断处理程序”,通过数据寄存器传输数据(如从键盘读入字符)]
    E --> F[CPU:恢复之前的任务,或执行新任务]

具体过程为:

  1. 发起请求并异步执行:CPU向设备发I/O命令后,无需等待,直接去执行其他程序(比如同时运行的文字处理软件)。
  2. 设备准备与中断触发:设备自行准备数据(如键盘等待用户按键,硬盘读取指定块);当数据准备好,设备通过“中断线”向CPU发“中断信号”。
  3. CPU响应中断:CPU收到中断信号后,会暂停当前正在执行的任务,跳转到“中断处理程序”(操作系统提前编写好的、处理该设备中断的代码)。
  4. 数据传输与任务恢复:中断处理程序负责完成数据传输(如把键盘数据寄存器中的字符读入内存);传输完毕后,CPU恢复之前暂停的任务,继续执行。

类比生活场景:你给朋友发消息说“准备好文件了告诉我”,然后去忙别的事;朋友准备好后给你打电话(中断),你接电话(响应中断)去取文件,取完再回去忙之前的事——这样你(CPU)的时间被更高效利用了。

三、DMA方式(Direct Memory Access)

中断方式解决了“CPU空等”的问题,但数据传输仍需CPU全程参与(比如从设备到内存的每一字节,都要CPU逐个复制),当传输大量数据(如硬盘连续读1GB数据)时,CPU会因频繁处理中断和复制数据,陷入“I/O瓶颈”。

DMA方式的核心是让“DMA控制器”直接管理设备与内存的数据传输,CPU只需初始化传输参数,后续无需参与具体传输过程,从而彻底解放CPU,让其专注于计算任务。

DMA方式的流程可通过以下流程图直观理解:

flowchart LR
    A[CPU:向DMA控制器初始化参数(如传输方向、内存起始地址、传输长度、设备地址)] --> B[CPU:继续执行其他任务]
    C[DMA控制器:向设备发命令,开始数据传输]
    D[设备:准备数据,直接与DMA控制器交互]
    E[DMA控制器:直接将设备数据传输到内存(或反之),无需CPU参与]
    F{传输完成?}
    D --> E
    E --> F
    F -- 否 --> D
    F -- 是 --> G[DMA控制器:触发“中断信号”通知CPU]
    G --> H[CPU:响应中断,做后续处理(如标记数据传输完成)]

具体过程为:

  1. CPU初始化DMA参数:CPU要传输大量数据时(如从硬盘读100个块到内存),会向DMA控制器设置关键参数:
  • 传输方向(如“从设备到内存”);
  • 内存的起始地址(数据要存到内存的哪个位置);
  • 传输的总长度(要传多少字节/块);
  • 设备的地址(如硬盘的某个数据块位置)。
  1. CPU释放控制权,执行其他任务:参数设置完毕后,CPU就不再参与后续传输,去执行其他计算任务(如运行游戏、处理表格)。
  2. DMA控制器主导传输:DMA控制器向设备发命令,让设备准备数据;设备与DMA控制器直接交互,数据通过“数据总线”在设备和内存间传输(无需经过CPU)。
  3. 传输完成后通知CPU:当所有数据传输完毕,DMA控制器向CPU发中断信号;CPU响应中断,做一些“收尾工作”(如确认数据传输成功,更新系统状态),但无需参与具体的字节级复制。

用生活场景类比:你要搬家(大量数据传输),请了搬家公司(DMA控制器),你只需告诉搬家公司“从哪个地址搬到哪个地址,搬多少东西”(初始化参数),然后你去上班(CPU执行其他任务);搬家公司自己联系货车、搬运(DMA传输数据),搬完后给你打电话(中断),你再去确认(CPU收尾)——这样你(CPU)的时间几乎没被搬家(I/O传输)占用。

三种I/O控制方式的核心差异在于“CPU参与数据传输的程度”:轮询方式CPU全程参与且空等,效率最低;中断方式CPU无需空等,但仍需参与数据复制;DMA方式CPU仅初始化,彻底脱离数据传输过程,是大数据量传输的高效方案。随着设备速度提升(如SSD、高速网卡),DMA已成为现代操作系统I/O控制的核心方式。