本文共 956 字,大约阅读时间需要 3 分钟。
I/O 模型概述
1. 同步I/O
1.1 阻塞式I/O
- 阻塞式I/O是最传统的I/O模型,调用如
recvfrom后,用户进程会阻塞等待数据到达内核缓冲区并复制到应用进程缓冲区。
1.2 非阻塞式I/O
- 非阻塞式I/O通过循环调用
recvfrom实现数据读取,若数据未到达则返回错误,否则复制数据到应用进程缓冲区(称为轮询机制)。
1.3 I/O 复用
- I/O 复用允许应用进程同时监控多个I/O流,首先调用
select(或poll/epoll)阻塞直至检测到数据准备就绪,然后复制数据到应用进程缓冲区。
1.4 信号驱动I/O
- 信号驱动I/O通过设置信号处理函数,接收到信号后主循环再调用
recvfrom读取数据,避免阻塞。
2. 异步I/O
- 异步I/O由 POSIX 规范定义,通过调用
aio_read完成数据读取,内核完成数据处理后通知应用进程。
3. 输入操作流程
等待数据准备: 复制数据: 4. 同步I/O vs 异步I/O
- 同步I/O操作导致进程阻塞,适用于简单场景。
- 异步I/O不阻塞进程,适用于复杂或多任务环境。
5. 五种I/O模型
5.1 阻塞式I/O
- 数据到达后用户进程阻塞等待,直到数据被复制到应用进程缓冲区。
5.2 非阻塞式I/O
- 数据读取循环调用
recvfrom,轮询数据状态,提升读取效率。
5.3 I/O 复用
- 应用进程阻塞调用
select/poll/epoll,检测数据到达后复制数据。
5.4 信号驱动I/O
5.5 异步I/O
- 内核完成数据读取后通知应用进程,进程通过信号处理函数读取数据。
6. I/O 多路复用详解
6.1 select
- 参数:文件描述符数组和 bitmap(1024位)。
- 内核复制文件描述符到内核态,检测数据到达并置位 bitmap,应用进程遍历文件描述符读取数据。
6.2 poll
- 结构体
pollfd包含事件和重置位,函数复制文件描述符到内核态,使用 revent 置位,应用进程遍历读取数据。
6.3 epoll
- 不需要拷贝文件描述符到内核态,优化了性能,返回数据文件描述符数量,应用进程直接处理。
转载地址:http://ytio.baihongyu.com/