Appearance
输入输出应用程序接口
考情分析
I/O 应用接口的分类了解即可,阻塞/非阻塞 I/O 的区别偶有考查。🔥 低频。
键盘按一个字符就算一次输入,磁盘却是一整块一整块地读——设备差异这么大,应用程序总不能为每种设备写一套代码,所以 OS 要在中间提供统一的接口。
I/O 接口的分类
操作系统为不同类型的设备提供不同的 I/O 接口:
| 接口类型 | 适用设备 | 操作特点 |
|---|---|---|
| 字符设备接口 | 键盘、打印机、串口 | get/put 逐字符操作 |
| 块设备接口 | 磁盘、SSD | read/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 速度差距巨大,数据传过来往哪儿放?下一篇来看缓冲区管理。