应用程序 I/O 接口
应用程序 I/O 接口是用户/应用与操作系统 I/O 子系统交互的桥梁,根据设备类型(字符、块、网络)提供不同接口,并支持阻塞/非阻塞模式。
一、I/O接口分类
1、字符设备接口
- 特点:以字符为单位传输数据(如键盘、打印机),传输速率低、不可寻址,采用中断驱动方式 。
- 操作:
get
/put
:通过缓冲区顺序存取字符。in-control
:通用指令处理设备差异(参数对应具体功能)。
- 独占性:需通过打开/关闭操作实现互斥访问 。
2、块设备接口
- 特点:以数据块为单位(如磁盘),传输速率高、可寻址,常用DMA方式 。
- 功能:
- 抽象命令映射:将读/写等命令转换为设备操作。
- 线性编址:隐藏磁盘二维结构(磁道号+扇区号→线性序列) 。
- 内存映射:通过虚拟内存地址访问磁盘文件,简化编程(如
mmap
系统调用) 。
3、网络设备接口
- 特点:通过套接字(Socket)实现网络通信,支持远程连接和数据传输 69。
- 操作:创建套接字、绑定地址、监听/连接、发送/接收数据
4、块设备 vs 字符设备接口:
- 块:支持随机读写、内存映射(适合文件、数据库)。
- 字符:顺序读写、ioctl 配置(适合终端、串口)。
二、阻塞 vs 非阻塞 I/O
模式 | 工作原理 | 优点 | 缺点 | 适用场景 |
阻塞 I/O | 调用 后,进程挂起,直至 I/O 完成(如磁盘读数据到内存)。 | 简单(编程容易),无 CPU 空转。 | 进程阻塞期间不工作(浪费 CPU 时间,并发低)。 | 单任务、低速设备(如串口读取)。 |
非阻塞 I/O | 调用后立即返回,进程轮询 状态(通过 高效查询)。 | 进程不阻塞,可同时处理多 (高并发)。 | 需额外轮询逻辑,复杂度高。 | 网络服务器(同时处理多客户端连接)。 |
三、补充
1、同步与异步I/O
- 同步I/O:包括阻塞和非阻塞,需等待I/O操作完成(如
read
/write
) 。 - 异步I/O:内核完成操作后通知进程,无需等待(如
aio_read
) 。
2、I/O多路复用
- 机制:通过
select
/poll
/epoll
监控多个I/O事件,避免轮询开销
核心考点 📌
1、ioctl
作用:
- 字符设备定制功能(如设置终端密码输入模式、获取网卡 MAC 地址)。
2、内存映射优势:
- 减少
read/write
系统调用开销(数据直接在内存,例:数据库读页映射后直接操作内存)。
3、非阻塞实现:
O_NONBLOCK
标志 +select/poll/epoll
(Linux epoll 高性能原因:内核事件通知,无需用户层轮询所有fd
)。
总结
应用程序 I/O 接口是“设备特性”与“编程便利”的平衡:字符/块/网络接口适配设备差异,阻塞/非阻塞模式满足不同并发需求。理解这些接口,能解释为何 read()
对文件和网络套接字行为不同(底层接口逻辑差异),以及如何优化高并发系统(选非阻塞 + epoll)。
✨ 一句话记忆:字符按序块随机,网络套接连远程,阻塞简单非阻塞忙,模式选择看场景! ✨