本文写于2017-02-26,从老账号迁移到本账号,原文地址:https://www.cnblogs.com/huangweiyang/p/6444746.html

select、poll、epoll三组系统调用都能同时监听多个文件描述符,它们将等待由timeout参数指定的超时时间,直到一个或多个文件描述符上有事件时返回,返回值是就绪的文件描述符的数量。返回0表示没有事件发生。

下面从事件集、最大支持文件描述符数、工作模式和具体实现等四个方面进一步比较它们的异同。

事件集:

select的参数类型fd_set没有将文件描述符和事件绑定(没有用数据结构绑定fd和event),它仅仅是一个文件描述符集合,因此select需要提供3个这种类型的参数来分别传入可读、可写及异常事件。一方面这使得select不能处理更多类型的事件,另一方面由于内核对fd_set集合的在线修改,应用程序下次调用select前不得不重置这3个fd_set集合。

poll参数类型pollfd结构体将文件描述符和事件绑定起来,任何事件都被统一处理,并且内核每次修改的都是pollfd结构体的revents成员,而events成员不变,因此下次调用poll时应用程序无需重置pollfd。

由于每次select和poll调用都返回整个用户注册的事件集合(其中包括就绪的和未就绪的),所以应用程序索引就绪文件描述符的时间复杂度为O(n)。

epoll则采用与select和poll完全不同的方式来管理用户注册的事件。它在内核中维护一个事件表,并提供了一个独立的系统调用epoll_ctl来控制往其中添加、注册、修改事件。这样,每次epoll_wait调用都直接从内核事件表中取得用户注册的时间,而无需反复从用户空间读入这些事件。epoll_wait系统调用的events参数仅用来返回就绪的时间,应用程序索引文件描述符时间复杂度为O(1)。

工作模式

select和poll都只能工作在相对低效的LT模式,而epoll则可以工作在ET高效模式,并且epoll还支持EPOLLONESHOT事件。该事件能进一步减少可读、可写、异常事件被触发的次数。

实现原理

从实现原理上来说,select和poll采用的都是轮询的方式,即每次调用都要扫描整个注册文件描述符集合,并将其中就绪的文件描述符返回给用户程序,因此他们检测就绪事件的时间复杂度是O(n)。epoll则不同,当我们使用epoll_ctl注册事件时,epoll内部会把socket封装成为epitem插入到红黑树之中,还会给内核中断处理程序注册一个回调函数。当socket上有事件时,内核会把对应的epitem插入到rdlist中,epoll_wait检测rdlist不为空,就将该就绪队列的内容拷贝到用户空间。(如果是LT模式,在拷贝之后还会将epitem重新加入rdlist)。因此,epoll_wait不必轮询整个文件描述符集合,算法时间复杂读是O(1)。但是,活动链接比较多时,epoll_wait未必比select和poll高,因为此时回调函数触发过于频繁。所以epoll_wait适用于连接数量多,但活动连接较少的情况。

如下表:

系统调用 select poll epoll
事件集合 用户通过3个参数分别传入感兴趣的可读、可写及异常等事件,内核通过对着写参数的在线修改来反馈其中的就绪事件。这是用用户每次调用select都要重置这三个参数 poll统一处理所有事件类型,因此只需一个事件集参数,用户通过pollfd.events传入感兴趣的事件,内核通过修改pollfd.revents反馈其中就绪事件 内核通过一个事件表直接管理用户感兴趣的所有事件,因此每次调用epoll_wait时,无需反复传入用户感兴趣的时间。epoll_wait系统调用的参数events仅用来反馈就绪的事件
应用程序索引就绪文件描述符的时间复杂度 O(n) O(n) O(1)
最大支持的文件描述符数 1024 65535 65535
工作模式 LT LT LT和ET
内核实现和国祚效率 采用轮询方式来检测就绪事件,算法时间复杂度为O(n) 采用轮询方式来检测就绪事件,算法时间复杂度为O(n) 采用回调方式来检测就绪事件,时间复杂度O(1)

select、poll、epoll的区别的更多相关文章

  1. select.poll,epoll的区别与应用

    先讲讲同步I/O的五大模型 阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型 而select/poll/epoll属于I/O复用模型 select函数 该函数 ...

  2. 最快理解 - IO多路复用:select / poll / epoll 的区别.

    目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...

  3. bio,nio,aio的区别 select,poll,epoll的区别

    先了解一些基本概念,什么是socket?什么是I/O操作 unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切 ...

  4. python select poll epoll的区别

    select 优点:为最早的异步io处理模块,他可以再linux上和windows上使用,跨平台兼容性好,而poll和epoll都不能在windows系统环境中使用. 缺点:select的机制决定了他 ...

  5. 转--select/poll/epoll到底是什么一回事

    面试题:说说select/poll/epoll的区别. 这是面试后台开发时的高频面试题,属于网络编程和IO那一块的知识.Android里面的Handler消息处理机制的底层实现就用到了epoll. 为 ...

  6. 哪5种IO模型?什么是select/poll/epoll?同步异步阻塞非阻塞有啥区别?全在这讲明白了!

    系统中有哪5种IO模型?什么是 select/poll/epoll?同步异步阻塞非阻塞有啥区别? 本文地址http://yangjianyong.cn/?p=84转载无需经过作者本人授权 先解开第一个 ...

  7. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...

  8. select,poll,epoll的归纳总结区分

    Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd标志位 ...

  9. select, poll, epoll的实现分析

    select, poll, epoll都是Linux上的IO多路复用机制.知其然知其所以然,为了更好地理解其底层实现,这几天我阅读了这三个系统调用的源码. 以下源代码摘自Linux4.4.0内核. 预 ...

  10. select 和epoll模型区别

    1.select 和epoll模型区别 1.1.网络IO模型概述 通常来说,网络IO可以抽象成用户态和内核态之间的数据交换.一次网络数据读取操作(read),可以拆分成两个步骤:1)网卡驱动等待数据准 ...

随机推荐

  1. 【新特性】JDK1.6

    一.Desktop类和SystemTray类 在JDK6中 ,AWT新增加了两个类:Desktop和SystemTray. 前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定 ...

  2. 关于js中的类式继承

    ; }; ,,]; }; ); ; }; //子类 function Bb(){ }; var F=new f(); F.prototype=Aa.prototype;//此处只能传递方法,没有办法传 ...

  3. java 随机出题四则运算

    作业要求来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186 我的github地址:https://github.com/k ...

  4. BalkanOI 2018 Parentrises(贪心+基础DP)

    题意 https://loj.ac/problem/2713 思路 对于 \(\text{P1}\) 的档,首先可以看出 \(O(n^3)\) 的方法,即用 \(O(n^3)\) 的 \(\text{ ...

  5. Mac下文件的编码及修改编码

    brew install enca # Enca语法 Usage: enca [-L LANGUAGE] [OPTION]... [FILE]... enconv [-L LANGUAGE] [OPT ...

  6. 剑指offer 08:跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). public class Solution { public int ...

  7. springboot(一)

    @Configuration:声明当前类是一个配置类==等同于 spring的xml文件,如果使用了改注解意味着该类里可能有0个或者多个@bean注解,此处没有使用包扫描,是因为所有的@bean 都在 ...

  8. Qt5OpenGL.顶点像素大小设置

    1. 2. // ZC: 像素点的大小 设置:2种方式: // ZC: (1)代码指定方式 // ZC: (2)GLSL种指定方式[A]只能在顶点着色器种指定,不能在片原着色器种指定[B]代码中还要指 ...

  9. vue admin mock数据

    搭建脚手架axios访问不到接口:mock数据的问题mock下的index.js设置了默认指向

  10. 3 - Two Pointers Algorithm

    5. Kth Largest Element (quick sort的变种) https://www.lintcode.com/problem/kth-largest-element/descript ...