CPU是如何跟I/O设备交互的呢?比如说键盘、鼠标、硬盘这类外部设备。简单来说,就是CPU怎么读取到键盘输入的内容,或者如何将数据写入硬盘。
因此,核心内容可以归纳为两个问题:
- CPU通过什么与I/O设备交互?
- CPU有多少种方式与I/O设备交互?
现在,让我们开始逐一探讨。
CPU通过什么与I/O设备交互?
CPU想要与I/O设备交互,首先得能识别到设备。这就需要给每个I/O设备分配一个唯一的标识,即地址。
需要注意的是,CPU并非直接给具体的物理设备分配地址,而是给设备控制器中的寄存器分配地址。这是为什么呢?
让我们先通过一个简单的键盘输入例子来理解这个过程:
- 键盘控制器(一个集成在主板上的芯片,如Intel 8042)会定时(例如每隔10ms)扫描键盘的输入状态。
- 当检测到有按键被按下时,控制器会将对应的键码数据送入指定的寄存器中。
- CPU读取该寄存器中的内容,从而完成一次与键盘的交互。

这里的控制器是负责管理特定I/O设备的硬件芯片。而寄存器则是控制器内部用于暂存数据、状态或命令的小型存储单元,主要分为三类:
- 数据寄存器:用于存放I/O设备输入或输出的数据,例如键盘的键码就存在这里。
- 状态寄存器:用于存放表示设备当前状态的标志位。例如,其中一位可能表示“数据寄存器是否就绪”,当数据有效时,该位被置为1。
- 命令寄存器:用于接收来自CPU的指令,以控制I/O设备的行为,如启用/禁用设备、启动传输等。
CPU通过为这些寄存器分配特定的内存地址或I/O端口地址来访问它们。以传统PC架构中的键盘为例:
- 数据寄存器地址:
0x60
- 状态/命令寄存器地址:
0x64(通过读写操作区分:读操作用于访问状态寄存器,写操作用于访问命令寄存器)
因此,CPU正是通过这些设备控制器及其寄存器来与I/O设备进行交互的。它向命令寄存器发送指令来控制设备,读取状态寄存器来判断设备状态,并从数据寄存器读写数据。
不同类型的设备有其专用的控制器,例如:
- 键盘:8042微控制器
- 硬盘:SATA/AHCI控制器
- 显卡:GPU(图形处理器)
这便解答了第一个问题。接下来,我们探讨更核心的交互方式。
CPU与I/O设备的交互方式
这个问题本质上是:CPU在什么时机去处理I/O设备的数据传输请求?因为CPU可能正在执行其他程序的指令,当I/O设备需要服务时,CPU是立即中断手头工作,还是让它等待?
这引出了CPU与I/O设备之间几种主要的交互方式,其效率和处理逻辑各不相同,主要可分为以下五种:
- 程序查询方式
- 程序中断方式
- 直接存储器存取方式(DMA)
- 通道控制方式
- I/O处理机方式
1. 程序查询方式
这是最简单也最低效的方式。简单说,就是CPU轮询(Polling)I/O设备。
工作流程如下:
- CPU启动某个I/O设备(例如,程序需要从键盘读取输入)。
- CPU进入循环,不断地读取该设备状态寄存器,检查其是否“准备就绪”。
- 如果未就绪,CPU就空转等待,继续查询。
- 如果就绪,CPU才从数据寄存器中读取或写入数据。
- 这个过程持续到本次I/O操作完成为止。

这种方式的最大缺点是CPU利用率极低。在从启动查询到结束查询的整个时间段内,CPU被独占,无法执行任何其他任务,只能“傻等”。这就好比你在微信聊天时,一旦弹出键盘,整个应用就卡住,直到你输入完成才能接收新消息。
由于其效率低下,这种方式在现代通用计算机系统中已基本被淘汰。但它逻辑简单、可预测性强、硬件成本低,因此在一些任务单一、实时性要求不高的单片机或嵌入式系统中仍有应用。
2. 程序中断方式
为了解决程序查询方式“空等”和“阻塞”的缺点,程序中断方式应运而生。其核心思想是:不等了!让I/O设备准备好后再主动“通知”CPU。
基本流程如下:
- CPU启动I/O设备后,继续执行原有程序。
- I/O设备准备就绪后,向CPU发送一个中断请求信号。
- CPU在执行完当前指令后,检测到中断请求,于是暂停当前程序的执行。
- CPU保存当前程序的运行现场(将寄存器、程序计数器PC等压入堆栈),这个过程称为保护现场。
- CPU转而执行一段专门处理该中断的中断服务程序,在其中完成与I/O设备的数据交换。
- 中断服务程序执行完毕后,CPU恢复现场,然后返回到被中断的程序继续执行。
中断方式的引入极大地提高了系统的并发性和响应能力。CPU不必空等,可以并行处理其他任务;I/O设备也可以在准备数据的同时不阻塞系统。
然而,中断机制本身也带来了复杂性,例如中断嵌套和现场保护/恢复的开销。考虑一个场景:CPU正在处理一个磁盘中断(需要复制大量数据),此时用户按下了键盘。如果磁盘中断处理过程中不允许新的中断(单重中断),键盘响应就会延迟,用户可能感觉卡顿。
为了允许更高优先级的中断可以“插队”,现代系统通常采用多重中断机制。这需要在中断服务程序中精细地控制开中断和关中断的时机。简单来说,在保护现场和恢复现场这类关键操作期间,需要暂时“关中断”以防止现场被破坏;而在执行实际的设备服务时,可以“开中断”以允许响应更紧急的请求。

中断方式是现代计算机系统的基石,x86、ARM等所有现代CPU都内置了完善的中断机制。它非常适合处理鼠标、键盘等低速、随机、数据量小的I/O请求。
3. 直接存储器存取方式
虽然中断方式提高了效率,但每次数据传输都需要CPU参与(执行中断服务程序),对于大量、连续的数据传输(如硬盘读写、网络数据包收发),频繁的中断依然会成为瓶颈。
于是,直接存储器存取方式出现了。DMA的核心思想是:在I/O设备与主内存之间建立直接的数据通路,让一个专用的DMA控制器来负责数据传输,从而解放CPU。
工作流程如下:
- CPU对
DMA控制器进行初始化,告知它:数据传输方向(I/O到内存或反之)、目标内存起始地址、要传输的数据量,并启动相应的I/O设备。
- CPU将这些初始化工作完成后,就可以去处理其他任务。
- I/O设备准备就绪后,直接向
DMA控制器发送请求。
DMA控制器接管系统总线,控制数据在I/O设备和内存之间直接流动,无需CPU干预。
- 当所有数据传输完成后,
DMA控制器向CPU发送一个传输完成中断,通知CPU进行后续处理。

你可以把CPU想象成经理,把DMA控制器想象成快递员。经理(CPU)只需要填好快递单(初始化:收件人地址-内存地址,包裹大小-数据量),剩下的取件、运输、派送(数据传输)全部交给快递员(DMA控制器)完成。快递员干完活后给经理打个电话(发送完成中断)报告一下即可。
现代操作系统如Linux、Windows都深度依赖DMA技术。它特别适用于硬盘、显卡、网卡等需要高速、大批量数据传输的设备,能显著提升系统整体性能。
4. 通道控制方式
DMA方式虽然解放了CPU,但CPU仍需为每次传输进行详细的初始化设置。在大型机或高性能服务器中,I/O操作极其频繁且复杂,CPU的这部分开销依然可观。
通道控制方式进一步放权。通道是一个比DMA控制器更“智能”的专用处理器,它拥有自己的简单指令集,可以执行一小段叫做通道程序的指令序列。
工作流程如下:
- CPU不再关心具体的传输细节,它只需在内存中准备好一段通道程序。这段程序描述了完整的I/O操作序列(例如:从磁盘A的某扇区读取数据,写入内存某区域,然后校验等)。
- CPU执行一条极其简单的I/O指令,如
SIO(启动I/O),指向对应的通道号和内存中通道程序的起始地址。
- 指定的通道接收到命令后,自行从内存取出通道程序并执行,独立完成整个复杂的I/O操作。
- 操作完成后,通道向CPU报告状态。
这就好比经理(CPU)不再填写详细的快递单,而是直接写一份工作方案(通道程序)交给一个项目经理(通道)。项目经理会自己看懂方案,并指挥下属(设备)完成所有具体工作。
通道根据其数据传输策略,又可分为几种类型,以应对不同特性的设备:
- 字节多路通道:以字节为单位,以轮转方式为多个低速设备(如终端、键盘)服务。
- 数组多路通道:以数据块为单位,以轮转方式为多个中速设备(如磁带机)服务。
- 选择通道:一次独占性地为一个高速设备(如磁盘)服务,直到其请求完成。

5. I/O处理机方式
这是I/O子系统演化的终极形态。I/O处理机本身就是一个功能完整的专用计算机,拥有处理器、内存、甚至独立的操作系统。CPU将整个I/O子系统完全剥离出去,只进行最高级别的协调。
在这种情况下,CPU与I/O处理机之间的交互,更像是两台计算机之间通过网络或高速总线进行通信。CPU只需发出高级别的I/O请求(例如“处理这个视频流”),I/O处理机便会调用其内部的软硬件资源,自主完成所有底层操作,包括错误处理、数据转换、协议解析等。
这种模式在现代片上系统(SoC)中非常常见。例如,手机芯片中的图像信号处理器(ISP)、音频数字信号处理器(DSP)、安全协处理器等,都可以看作是一种高度专业化的I/O处理机。它们独立处理摄像头数据、音频流或生物特征验证,极大减轻了主CPU的负担。
总结
回顾这五种CPU与I/O设备的交互方式,我们可以清晰地看到一条技术演进路径:CPU的参与度越来越低,专业化分工越来越细,系统效率越来越高。
- 程序查询:CPU深度参与,为I/O放弃一切。
- 程序中断:CPU间歇参与,“随叫随到”。
- DMA:CPU指导参与,“只动口不动手”。
- 通道控制:CPU下达任务,“给个方案自己干”。
- I/O处理机:CPU协同参与,“一句话需求全搞定”。
这个过程很像一个公司的成长:创始人(CPU)起初事必躬亲,随着业务复杂,他开始雇佣专员(DMA控制器)、任命经理(通道)、最终成立拥有自主权的子公司(I/O处理机)。通过不断放权和专业化分工,创始人得以从琐事中解放出来,专注于核心战略决策,从而让整个组织(计算机系统)的运行达到最高效能。
理解这些底层交互机制,对于深入学习操作系统内核、系统编程乃至进行计算机体系结构层面的优化都至关重要。希望这篇详解能帮助你构建起清晰的知识脉络。