Skip to content

输入输出应用程序接口

考情分析

I/O 应用接口的分类了解即可,阻塞/非阻塞 I/O 的区别偶有考查。🔥 低频。

键盘按一个字符就算一次输入,磁盘却是一整块一整块地读——设备差异这么大,应用程序总不能为每种设备写一套代码,所以 OS 要在中间提供统一的接口。

I/O 接口的分类

操作系统为不同类型的设备提供不同的 I/O 接口:

接口类型适用设备操作特点
字符设备接口键盘、打印机、串口get/put 逐字符操作
块设备接口磁盘、SSDread/write 以块为单位
网络设备接口网卡socket 接口

阻塞 I/O vs 非阻塞 I/O

类型行为适用场景
阻塞 I/O进程发出 I/O 请求后挂起等待,直到 I/O 完成大多数 I/O 操作
非阻塞 I/O进程发出 I/O 请求后立即返回,稍后查询结果用户界面、网络

阻塞 I/O 好比在柜台排队等叫号,你必须站着不动直到轮到你;非阻塞 I/O 好比取了号就去逛街,时不时看看手机上的排队进度。

设备接口与系统调用

应用程序通过系统调用访问 I/O 设备:

系统调用功能
open打开设备,获取设备描述符
close关闭设备
read从设备读数据
write向设备写数据
ioctl设备特定的控制操作

ioctl 是一个"万能"接口,用于处理不适合 read/write 的设备操作,如设置串口波特率、弹出光驱等。

统一接口的意义

通过统一的 I/O 接口,应用程序可以用相同的方式访问不同的设备。在 Unix/Linux 中,这一思想体现为 "一切皆文件":

  • 普通文件、设备、管道、socket 都通过文件描述符访问
  • 都可以使用 open/close/read/write 操作

考研高频考点

  • 🔥🔥 阻塞 I/O vs 非阻塞 I/O 的区别
  • 🔥 字符设备接口 vs 块设备接口
  • 🔥 ioctl 的作用

接口定义了"怎么发请求",但设备和 CPU 速度差距巨大,数据传过来往哪儿放?下一篇来看缓冲区管理。