select、poll以及epoll三组I/O复用函数的区别
来源:互联网 发布:c语言boolean的用法 编辑:程序博客网 时间:2024/05/22 13:25
三组I/O复用函数的区别
select、poll和epoll三组I/O复用系统调用。三者之间的异同
一、相同点:
1、这3组系统调用都能同时监听多个文件描述符
2、他们将等待有timeout参数指定的超时时间,直到一个或者多个文件描述符上有事件返回,返回值是就绪文件描述符的数量,返回0表示没有事件发生。
二、不同点:
1、事件集
- 都通过某种结构体变量来告诉内核监听哪些文件描述符上的哪些事件。用该结构类型的参数获取内核处理的结果。
- select的参数类型没有 将文件描述符和事件绑定,仅仅是一个文件描述符的集合。
- poll的参数类型pollfd,将文件描述符和事件都定义在其中,任何事件都被统一处理,使编程接口简洁,并且内核修改每次都是pollfd结构体的revents成员,而events保持不变。因此下次应用程序调用poll时应用程序不需要重置pollfd的事件集参数。
- 小结:由于每次select和poll调用都返回整个用户注册事件的集合(就绪的+未就绪的)所以应用程序索引就绪文件描述符的时间复杂度是O(n);
- epoll在内核中维护一个事件表,并提供独立的系统调用epoll_ctl(),添加、删除、修改事件。故,每次epoll_wait调用events参数仅用来返回就绪事件,不需要反复从用户空间读入这些事件,所以应用程序索引就绪文件描述符的时间复杂度是O(1);
- epoll_wait和poll分别用nfds和maxevents参数指定最多监听多少个文件描述符和事件,这两个数值都达到系统允许打开的最大文件描述符的数目(大小为65535),而select要监听最大文件描述符数量通常有限,虽然用户可以修改这个限制,但会导致不可预期的后果。
二、工作模式上的异同点:
1、select和poll只能在LT模式下;
2、epoll可以在工作高效的ET模式下。epoll支持EPOLLONESHOT事件,该事件可以进一步减少可读、可写和异常事件被触发的次数。
三、具体实现
1、实现原理:
- select和poll,采用轮询的方式。每次调用都要扫描整个注册文件描述符集合,并将就绪的文件描述符返回给用户程序,故检测就绪事件O(n);
- epoll_wait,采用回调函数的方法。内核检测到就绪文件描述符时将触发回调函数,回调函数将该文件描述符上对应的事件插入就绪事件队列,内核最后在适应的时机将该就绪事件队列中的内容拷贝到用户空间->epoll_wait无需轮询整个文件描述符的集合,来检测哪些事件已经就绪了。O(1)
2、适用情况:
- 当活动连接比较多的时候(回调函数被触发的过于频繁),epoll_wait的效率未必有select和poll高。
- epoll_wait适用于连接数量较多,但活动连接较少的情况
阅读全文
0 0
- select、poll以及epoll三组I/O复用函数的区别
- 2016.8.25--I/O复用函数(select,poll,epoll)
- I/O复用之select、poll、epoll函数
- I/O复用的系统调用select、poll、epoll
- I/O复用的不同机制间区别(select/poll/epoll)
- I/O复用之select、poll和epoll复用函数的比较
- I/O多路复用select、poll、epoll的区别使用
- I/O复用-select、poll和epoll的区别
- I/O多路复用select、poll、epoll的区别使用
- I/O复用中的 select poll 和 epoll
- 【整理】I/O复用模型中的 select、poll、epoll
- I/O复用实现方式:select、poll、epoll
- 三种 I/O 复用(select poll epoll)的优缺点总结 & epoll 为何如此高效
- I/O 多路复用 以及 select, poll, epoll详解
- I/O复用的 select poll和epoll的简单实现
- 网络编程-I/O复用服务器select/epoll/poll的使用基本概念
- Linux I/O多路复用之select,poll与epoll区别
- Linux I/O多路复用之select,poll与epoll区别
- 可爱小仓鼠代码,放在网页里很可爱
- ORA-00838: Specified value of MEMORY_TARGET is too small
- 微信小程序中点击View中任何位置都可以触发相应事件的解决办法
- javaseday04(数组容器,排序,进制转换)
- 百练_4085:数组去重排序
- select、poll以及epoll三组I/O复用函数的区别
- mysqli_result 类中的成员方法和属性
- Handler消息处理机制---从源码分析
- WIFI 一键配置原理-ESP8266
- Android EditText 限制输入类型数字或小数,并且小数位数限定为两位
- c++重载构造函数时应注意的几点
- windows安装memcached_服务器端
- centos7 系统上 mariadb galera 集群搭建
- HashMap的设计原理和实现分析