I/O多路复用是系统级技术,通过select、poll、epoll实现单线程监控多socket;select跨平台但低效,poll无fd数量限制但仍O(n),epoll为Linux高效方案,支持ET/LT模式及近O(1)就绪通知;C++推荐用Boost.Asio等封装库。

I/O多路复用是C++(更准确说是系统级网络编程)中一种让单个线程/进程同时监控多个文件描述符(如socket)是否就绪(可读、可写、出错)的技术。它不等于C++标准库的iostream,而是底层基于操作系统提供的系统调用(select、poll、epoll),常用于实现高性能并发服务器(比如用C++写的HTTP服务、游戏网关等)。
select:最老但跨平台,适合少量连接
原理是把一组fd(文件描述符)拷贝到内核,内核轮询检查它们的状态,任一就绪就返回,并修改用户传入的fd_set标记哪些就绪了。
缺点明显:每次调用都要拷贝整个fd集合、内核需遍历所有fd(O(n))、最大fd数量受限(通常1024)、无法告知具体哪个fd就绪(得自己遍历查)。
使用要点:
- 每次调用前必须重新初始化
fd_set(用FD_ZERO和FD_SET) - 超时参数是输入输出参数,调用后会被修改,需每次重设
- 监听的fd必须小于
FOPEN_MAX或系统限制,且最大值要传给select()作为第一个参数
poll:比select稍好,无fd数量硬限制
用struct pollfd数组替代fd_set,内核直接遍历该数组。不再有1024限制,也不需要计算最大fd,但仍是O(n)遍历,每次仍要传全部fd数组,内核态/用户态间仍有数据拷贝。
立即学习“C++免费学习笔记(深入)”;
注意点:
标签: c++ i/o多路复用 linux windows 操作系统 工具 mac ai ios macos win strea
还木有评论哦,快来抢沙发吧~