c++中的I/O多路复用是什么_c++ select/poll/epoll原理与使用【网络编程】

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

c++中的I/O多路复用是什么_c++ select/poll/epoll原理与使用【网络编程】-第1张图片-佛山资讯网

I/O多路复用是C++(更准确说是系统级网络编程)中一种让单个线程/进程同时监控多个文件描述符(如socket)是否就绪(可读、可写、出错)的技术。它不等于C++标准库的iostream,而是底层基于操作系统提供的系统调用(selectpollepoll),常用于实现高性能并发服务器(比如用C++写的HTTP服务、游戏网关等)。

select:最老但跨平台,适合少量连接

原理是把一组fd(文件描述符)拷贝到内核,内核轮询检查它们的状态,任一就绪就返回,并修改用户传入的fd_set标记哪些就绪了。
缺点明显:每次调用都要拷贝整个fd集合、内核需遍历所有fd(O(n))、最大fd数量受限(通常1024)、无法告知具体哪个fd就绪(得自己遍历查)。

使用要点:

  • 每次调用前必须重新初始化fd_set(用FD_ZEROFD_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

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~