操作系统-I/O多路复用
I/O 多路复用:
通过内核监控多个文件描述符(如 TCP 连接),当某个文件描述符就绪(如数据到达或可写)时,内核通知用户态程序进行处理。
程序无需阻塞等待每个文件描述符,而是通过一次系统调用(如 select
、poll
、epoll
)批量检查状态,减少用户态和内核态的频繁切换。
对于 TCP 连接,I/O 多路复用可以高效管理大量并发连接,避免为每个连接创建独立线程或进程,提升性能和资源利用率。
select
、poll
和 epoll
的特性对比:
特性 | select | poll | epoll |
---|---|---|---|
文件描述符数量 | 通常限制为 1024(FD_SETSIZE) | 无限制 | 无限制 |
效率 | 每次调用需要遍历所有文件描述符 | 每次调用需要遍历所有文件描述符 | 仅返回就绪的文件描述符 |
触发模式 | 仅支持水平触发(LT) | 仅支持水平触发(LT) | 支持水平触发(LT)和边缘触发(ET) |
适用场景 | 文件描述符数量较少 | 文件描述符数量较少 | 文件描述符数量较多 |
可移植性 | 跨平台 | 跨平台 | Linux 特有 |
API 复杂度 | 简单 | 较简单 | 较复杂 |
内存开销 | 固定大小(FD_SETSIZE) | 动态分配(pollfd 数组) | 动态分配(内核维护) |
性能 | 低效(线性扫描) | 低效(线性扫描) | 高效(事件驱动) |