首页 > 其他分享 >select、poll和epoll区别

select、poll和epoll区别

时间:2024-10-19 15:33:40浏览次数:8  
标签:epoll int 描述符 内核 poll select

  1. 函数原型
    int select(int nfds,struct fd_set *readfds,struct fd_set *writefds,struct fd_set * execptfds,struct timeval *timeout);
    int poll(struct pollfd *fds,nfds_t fds,int timeout);
    epoll:
    int epoll_create(int size);
    int epoll_ctl(int epollfd,int op,int fd,struct epoll_event *event);
    int epoll_wait(int epollfd,struct epoll_event *events,int maxevents,int timeout);
  2. 使用方面
    select函数通过三个fd_set结构体变量分别给内核传递用户关注的所有可读,可写,异常事件,这使得select不能处理更多的事件类型,并且内核也通过这三个结构体变量返回就绪的文件描述符,所以每次使用之前,都必须重新设置这三个结构体变量;
    poll函数将用户关注的文件描述符及其关注的事件,内核返回的文件描述符上发生的事件分离开表示,并且通过一个用户数组将所有的文件描述符传递给内核。因此,poll函数关注的事件类型更多,每次调用也不需要重新设置;
    epoll是通过一组函数来完成的,epoll通过epoll_create创建一个内核事件表,通过epoll_ctl函数添加、删除、修改事件。epoll_wait只需要从内核事件表中读取用户的注册的事件。
  3. 使用限制
    select所使用的fd_set结构实际上是一个整形数组,32bit系统上关注的文件描述符最多为1024个,最大文件描述符数1023;
    poll和epoll分别用nfds和maxevents参数指定最多监听多少个文件描述符,这两个数值都能达到系统允许打开的最大文件描述符。
  4. 使用效率
    select、poll每次调用都需要将用户空间的文件描述符拷贝到内核空间,epoll则直接从内核读取,效率更高;
    select、poll每次都将所有的文件描述符(就绪的和未就绪的)返回,所以应用程序检索就绪文件描述符的时间复杂度为O(n),epoll通过events参数返回所有就绪的文件描述符,应用程序检索就绪文件描述符的时间复杂度为O(1)。
    select、poll只能工作在效率较低的LT模式,而epoll则能工作在ET高效模式,并且epoll还支持EPOLLONESHOT事件,从而进一步减少事件被触发的次数。
  5. 内核效率
    select和poll采用轮询的方式:即每次都需要扫描整个注册的文件描述符集合,并将其中就绪的文件描述符返回给用户程序,因此,内核中检测就绪文件描述符的算法时间复杂度为O(n),epoll则采用回调的方式,内核检测到就绪文件描述符,就触发回调函数,将文件描述符及发生的事件插入到内核就绪事件队列,因此,epoll在内核中检测就绪文件描述符的算法时间复杂度为O(1)。但是,当链接的活动比较频繁时,select和poll的效率比epoll要高,因为epoll的回调函数调用过程频繁,所以,epoll适用于链接较多,但是活动不频繁的情况。

标签:epoll,int,描述符,内核,poll,select
From: https://www.cnblogs.com/mmeng-note/p/18475959

相关文章

  • el-select 下拉搜索框
    //搜索框下拉:deep(.el-select__placeholder.is-transparent){color:#fff!important;font-size:1rem!important;}:deep(.el-select__placeholder){color:#fff!important;font-size:1rem!important;}:deep(el-select__caret){color:#fff!imp......
  • Modbus TCP 西门子PLC指令以太口地址配置以及 Poll Slave调试软件地址配置
    1前言本篇文章讲了 ModbusTCP通讯中的一些以太网端口配置和遇到的一些问题,都是肝货自己测试的QAQ。2西门子SERVER指令该指令是让外界设备主动连接此PLC被动连接,所以这里应该填 外界设备的IP地址。这边我因为是电脑的Modbus Poll主机来进行通讯的所以填的是电脑......
  • OpenCV高级图形用户界面(11)检查是否有键盘事件发生而不阻塞当前线程函数pollKey()的
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述轮询已按下的键。函数pollKey无等待地轮询键盘事件。它返回已按下的键的代码或如果没有键自上次调用以来被按下则返回-1。若要等待按键被按下,请使用waitKey。注意waitKey......
  • 【未公开0day】9.9付费进群系统 wxselect SQL注入漏洞【附poc下载】
    免责声明:本文仅用于技术学习和讨论。请勿使用本文所提供的内容及相关技术从事非法活动,若利用本文提供的内容或工具造成任何直接或间接的后果及损失,均由使用者本人负责,所产生的一切不良后果均与文章作者及本账号无关。fofa语法body="template/layuiadmin/xinadmin"一、漏洞......
  • 在 .NET 中的 ConvertAll 和 Select 方法哪个性能好
    .NET的List中提供了ConvertAll和Select两个方法,在开发中实际上应该使用哪一个?接下来通过基准测试脚本来对比性能。先编写基准测试脚本:[MemoryDiagnoser]publicclassBenchmarksTerrible{privatereadonlyList<Order>_orders;publicBenchmark......
  • linux系统epoll的ET/LT模式-附串口接收代码
    LT模式下,读事件触发后,可以按需收取想要的字节数,不用把本次接收到的数据收取干净(即不用循环到recv或者read函数返回-1,错误码为EWOULDBLOCK或EAGAIN);ET模式下,读事件必须把数据收取干净,因为你不一定有下一次机会再收取数据了,即使有机会,也可能存在上次没读完的数据没有及时......
  • layui用iframe更新表单怎么回显select下拉框中的数据
     如图所示的三个步骤,获取contentWindow,在iframe中的select的id为categoryId中赋值,最后还要重新渲染,就能在iframe中回显得到selected的选项了,效果如下图所示。  另外,我尝试过在iframe的html中添加inputtype="hidden"id="categoryHid"的元素来存放categoryId的值,并在主页......
  • 本地项目apollo的注册中心地址写的是ECS公网地址,但是项目启动后,发现它去拉取配置的时
    代码截图报错: 配置的注册中心是公网的地址,拉取配置的时候竟然变成私网了,就很离谱,后来通过网上查找资料,很多奇怪的解决方案都试了没有解决,后来发现了一篇文章,只需要在启动参数中配上:apollo.config-service参数即可,配置截图如下:-Ddev=DEV用于指定apollo中对应的环境,-Dapollo.co......
  • Linux网络(二)——socket、BIO、epoll原理
    二、内核如何与用户进程协作//创建Socket的c语言程序...intmain(){ intsk=socket(PF_INET,SOCK_STREAM,0); //忽略bind和accept ... } 2.1读取视角:Linuxsocket结构2.1.1socket源码//代码:/include/linux/net.hstructsocket{ socket_state state; shor......
  • why do we need 'select…for share' instead of a simple 'select'
    (Fromchatgpt)AsimpleSELECTqueryinPostgreSQLoperatesundertheMVCC(Multi-VersionConcurrencyControl)model,whichallowsittoreaddatawithoutlockingtherows.Thismeansitcanseeasnapshotofthedataatthestartofthetransaction,rega......