IO多路复用select/poll/epoll

Linux IO多路复用技术:select、poll与epoll详解 IO多路复用是Linux网络编程中的核心技术,它通过单线程监控多个文件描述符来提升并发处理能力。其核心原理是利用内核事件通知机制,避免为每个连接创建独立线程的资源消耗。从早期的select/poll到高效的epoll,技术演进显著提升了大规模连接场景下的性能表现。特别是在高并发服务器开发中,epoll的O(1)时间复杂度事件通知和mmap内存共享机制,使其成为Nginx、Redis等高性能服务的首选方案。结合Reactor模式实现,可构建出支持数万并发的网络框架。理解这些底层机制对优化Web服务器、即时通讯 阅读详情

IO多路复用定义

以内核的形式帮忙检测读缓冲区和写缓冲区中的状态。例如:accpet,正常来说accpet在网络通信的过程中需要阻塞程序,等待客户端的连接。但现在这件事在IO多路复用中则可以交给内核来处,如用select将

select、poll 和 epoll 都是 Linux 系统提供的 I/O 多路复用 机制。它们的核心目标是让单个进程或线程能够高效地监控多个文件描述符(fd),当其中任何一个 fd 就绪(如可读、可写)时,就进行处理。

这三种技术是演进而非简单的替代关系,各自适用于不同的场景。

select:开创者

select 是最早出现的 I/O 多路复用技术,也是 POSIX 标准的一部分,因此具有极好的跨平台性。

定义与核心思想

select 通过维护三个位图(bitmask)来分别监控文件描述符的读、写和异常状态。每次调用 select,内核都会线性扫描所有被监控的 fd,检查其状态是否发生变化。

函数原型
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
参数详解
  • nfds: 一个整数值,指定需要被检查的文件描述符的范围。select 会检查从 0 到 nfds-1 的所有文件描述符。通常设置为所有被监控 fd 中的最大值加 1。
  • readfds: 指向一个 fd_set 结构体的指针,用于监控可读事件(例如,套接字的接收缓冲区有数据到来)。
  • writefds: 指向一个 fd_set 结构体的指针,用于监控可写事件(例如,套接字的发送缓冲区有空闲空间)。
  • exceptfds: 指向一个 fd_set 结构体的指针,用于监控异常事件(例如,带外数据到达)。
  • timeout: 指向 timeval 结构体的指针,用于设置 select 调用的超时时间。
    • NULL: 永久阻塞,直到有事件发生。
    • 秒=0, 微秒=0: 非阻塞,立即返回。
    • 其他值: 阻塞指定的时间。
  • 返回值:通过监控readfds,返回可读事件的fd总数量。(传入其它fd集合时同理)
核心用法与宏

select 的用法围绕 fd_set 和一组宏展开:

  1. 定义集合: fd_set readfds;
  2. 清空集合: FD_ZERO(&readfds);
  3. 添加 fd: FD_SET(fd, &readfds);
  4. 检查 fd: if (FD_ISSET(fd, &readfds)) { /* fd 可读 */ }
  5. 调用 select: 传入设置好的集合。
  6. 处理返回: select 返回后,内核会修改传入的集合,只保留就绪的 fd。需要再次使用 FD_ISSET 宏来遍历检查哪些 fd 真正就绪了。
主要缺点
  • 连接数限制: 受 fd_set 位图大小的限制,默认最多只能监控 1024 个 fd(由 FD_SETSIZE 宏定义)。
  • 性能开销: 每次调用都需要将整个 fd_set 从用户态拷贝到内核态,返回时再拷贝回来。
  • 效率低下: 无论 fd 是否就绪,每次都需要线性扫描所有被监控的 fd,时间复杂度为 O(N)。

poll:改进者

poll 的出现主要是为了解决 select 的连接数限制问题。

定义与核心思想

poll 不再使用位图,而是采用一个 pollfd 结构体数组来管理被监控的文件描述符及其关注的事件。

函数原型
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
参数详解
  • fds: 指向 pollfd 结构体数组的指针,每个元素代表一个被监控的 fd 及其事件。
  • nfds: fds 数组中元素的数量,即被监控的 fd 总数。
  • timeout: 超时时间,单位为毫秒。行为与 select 类似(-1 为永久阻塞,0 为非阻塞)。
pollfd 结构体
struct pollfd {
    int   fd;         // 要监控的文件描述符
    short events;     // 用户关心的事件(输入)
    short revents;    // 实际发生的事件(输出)
};
  • events: 在调用 poll 前设置,告诉内核我们关心哪些事件,如 POLLIN(可读)、POLLOUT(可写)。
  • revents: poll 返回后,由内核填充,告知用户哪些事件真正发生了。
主要缺点

虽然 poll 突破了 1024 个 fd 的限制,但它和 select 一样,每次调用时仍需要将整个 pollfd 数组从用户态拷贝到内核态,并且内核也需要线性扫描所有 fd 来判断状态,时间复杂度依然是 O(N)。


epoll:高性能的终极方案

epoll 是 Linux 2.6 内核引入的,专为解决 select 和 poll 在高并发场景下的性能瓶颈而设计。

定义与核心思想

epoll 采用事件驱动模型。它通过 epoll_ctl 将需要监控的 fd 一次性注册到内核的一个红黑树中。当某个 fd 就绪时,内核通过回调机制直接将其加入一个就绪链表。epoll_wait 只需检查这个就绪链表即可,无需轮询。

核心函数与用法

epoll 的使用涉及三个独立的函数,职责分离清晰:

  1. epoll_create: 创建一个 epoll 实例。

    int epfd = epoll_create(int size); // size 仅作为提示,内核会动态调整
    

    返回的 epfd 是一个文件描述符,代表这个 epoll 实例。

  2. epoll_ctl: 管理 epoll 实例的兴趣列表(即红黑树)。

    int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
    
    • epfd: epoll_create 返回的实例描述符。
    • op: 操作类型,EPOLL_CTL_ADD(添加)、EPOLL_CTL_MOD(修改)、EPOLL_CTL_DEL(删除)。
    • fd: 要操作的目标文件描述符。
    • event: 指向 epoll_event 结构体的指针,用于指定关注的事件和关联数据。
  3. epoll_wait: 等待事件发生。

    int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
    
    • epfd: epoll 实例描述符。
    • events: 用于接收就绪事件的数组。
    • maxevents: events 数组的大小。
    • timeout: 超时时间(毫秒)。
      该函数只返回已经就绪的事件,时间复杂度为 O(1),与总连接数无关。
epoll_event 结构体
struct epoll_event {
    uint32_t     events;      // 监控的事件(如 EPOLLIN, EPOLLOUT)
    epoll_data_t data;        // 用户数据,通常用于存储 fd 或指针
};
两种工作模式

epoll 支持两种事件触发模式,这是其灵活性的关键:

  • 水平触发 (Level Triggered, LT): 默认模式。只要 fd 处于就绪状态(例如,接收缓冲区有数据未读完),每次调用 epoll_wait 都会通知你。这与 select/poll 的行为一致,编程模型简单。
  • 边缘触发 (Edge Triggered, ET): 高性能模式。仅在 fd 状态发生变化时通知一次(例如,缓冲区从空变为有数据)。如果应用程序没有一次性处理完所有数据,epoll_wait 将不会再次通知。因此,使用 ET 模式必须配合非阻塞 I/O,并在收到通知后循环读写,直到返回 EAGAIN 错误。

三者对比总结

特性selectpollepoll
底层数据结构位图 (fd_set)数组 (pollfd)红黑树 + 就绪链表
最大连接数有限制 (通常 1024)无限制 (受内存限制)无限制 (受内存限制)
时间复杂度O(N)O(N)O(1) (仅与就绪数相关)
内存拷贝每次调用都拷贝每次调用都拷贝通过 epoll_ctl 注册,减少拷贝
工作模式仅 LT仅 LTLT (默认) / ET
可移植性极好 (POSIX)较好 (POSIX)Linux 特有
适用场景低并发、跨平台需求中等并发高并发、高性能服务器 (如 Nginx, Redis)
从理想光源到部分相干:Abbe与Hopkins模型在计算光刻中的演进与选择 本文深入探讨了计算光刻中Abbe模型与Hopkins模型的演进与选择,分析了理想光源与部分相干光源在光刻仿真中的关键差异。Abbe模型基于理想点光源假设,计算简洁但存在精度局限;Hopkins模型则通过互强度函数和TCC技术,更准确地模拟现实中的部分相干光源,尤其适用于先进节点光刻工艺。文章还提供了模型选择的实用建议,帮助工程师在精度与效率间取得平衡。 阅读详情

相关推荐

(超全面,超基础)Kriging插值推导理论笔记,算法,普通克里金

最近老师让我再重新推导一下克里金插值的方法如何求出预测结果,于是我又无数次地打开了大神的推导原理过程链接????:克里金(Kriging)插值的原理与公式推导 作者:xg1990,但是不可避免地在推导过程中,数学知识基础薄弱的我卡住在一些公式推导的步骤中。 所以就想基于上面大神的推导过程,将里面的推导写得更具体些,当然觉得毫不吃力可以进行推导的大神们可以不看我的注释,直接点开链接看就好。 我看到csdn中很多关于克里金推导的博客里面的内容直接截屏或者复制了上面链接里大神发表的内容,也不注

Olivel1997的博客 1万+

深入解析Linux I/O多路复用:select/poll/epoll对比与实践

I/O多路复用是解决高并发网络编程的核心技术,它允许单个线程高效管理多个连接。从select、poll到epoll,Linux系统提供了不同层次的解决方案。select使用位图监控文件描述符,但受限于1024连接数;poll改用链表结构突破数量限制,但仍需线性扫描;epoll通过红黑树和就绪链表实现O(1)时间复杂度,支持边缘触发模式。在C10K问题场景下,epoll的吞吐量可达poll的10倍。这些技术广泛应用于Web服务器、实时通信等高性能场景,如Nginx、Redis等知名项目都基于epoll实现其高

weixin_33600816的博客 236

多雷达协同探测技术研究进展:认知跟踪与资源调度算法

源自:雷达学报作者:易伟 袁野 刘光宏 葛建军 孔令讲 杨建宇雷达是信息感知的千里眼,具有极高的军用和民用价值,广泛应用在防空预警、遥感测绘、反恐维稳等领域[1–5]。雷达信息获取与探测技术也一直是大国竞相抢占的前沿技术,同时是信息科学的重要组成部分。随着科学技术不断进步,先进电子对抗装备的不断问世和广泛列装,雷达的生存与发展正面临日益严峻的挑战。从生存环境上看,雷达面临通信等各类民用电磁干扰以及复杂的军用电磁干扰;从探测对象上看,集群、微弱、隐身、高空、低空等多样化目标的出现也给雷达探测与识别带来困难。

renhongxia1的博客 2784

12.总结:深入理解 Linux I/O 多路复用:select、poll、epoll 全解析

本文深入解析了Linux系统中I/O多路复用的三种核心机制:select、poll和epoll。首先阐述了I/O多路复用的必要性,通过单线程监控多个连接解决了传统模型的资源浪费问题。随后详细对比了三者的实现原理与性能差异:select存在1024连接数限制和O(n)效率问题;poll改进了数据结构但仍需线性扫描;epoll采用红黑树和就绪链表实现了O(1)高效事件通知。文章重点剖析了epoll的三大API(create/ctl/wait)、两种触发模式(LT/ET)以及必须使用非阻塞I/O的ET模式铁律,并

C++ 是一门不原谅粗心的语言,而我恰好喜欢这种不原谅。 我是 x,正在成为更严谨的 C++ 开发工程师的路上。 956

AntV G6边动画实战:手把手教你实现数据流向箭头与虚线流动效果

本文详细解析了如何使用AntV G6实现数据流向箭头与虚线流动效果,通过自定义边动画提升数据可视化的动态表现力。从基础环境搭建到核心概念讲解,再到虚线流动动画和箭头路径动画的具体实现与参数调控,帮助开发者掌握G6边动画的高级技巧,适用于网络流量监控、数据传递等场景。

weixin_28487433的博客 268

HALCON卡尺模型实战:5分钟搞定工件尺寸测量(附完整代码)

本文详细介绍了HALCON卡尺模型在工件尺寸测量中的实战应用,通过5分钟快速搭建测量系统的完整指南,包括基础配置、高级参数调优和完整代码示例。卡尺模型能自动识别边缘并计算精确尺寸,显著提升工业视觉检测的效率和一致性,特别适用于实时测量场景。

weixin_42570296的博客 463

linux下的多路复用io(select,poll,epoll)

如果 `timeout` 的 `tv_sec` 和 `tv_usec` 都为 `0`,则 `select` 是非阻塞的。如果 `timeout` 为 `-1`,则 `epoll_wait` 将无限期阻塞;- `events`: 需要监视的事件,如 `EPOLLIN`(可读)、`EPOLLOUT`(可写)、`EPOLLERR`(错误)、`EPOLLET`(边缘触发)等。- `events`: 监视的事件,如 `POLLIN`(可读)、`POLLOUT`(可写)、`POLLERR`(错误)等。

lexc_的博客 1349

Microsemi Libero使用技巧11——CoreUARTAPB RX管脚分配时不显示

调用串口IP核CoreUARTAPB,并例化到顶层设计,发现UART_RX管脚在进行管脚分配时没有显示出来,最后发现是CoreAPB3总线IP核配置不对导致,改为如下配置后正常。

whik1194的博客 758

Linux - 常用的I/O 多路复用技术 select, poll, epoll

I/O 多路复用: 最明显的特征就是能监听多个文件描述符.常见的多路复用机制有: select, poll, epoll.这三个多路复用 select 的效率最低, 其次是 poll, epoll 的效率最高, 所以 epoll 在Linux 中广泛使用.

m0_74506452的博客 956

13、数据来源介绍与操作指南

本文详细介绍了多种数据源的特点、操作步骤及适用场景,包括元数据数据源、MongoDB数据源、Pentaho Data Integration数据源、OLAP数据源、Pentaho分析数据源和OLAP4J数据源。通过流程图和表格对比,帮助用户理解不同数据源的选择与使用方法,并提供了实际应用案例和注意事项,旨在提升数据获取与分析效率,支持高效报告生成。

ik678901234的博客 152

软考高级系统架构设计师历年论文真题深度分析(2011-2025)

本文系统分析了2011-2025年系统架构设计师论文真题,归纳出十大主题类别,包括架构风格、企业集成、数据技术、非功能属性等。研究发现新兴技术占比最高(18.8%),企业集成、数据架构和非功能属性为三大核心考点。论文命题呈现明显技术演进特征,从经典架构理论逐步转向云原生、AI融合等前沿方向。备考建议重点关注高频考点和技术前沿,同时强化场景化解决方案能力。分析表明,架构师考试持续跟踪行业技术发展,注重理论与实践结合,为考生提供了明确的备考方向。

一几文的编程学习笔记。 2050

Linux I/O 多路复用:select、poll 和 epoll 详解

本文将详细介绍三种主要的 I/O 多路复用机制:select、poll 和 epoll,分析它们的工作原理、API 使用、示例代码以及各自的优缺点。epoll 是 Linux 特有的高性能 I/O 多路复用机制,解决了 select 和 poll 的性能瓶颈。select 是最早出现的 I/O 多路复用机制,它使用位图(fd_set)来表示文件描述符集合。poll 改进了 select 的一些限制,使用链表结构代替位图,没有最大文件描述符数量的限制。: 需要监控的文件描述符的最大值加 1。

2301_80067496的博客 947

第六:Charles抓包-苹果手机抓包

【代码】第六:Charles抓包-苹果手机抓包。

欢迎来到本博客! 1658

网络io的多路复用:select/poll/epoll详解

本文详细介绍了三种网络I/O多路复用技术:select、poll和epoll。首先分析了一请求一线程方式的弊端,指出多路复用技术可以有效解决高并发问题。select通过比特位集合管理文件描述符,但存在参数复杂、效率低下等缺点;poll采用结构体数组pollfd,比select更灵活高效;epoll则是Linux内核的重大改进,通过事件触发机制显著提升性能。文章分别展示了三种技术的代码实现,对比了它们的工作原理和优缺点,为开发高并发网络应用提供了技术参考。

adagio9z的博客 1884

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

什么是IO多路复用/ select、 poll、 epoll使用

IO多路复用(IO multiplexing)是一种通过单一的系统调用来监视多个文件描述符(通常是套接字),以确定是否有数据可读或可写的技术。它允许单个线程处理多个IO操作,提高了程序的并发性能和效率。select程序通过select函数监听标准输入(stdin),如果5秒内有输入则打印消息,否则打印超时消息pollselectepollselectpoll当使用epoll。

weixin_68115991的博客 936

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

select/poll/epoll三种io多路复用对比

 select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到...

小豆角的博客 302

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

网络io与io多路复用select/poll/epoll

‌多路复用 是一种高效管理多个输入/输出(I/O)操作的技术,通过‌单一线程或进程‌监听多个 I/O 源(如 Socket 连接、文件描述符fd),避免为每个 I/O 操作创建独立的线程或进程。

weixin_51348443的博客 1041

Linux IO多路复用 select/poll/epoll 对比:从1024限制到百万并发实战解析

本文深入解析Linux IO多路复用技术,对比select、poll和epoll的性能差异与适用场景。从select的1024限制到epoll的百万并发实战,详细探讨了epoll的红黑树架构、边缘触发模式及性能优化技巧,帮助开发者构建高性能网络服务。

weixin_33146151的博客 349

【Linux基础】select、poll、epoll详解

引入1.定义 I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用。而select(),poll(),epoll()都是I/O多路复用的机制。 I/O多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。 2.IO多路复用的适用场合 当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O

白夜行 2989

Linux I/O 多路复用机制:select、poll 与 epoll 的原理、性能差异及应用选型

本文通过原理拆解、性能量化对比与场景适配分析,完整呈现三者技术差异与选型逻辑。select、poll、epoll 的演进本质是从 “轮询所有 fd” 到 “只处理就绪 fd”的性能革命:select 以兼容性牺牲性能,poll 突破数量限制但未解决核心开销,epoll 通过事件驱动与高效数据结构,实现性能与扩展性的双重突破。:支持水平触发(LT,默认)与边缘触发(ET),ET 模式仅在 fd 状态变化时通知,进一步降低事件触发频率。,仅在 fd 就绪时触发处理,大幅降低资源消耗,成为高并发服务的核心技术。

2501_93836915的博客 319

Linux I/O多路复用:select、poll与epoll性能对比

I/O多路复用是高性能网络编程的核心技术,它允许单个线程同时监控多个文件描述符的状态变化。在Linux系统中,select、poll和epoll是三种主要的实现方案,它们在处理大量并发连接时表现出显著差异。select使用位图监控文件描述符,但存在1024的数量限制;poll改用链表结构解决了这个问题,但两者都采用线性扫描方式,时间复杂度为O(n)。epoll则通过红黑树管理描述符、就绪队列存储事件以及回调机制,将时间复杂度优化到O(1),特别适合游戏服务器、即时通讯等高并发场景。测试数据显示,在处理5万连

weixin_34094282的博客 310

Linux I/O多路复用技术详解,从select到epoll的进化之路

Linux I/O多路复用技术详解,从select到epoll的进化之路

ly853602的博客 837

【Linux 实战 - 24】IO 多路复用:select/poll/epoll 全详解与性能对比

本文全面解析Linux IO多路复用技术,重点对比select、poll和epoll三大机制。核心内容包括:1)基础概念:IO多路复用通过单线程监听多个文件描述符,解决传统阻塞IO模型的资源瓶颈;2)技术详解:select存在1024fd限制且需全量轮询,poll改进数量限制但仍需遍历,epoll采用红黑树和回调机制实现O(1)复杂度;3)性能对比:epoll在高并发场景下性能显著优于前两者,支持边缘触发模式;4)实践建议:提供各机制的代码示例,指出ET模式必须搭配非阻塞IO等关键注意事项。文章系统性地阐述

366

【Linux】关于IO多路复用:select/poll/epoll的笔记

关于IO多路复用的笔记

#include>的博客 1433

Linux下I/O多路复用(select、poll、epoll),含函数解析及注意要点 ,干货满满!!

liunx下基于c/c++的网络编程中的I/O多路复用(select、poll、epoll)介绍。 select是 Linux 原生的、可跨平台的多路复用技术 poll在 Linux 系统中常被用于高并发网络服务器编程 epoll是一种优于poll的 I/O 多路复用机制,在 Linux 系统中常被用于高并发网络服务器编程;epoll 使用eopll_event 通过epoll_create、epoll_ctl 和 epoll_wait 这三个系统调用来实现事件多路转接。 #多路复用#多路复用#多路复用

C__YUE的博客 1654

深入解析Linux IO多路复用:从select到epoll的高并发网络编程实践

IO多路复用是操作系统提供的一种高效I/O事件通知机制,其核心原理在于允许单个进程或线程同时监视多个文件描述符(如网络套接字)的状态变化。通过将文件描述符集合的管理委托给内核,并在事件就绪时接收通知,该技术能够将传统阻塞I/O模型中的“一对一”服务模式转变为“一对多”的监控模式,从而在资源利用率和并发处理能力上实现质的飞跃。其技术价值在于,它能够以极少的系统线程支撑海量的并发连接,显著降低上下文切换和内存开销,成为构建高性能、可扩展网络服务的基石。这一技术广泛应用于Web服务器、即时通讯、游戏服务器、金融交

weixin_34380948的博客 323
上一篇: CMake基础
下一篇: epoll详解以及Reactor模式
蓝宁宸
博客等级 码龄5年 6粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值