select poll epoll

select、poll、epoll的区别 是三种 I/O 多路复用机制,用于高效管理多个文件描述符的 I/O 事件。)管理描述符集合,每次调用需将整个集合从用户空间拷贝到内核,内核遍历所有描述符检测就绪状态。:基于事件驱动,内核维护红黑树存储监控的描述符,就绪事件通过双向链表返回。:需非阻塞 I/O 并一次性读取数据,减少系统调用次数,适合高性能场景。:仅在状态变化时通知一次,需一次性处理所有数据。:仅处理就绪事件,性能几乎不受连接数影响。:需结合非阻塞 I/O,避免漏处理事件。:可能重复通知就绪事件,适合简单场景。:只要描述符就绪,持续通知。 阅读详情

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


selectpollepoll
操作方式遍历遍历回调
底层实现数组链表红黑树(存放socket)/哈希表(准备就绪事件)
IO效率线性遍历O(n)线性遍历O(n)事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到rdllist里面,O(1)
最大连接数1024(X86)或2048(X64)无上限无上限
fd拷贝每次调用select,都需要把fd集合从用户态拷贝到内核态每次调用poll,都需要把fd集合从用户态拷贝到内核态调用epoll_ctl时拷贝进内核并保存,之后每次epoll_wait不拷贝。epoll是通过内核于用户空间mmap同一块内存实现的。

(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大

(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大

(3)select支持的文件描述符数量太小了

epoll

  epoll是Linux下多路复用IO接口select/poll的增强版本。 
  它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它不会复用文件描述符集合来传递结果而迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合。 
  另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。 
  epoll除了提供select/poll 那种IO事件的电平触发(Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

底层实现

  epoll在底层实现了自己的高速缓存区,并且建立了一个红黑树用于存放socket,另外维护了一个链表用来存放准备就绪的事件。

工作过程:

  执行epoll_ create时,创建了红黑树和就绪链表,执行epoll_ ctl时,如果增加socket句柄,则检查在红黑树中是否存在,存在立即返回,不存在则添加到树干上,然后向内核注册回调函数,用于当中断事件来临时向准备就绪链表中插入数据。执行epoll_wait时立刻返回准备就绪链表里的数据即可。

epoll优点

1)支持一个进程打开大数目的socket描述符(FD)

2)IO效率不随FD数目增加而线性下降

3)使用mmap加速内核与用户空间的消息传递。

总结

(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。 
  而epoll其实也需要调用 epoll_ wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在 epoll_wait中进入睡眠的进程。  
  虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的 时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间,这就是回调机制带来的性能提升。

(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内 部定义的等待队列),这也能节省不少的开销。


参考BLOG:

//select poll epoll 的区别和联系(http://www.cnblogs.com/Dennis-mi/articles/6055324.html)
//select,poll,epoll优缺点及比较(https://blog.youkuaiyun.com/lixungogogo/article/details/52226501)
//select、poll、epoll之间的区别总结[整理](http://www.cnblogs.com/Anker/p/3265058.html)
//Linux下I/O多路复用系统调用(select, poll, epoll)介绍(https://zhuanlan.zhihu.com/p/22834126)
//【那些年遇到过的面试题】select poll epoll(https://blog.youkuaiyun.com/kevin_liu11/article/details/52615269)



select,poll和epoll详解 select,poll和epoll详解 1.IO复用 为了解决大量客户端访问的问题,引入IO复用技术:一个进程可以同时对多个客户请求进行服务,复用一个进程对多个IO进行服务。IO读写的数据多数情况下未准备好,需要通过一个函数监听这些数据状态,一旦有数据可以读写就触发服务。elect,poll,epoll都是IO多路复用的机制,监视多个描述符,一旦某个描述符就绪,通知程序进行操作。 2.select 3.poll 4.epoll epoll 是Linux平台下的一种特有的多路复用IO实现方式,与传统的 sel 阅读详情

相关推荐

select、poll、epoll三者的优缺点

用户可以注册多个socket,然后调用select函数读取被激活的socket,从而实现在同一个线程内同时处理多个IO请求,在这点上select函数与同步阻塞模型不同,因为在同步阻塞模型中需要通过多线程才能达到这个目的。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。epoll使用一个文件描述符管理多个描述符,它将文件描述符的事件放入内核的一个事件表中,从而在用户空间和内核空间的复制操作只用实行一次即可。

Lllongroad的博客 892

select系统调用

               就最近解决业务socket通信的问题时,发现业务端出现收包卡死的问题;经过业务调试打印,内核打点,查看套接字匹配情况,业务模型场景模拟等一系列操作,最后整理下select的流程和使用;         在网络程序中,一个进程同时处理多个文件描述符是很常见的情况。select()系统调用可以使进程检测同时等待的多个I/O设备,当没有设备准备好时,select()阻塞,其...

hzj_001的博客 3681

《大明王朝1566》中,朝廷财政危机无法解决的根源分析

财政困局中的财富最终流向三重黑洞:​皇室挥霍​(如嘉靖炼丹修殿)、特权阶层贪腐​(严党年入百万两盐税)、制度性损耗​(宗室供养、低效官僚)。更深层的“钱”其实是被禁锢在道德化治理的牢笼中——当国家用“黄河长江皆可为用”的权术思维替代制度性改革时,财政危机便成为帝制王朝无法逃脱的宿命。

为了小家奋斗 1967

一道搜狗面试题:IO多路复用中select、poll、epoll之间的区别

一道搜狗面试题:IO多路复用中select、poll、epoll之间的区别 (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。 (2)poll==>时间复杂度O(n) poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个f

bishe_teacher的博客 211

仿真每日一练 | Workbench如何在网格节点施加载荷

打开Workbench 2020 R2,在分析系统中双击静力分析工程项目,双击Geometry打开Design Modeler,在菜单栏的单位(Units)修改为毫米(Millimeter),在XY平面创建草图,在草图内绘制矩形并标注尺寸,拉伸长方体,如图1所示。:单个零部件,无连接关系,但需定义一个节点组件,如图5所示,选择Create Named Selection。对添加的节点组件施加Y方向50N的力,如图8所示。1-1-3.有限元系统模型构建。1-1-1.几何模型构建。1-1-2.材料定义。

ansysxuexizhe的博客 1236

逆向工程视角:MFI芯片通信协议在Linux环境下的行为分析

本文从逆向工程角度深入分析了MFI芯片在Linux环境下的通信协议行为,重点探讨了树莓派与MFI芯片通过I2C接口交互的技术细节。文章详细介绍了信号捕获、协议栈逆向、动态调试技巧以及安全机制分析,为开发者提供了在Linux驱动层面实现MFI认证的实用方法。

time3的博客 175

Linux多路复用之select/poll/epoll实现原理及优缺点对比

Linux多路复用之select/poll/epoll实现原理及优缺点对比

zangyuanan320的博客 3026

05-SA8155 QNX Display框架及代码分析(1)

显示是非常重要的一个模块,人机交互的桥梁。那么SA8155 Hypervisor显示是如何处理的呢。对处理流程非常的好奇O(∩_∩)O哈哈~。TODO。

静虚待令,有物混成 1万+

select poll epoll的区别及epoll的底层实现

Select  poll每次循环调用时,都需要将描述符和事件拷贝到内核空间;epoll只需要拷贝一次; 这种情况在对于描述符数量不大的情况下还可以,但是当描述符的数量达到十几万甚至上百万的时候,他们的效率就会急速降低,因为每一次轮询都需要将这些所有的socket描述符从用户态拷贝到内核态,会造成大量的浪费和资源开销;       2.Select  poll每次返回后,需要遍历所有描述符才能找到...

柯南的博客 5209

到底什么是Harness工程?一篇文章从入门到企业落地全解析

随着OpenClaw爆火,Harness Engineering(驾驭工程)成为AI编程时代的热门概念,很多小白对其感到陌生。本文用通俗类比和真实案例,避开复杂术语,从基础定义入手,讲清Harness Engineering的核心逻辑——人类工程师设计“约束系统”(马具),让AI模型(烈马)安全高效地完成代码工作,同时拆解其核心组件、企业落地场景和实战成果,帮小白快速入门,读懂这项能解放人力、提升效率的新技术,轻松掌握它的核心价值和落地思路。

program哲学 3256

哨兵1号回波数据(L0级)包格式解析与成像参数提取

提取哨兵1号数据包的辅助数据、回波数据、定标数据。matlab代码在文末

3124

深入理解select、poll和epoll及区别

问题:如果我们先前创建的几个进程承载不了目前快速发展的业务的话,是不是还得增加进程数?我们都知道系统创建进程是需要消耗大量资源的,所以这样就会导致系统资源不足的情况。 那么有没有一种方式可以让一个进程同时为多个客户端端提供服务? 接下来要讲的IO复用技术就是对于上述问题的最好解答。 对于IO复用,我们可以通过一个例子来很好的理解它。( 例子来自于《TCP/IP网络编程》) 某教室有10名...

$好记性还是要多记录$ 10万+

Apache DolphinScheduler 实现了对 OceanBase 的元数据库支持

Apache DolphinScheduler 是一款开源的分布式工作流任务调度系统,它提供了可视化的工作流设计和调度功能,支持大数据任务的自动化调度和监控。最近的更新中,Apache DolphinScheduler 引入了对 OceanBase 数据库的元数据库支持,这为用户在大数据环境中管理和调度任务提供了更多选择。用户可以通过 DolphinScheduler 提供的可视化界面进行工作流的设计和调度,也可以通过 DolphinScheduler 提供的 API 进行任务的编程调度。

VavzNvml的博客 493

epoll、poll、select的原理和区别

一、什么是epoll? epoll是一种I/O事件通知机制,是linux 内核实现IO多路复用的一个实现。IO多路复用是指,在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。 epoll有两种工作方式,ET-水平触发 和 LT-边缘触发(默认工作方式),主要区别是: LT,内核通知你fd是否就绪,如果没有处理,则会持续通知。而ET,内核只通知一次。 二、epoll的三个函数 int epoll_create(int size) size参数告诉内核这

wwwvipp的博客 5万+

STM32外部中断EXTI原理与飞控实时应用实战

外部中断(EXTI)是嵌入式系统中实现事件驱动和实时响应的核心机制,其本质是将外部电平变化转化为可调度的CPU中断事件。基于ARM Cortex-M NVIC架构,EXTI通过GPIO-EXTI-NVIC三级硬件通路实现低延迟信号捕获,具备边沿触发、优先级管理与挂起控制等关键能力。在四轴飞控、工业传感器、人机交互等对毫秒级响应有强需求的场景中,EXTI显著优于轮询方式,兼顾实时性与CPU资源效率。实际开发需严格遵循SYSCFG映射→EXTI配置→NVIC使能的时序逻辑,并规避常见陷阱如中断号误配、伪触发、低

weixin_36382073的博客 64

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

select、poll、epoll的原理

在 select/poll中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而epoll事先通过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait() 时便得到通知。(此处去掉了遍历文件描述符,而是通过监听回调的的机制。这正是epoll的魅力所在。epoll的优点主要是一下几个方面:1.监视的描述符数量不受限制,它所支持的FD上限是最大可以打开文件的数目。

m0_45164511的博客 1514

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

select、poll、epoll学习

select可以监视多个文件描述符,等待一个或多个文件描述符就绪(可读、可写、异常)或者直到超时。1、监视的文件描述符有限制,通常为10242、每次调用select,都要循环遍历整集,扫描每个文件描述符是否就绪(可读、可写、异常),3、每次调用select,需要把fd_set集合,从用户空间拷贝到内核空间单个进程实现了I/O多路复用poll与select类似,相当于select升级版本,poll没有文件描述符数量的限制。poll的结构体。

GHL284271090的博客 1803

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

select、poll、epoll的原理与区别

1、select 同步多路IO复用 时间复杂度:O(n) fd_set(监听的端口个数):32位机默认是1024个,64位机默认是2048。 缺点: (1)单进程可以打开fd有限制; (2)对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低; (2)用户空间和内核空间的复制非常消耗资源; 2、po...

nanxiaotao的博客 5万+

select, poll, epoll

select, poll, epoll

qq_2972806103的博客 1143

select、poll与epoll

摘要:介绍select、poll、epoll以及工作原理,并分别使用三种IO多路复用实现echo服务器的并发功能

qq_53652592的博客 2501

select、poll和epoll的区别

本文总结了从阻塞I/O模型到多路复用I/O模型的演变,以及select、poll、epoll三者各自优缺点。

weixin_38597669的博客 2200

Select、Poll和Epoll

看到一篇写得很不错的博文,有必要收藏一下: 原文:https://cloud.tencent.com/developer/article/1005481 提到select、poll、epoll相信大家都耳熟能详了,三个都是IO多路复用的机制,可以监视多个描述符的读/写等事件,一旦某个描述符就绪(一般是读或者写事件发生了),就能够将发生的事件通知给关心的应用程序去处理该事件。本质上,select...

ajuse的博客 4269

【Linux】select、poll和epoll详解

正如上文介绍 select 函数相关宏所介绍的,select 函数调用前后可能会修改 readfds、writefds 和 exceptfds 这三个集合中的内容,所以如果读者想下次调用 select 函数时复用这些 fd_set 变量,记得在下次调用前使用 FD_ZERO 将 fd_set 清零,然后再调用 FD_SET 将需要检测事件的 fd 重新添加到 fd_set。在 Linux 平台上,select 函数的实现是利用 poll 函数的,有兴趣的读者可以查找一下相关的资料来阅读一下。

m0_73839343的博客 1261

select、poll、epoll 的区别?

select、poll、epoll 的区别,本质是“多路 I/O 复用机制的演进”——从“轮询式”到“事件驱动式”,从“低效拷贝”到“零拷贝”,从“有限连接”到“无限连接”。一个核心:高并发场景下,优先选 epoll(Linux 环境);两个维度并发量:低并发用 select/poll,高并发用 epoll;跨平台:需要跨平台且并发低,用 select/poll;Linux 环境高并发,用 epoll。

埃泽漫笔 1300

select epoll poll的区别

(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll...

mulinsen77的博客 677
上一篇: 简单DP三连
下一篇: [读书笔记]编程之美(一)
xy_cpp
博客等级 码龄10年 119粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值