引言

高并发网络编程中,I/O模型决定系统性能。从阻塞IO到io_uring,Linux内核持续演进。

网络IO本质

数据包从网卡经DMA写入内核缓冲区,用户进程读取即拷贝到用户空间。进程可能阻塞等待(阻塞IO)或立即返回(非阻塞IO+事件通知)。

五种经典IO模型

1. 阻塞IO:recvfrom阻塞直到数据就绪。2. 非阻塞IO:立即返回EAGAIN。3. IO多路复用:select/poll监控多个fd。4. 信号驱动IO:SIGIO通知。5. 异步IO:AIO真正异步但限制多。

select局限

位图结构,1024 fd限制,每次重置fd_set,O(n)遍历。

poll使用链表解除数量限制,但仍O(n)遍历。

epoll原理

内核使用红黑树管理fd,就绪链表存放就绪事件。O(1)添加删除,O(k)通知就绪事件。

LT(水平触发):持续通知直到条件不满足。ET(边缘触发):仅状态变化时通知一次,减少通知次数。

多线程epoll采用Leader-Follower模式,EPOLLEXCLUSIVE避免惊群。

io_uring革新

共享环形缓冲区(SQ/CQ)在无syscall下提交/收割IO请求。支持链式SQE、固定缓冲区、SQPOLL内核线程轮询。适合高频IO场景。

选型指南

HTTP短连接用epoll;WebSocket用epoll LT;文件存储/数据库用io_uring。Nginx 1.21+实验性支持io_uring用于文件IO。

总结

从阻塞到io_uring,Linux网络IO持续演进追求更高吞吐更低延迟。无银弹,因地制宜。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部