select、poll、epoll之间的区别:
(1)、select==>时间复杂度O(n)
select仅仅知道了,有I/O时间发生了,却并不知道是哪几个流(可能一个、多个、甚至全部),我们只能无差别的轮询所有的流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别的轮询复杂度,同时处理的流越多,无差别轮询时间越长。
(2)、poll==>时间复杂度O(n)
poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,但是它没有最大连接数的限制,原因是它是基于链表来存储的。
(3)、epoll==>时间复杂度O(1)
epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们操作这些流都是有意义的。(复杂度降低到了O(1))
select、poll、epoll都是I/O多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般就是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。
epoll和select都能够提供多路I/O复用的解决方案。在现在的linux内核里都能够支持,其中epoll是linux所特有的,而select则在一般的操作系统中都有实现,是POSIX所规定。
select:
select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是:
(1)、单个进程可监视的fd的数量被限制,即能监听的端口的大小有限。这个数字和系统内存关系很大,可以在cat /proc/sys/fs/file-max查看。32位机器默认是1024个。64位机器默认是2048个。
(2)、对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低:
当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个socket来完成调度,不管哪个socket是活跃的,都遍历一遍。这浪费了很多cpu的时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll和kqueue做的。
(3)、需要维护一个用来存放大量fd的数据结构,这样会使得用户空间、内核空间在传递该结构时复制开销大。
poll:
poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有的fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。
poll是基于链表来存储的,所以它没有最大连接数的限制,但同样有一个缺点:
(1)、大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。
(2)、poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。
epoll
epoll有epolllt和epollet两种触发模式,lt是默认的模式,et是高速模式。lt模式下,只要这个fd还有数据可读,每次epoll_wait都会返回它的事件,提醒用户程序去操作,而在et(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无论fd中是否还有数据可读。所以在et模式下,read一个fd的时候一定要把它的buffer读光,也就是说一直读到read的返回值小于请求值,或者遇到eagain错误。还有一个特点,epoll使用事件的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用callback的回调机制来激活该fd,epoll_wait便可以收到通知。
epoll为什么要有epollet触发模式?
如果采用epolllt模式的话,系统中一旦有大量你不需要读写的就绪文件描述符,它们每次调用epoll_wait都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率。
而采用epollet这种边沿触发模式的话,当被监控的文件描述符上有读写事件发生时,epoll_wait()会通知处理程序去读写。
如果这次没有把数据全部读写完成(如读写缓冲区太小),那么下次调用epoll_wait()时,它不会通知你,也就是只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你!!!这种模式比水品触发效率高,系统不会充斥大量你不关心的就绪文件描述符。
epoll的优点:
1、没有最大并发连接的限制,能打开的fd的上限远大于1024(1G的内存上能监听10万个端口);
2、效率提升,不是轮询的方式,不会随着fd数目的增加效率下降,只有活跃可用的fd才会调用callback函数;即epoll最大的优点是它只管活跃的连接,而与总链接数无关,因此在实际的网络环境中,epoll的效率就会远高于select和poll。
3、内存拷贝,利用mmap()文件映射内存加速于内核空间的消息传递;即epoll使用mmap减少复制开销。
select、poll、epoll的区别总结:
1、支持一个进程所能打开的最大连接数
select 是 32位机默认是1024个,64位机默认是2048。
poll 本质上于select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储的。
epoll 虽然有连接数上限,但是很大,1G内存的机器上可以打开10万左右的连接,2G内存的可以打开20万左右的连接。
2、fd剧增后带来的I/O效率问题
select 每次调用事都会对连接进行线性遍历,所以随着fd的增加会造成遍历速度慢,呈线性下降性能问题。
poll 同上
epoll epoll内核中实现是根据每个fd的callback函数来实现的,只有活跃的socket才会主动调用callback,所以在活跃的socket较少的情况下,使用epoll没有前面两者的线性下降的性能问题,但是所有的socket都很活跃的情况下,可能会有性能问题。
3、消息传递方式
select 内核需要将消息传递到用户空间,都需要内核拷贝动作
poll 同上
epoll 通过内核和用户空间共享一块内存来实现的。
总结:
综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点。
1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。
2、select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善。
相关推荐
彻底搞懂 select/poll/epoll,就这篇了
之前已经把网络 I/O 相关要点都盘了,还剩 select/poll/epoll 这几个区别没说,这篇就来搞搞它们,并且是从完全理解原理的角度来区分它们。本来是要上源码的,但是感觉没啥必要,身为应用开发者我觉得理解原理就行了,源码反正看了就忘了,理解才是最重要!所以我就尽量避免代码且用大白话来盘一盘这三个玩意。话不多说,发车。首先,我们知道 select/poll/epoll 是用来实现多路复用的,即一个线程利用它们即可 hold 诸多个 socket。按照这个思路,线程不可能被任何一个被管理的 Socke
select、poll、epoll之间的区别(搜狗面试)
(1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。 (2)poll==>时间复杂度O(n) poll本质上和select没...
IO多路复用之select、poll、epoll之间的区别总结
select、poll、epoll都是IO多路复用的机制。IO多路复用就是通过一种机制,让一个进程/线程可以监视多个描述符,一旦某个描述符就绪(一般是读写就绪),能够通知应用程序进行相应的读写操作。I/O复用虽然能同时监听多个文件描述符,当其本质上还是同步IO模型,因为需要在读写事件就绪后程序自己负责进行读写事件的处理,而这个读写过程是阻塞的。如果要实现并发,只能使用多进程/多线程等编程手段了。 ...
select、poll和epoll的区别
本文总结了从阻塞I/O模型到多路复用I/O模型的演变,以及select、poll、epoll三者各自优缺点。
Qt+VS集成高德红外相机SDK与OpenCV的采图实践
本文详细介绍了在Qt和Visual Studio环境中集成高德红外相机SDK与OpenCV的完整实践方案。涵盖环境配置、SDK初始化、图像采集与处理、多线程优化等关键技术点,重点解决了高德红外相机数据转换、温度信息提取和Qt界面显示优化等核心问题,为红外图像处理应用开发提供可靠参考。
浅谈专项测试之弱网络测试
浅谈专项测试之弱网络测试 一.弱网络测试背景 移动端产品的使用并非完全都是在流畅的wifi环境,大部分用户主要使用4G,3G,2G等网络,另外因为移动端产品使用的场景多变,如进公交,上地铁,坐电梯,使得弱网测试显得尤为重要。考虑到各种场景的客户端展示及容错,提升产品的印象和用户体验,提高产品的健壮性,弱网测试必不可少。 二.弱网络测试建议 网下需要进行功能点测试,无网络测试,网络切换测试等,测试过程除了关注功能点的实现,还应关注用户体验等各个方面 三.弱网络测试通用功能点总结 四.弱网络测试用例实例
select poll epoll之间的区别
前导 首先在分析他们之前的区别前,需要明确几个概念。 同步阻塞、 同步非阻塞 异步非阻塞 同步和异步的概念: 同步是指用户线程发起IO请求后,需要等待或者轮询内核IO操作完成后才能继续执行; 异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程或者调用用户线程注册的回调函数。 阻塞和非阻塞的概念: 阻塞是指IO操作需要彻底完成后才返回到用户空间; 非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。 I/O 同步和异步的区别在于:
从防御者视角复盘:用WinArpAttacker和Wireshark在Windows上模拟并检测ARP欺骗攻击
本文详细解析了Windows平台下的ARP欺骗攻击与防御策略,通过WinArpAttacker和Wireshark工具模拟攻击并检测异常流量。文章涵盖实验环境搭建、攻击原理深度解析、流量特征分析及企业级防御方案,帮助安全运维人员全面掌握ARP攻击检测与防护技术。
select,poll,epoll之间的关系和区别
文件描述符(File Descriptor,简称FD)是一个抽象的非负整数,用于在操作系统中唯一标识一个打开的文件或其他资源,如管道、设备等。每个进程在执行时,操作系统会为其维护一个文件描述符表,这个表记录了该进程打开的所有文件和其他资源的引用。文件描述符在这个表中作为索引使用,指向表中的一个条目,每个条目包含了资源的相关信息和操作该资源的能力。标识资源:为系统中的每个打开资源提供一个唯一的标识符。简化操作:通过文件描述符,进程可以方便地对文件进行读写操作,而无需关心底层的实现细节。资源管理。
SIwave:在 SIwave 中释放计算频率扫描的强大功能
AEDT 的电路工具允许注入正确的电压和电流。要使用电路工具,SIwave 必须首先使用 PI 求解器求解结构的 S 参数。
RT-Thread新手必看:FMT飞控移植中的5个常见坑及解决方案
本文针对RT-Thread新手在移植FMT开源飞控时遇到的5大核心挑战,提供了深度解决方案。内容涵盖SCons构建系统配置、RT-Thread版本API兼容性处理、BSP与设备驱动适配、TOML系统配置解析以及算法模块集成调试,帮助开发者高效避坑,成功完成飞控移植。
select、poll、epoll之间的区别比较
select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。 poll==>时间复杂度O(n) poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的. epoll
计算机网络实验——入侵检测系统实验
在图1所示的网络结构中,此方案的具体实施:在路由器Router1的接口1出方向配置入侵检测策略,在收到ICMP ECHO请求包时,丢弃并同步向日志服务器报告警告,此时,终端PC2和PC3无法对终端PC0和PC1执行ping操作,并且日志服务器将记录相应的警告信息;在实验一的基础上,添加扩展分组过滤器,指定需要进行检测的信息流的类别,将扩展分组和对应的入侵检测规则进行绑定,使得只对特定的信息流进行入侵检测。加载指定类别的特征库,这里的指定类别是 ios_ips 类别中的 basic 子类别。
select、poll、epoll之间的区别总结
select、poll、epoll之间的区别总结[整理] </h1> <div class="clear"></div> <div class="postBody"> <div id="cnblogs_post_body" class="blogpost-body blogpost-body-html"> select,poll,e...
BetaFlight开源飞控源码分析
BetaFlight是穿越机领域比较成熟的开源飞控,本篇文章主要分析一下源代码以及如何使用这个开源代码
利用人工神经网络在Abaqus中实现本构模型的网格粗化计算框架:详细指南与实践
在这篇文章中,我们详细介绍了如何在Abaqus中实现基于人工神经网络(ANN)的本构模型以进行网格粗化的计算框架。我们通过两个主要模块——数据生成器模块和ANN训练模块,实现了这一计算框架,并将训练好的ANN集成到Abaqus的用户材料子程序(UMAT)中,创建了一个基于ANN的本构模型。我希望这篇文章能帮助到那些希望在Abaqus中实现基于ANN的本构模型的读者,同时,我也非常欢迎大家提出宝贵的意见和建议,让我们共同进步。
1757



被折叠的 条评论
为什么被折叠?



