select、poll、epoll的区别
本文写于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的区别的更多相关文章
- select.poll,epoll的区别与应用
先讲讲同步I/O的五大模型 阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型 而select/poll/epoll属于I/O复用模型 select函数 该函数 ...
- 最快理解 - IO多路复用:select / poll / epoll 的区别.
目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...
- bio,nio,aio的区别 select,poll,epoll的区别
先了解一些基本概念,什么是socket?什么是I/O操作 unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切 ...
- python select poll epoll的区别
select 优点:为最早的异步io处理模块,他可以再linux上和windows上使用,跨平台兼容性好,而poll和epoll都不能在windows系统环境中使用. 缺点:select的机制决定了他 ...
- 转--select/poll/epoll到底是什么一回事
面试题:说说select/poll/epoll的区别. 这是面试后台开发时的高频面试题,属于网络编程和IO那一块的知识.Android里面的Handler消息处理机制的底层实现就用到了epoll. 为 ...
- 哪5种IO模型?什么是select/poll/epoll?同步异步阻塞非阻塞有啥区别?全在这讲明白了!
系统中有哪5种IO模型?什么是 select/poll/epoll?同步异步阻塞非阻塞有啥区别? 本文地址http://yangjianyong.cn/?p=84转载无需经过作者本人授权 先解开第一个 ...
- Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)
一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...
- select,poll,epoll的归纳总结区分
Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd标志位 ...
- select, poll, epoll的实现分析
select, poll, epoll都是Linux上的IO多路复用机制.知其然知其所以然,为了更好地理解其底层实现,这几天我阅读了这三个系统调用的源码. 以下源代码摘自Linux4.4.0内核. 预 ...
- select 和epoll模型区别
1.select 和epoll模型区别 1.1.网络IO模型概述 通常来说,网络IO可以抽象成用户态和内核态之间的数据交换.一次网络数据读取操作(read),可以拆分成两个步骤:1)网卡驱动等待数据准 ...
随机推荐
- webpack4 系列教程(十六):开发模式和生产模式·实战
好文章 https://www.jianshu.com/p/f2d30d02b719
- 从0开始的Hexo主题制作
从0开始的Hexo主题制作 从零开始制作 Hexo 主题 H2O主题 先坑着
- [IoC容器Unity]第一回:Unity预览
1.引言 高内聚,低耦合成为一个OO架构设计的一个参考标准.高内聚是一个模块或者一个类中成员跟这个模块或者类的关系尽量高,低耦合是不同模块或者不同类之间关系尽量简单. 拿咱国家举例来说,假如你是中国人 ...
- HDU 6521 Party
6521 思路: 线段树玄学剪枝, 俗称吉司机线段树. 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize ...
- 雷林鹏分享:jQuery EasyUI 数据网格 - 添加复选框
jQuery EasyUI 数据网格 - 添加复选框 本实例演示如何放置一个复选框列到数据网格(DataGrid).通过复选框,用户将可以选择 选中/取消选中 网格行数据. 为了添加一个复选框列,我们 ...
- 2018-2019-2 20165303《网络攻防技术》Exp5 MSF基础应用
实践目标 1.一个主动攻击实践 ms17_010(成功) ms08_067(成功) 2.一个针对浏览器的攻击 ms13-008(成功唯一) ms11-050(失败) ms13-069(成功唯一) ad ...
- java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory的解决
java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory的解决 博客分类: 问题 ApacheJavaTo ...
- Django web框架-----win10搭建django2.1.7开发环境,定义简易视图及网址
① 安装Django 使用pip命令或者pycharm setting的project Interpreter工具添加安装 检查是否安装成功,以下命令无报错即成功: 查看安装的Django版本号的两种 ...
- Jquery版本对IE浏览器的支持
浏览器名称 Jquery最低 Jquery最高 IE6 1.0 1.12 IE7 1.0 1.12 IE8 1.0 1.13 jquery各版本下载:https://code.jquery.com/j ...
- javascript高级程序设计第3版——第12章 DOM2与DOM3
12章——DOM2与DOM3 为了增强D0M1,DOM级规范定义了一些模块. DOM2核心:为不同的DOM类型引入了一些与XML命名空间有关的方法,还定义了以编程方式创建Document实例的方法: ...