select、poll和epoll之间的区别
在深入理解select、poll和epoll之间的区别之前,首先要了解什么是IO多路复用模型。
IO多路复用
简单来说,IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备就绪,它就通知该进程去进行IO操作。
详细的描述可以参考IO模型。select、poll和epoll都是提供I/O多路复用的解决方案。
select
- 函数
int select(int maxfdp, fd_set *readset, fd_set *writeset,
fd_set *exceptset, struct timeval *timeout);
- 基本原理:select 函数监视的文件描述符分3类,分别是
writefds、readfds、和exceptfds。调用select时会被阻塞,直到有fd就绪(读、写、或者异常),或者超时(timeout指定等待时间,如果立即返回设为null即可)函数返回一个大于0的值,然后通过遍历文件描述符集合fd_set,来找到就绪的描述符 - 说明:
maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1。fd_set是以位图的形式来存储这些文件描述符。maxfdp也就是定义了位图中有效地位的个数 - 时间复杂度:
O(n),n为文件描述符集合fd_set的大小 - 文件描述符最大限制:
1024
poll
- 函数
int poll ( struct pollfd * fds, unsigned int nfds, int timeout);
- 基本原理:和select 函数很相似,定义了一个
struct pollfd结构类型的数组,用于存放需要检测其状态的所有文件描述符。调用poll函数之后,系统不会清空这个数组。特别是对于文件描述符比较多的情况下,在一定程度上可以提高处理的效率。这一点与select()函数不同,调用select()函数之后,select()函数会清空它所检测的文件描述符集合,导致每次调用select()之前都必须把文件描述符重新加入到待检测的集合中。因此,select()函数适合于只检测一个文件描述符的情况,而poll()函数适合于大量文件描述符的情况 - 时间复杂度:
O(n),n为文件描述符集合的大小 - 文件描述符最大限制:无限制,
fds是一个链表
epoll
- 函数
// 建立一个epoll对象,参数size是内核保证能够正确处理的最大句柄数
int epoll_create(int size);
// 操作上面建立的epoll
// 例如,将刚建立的socket加入到epoll中让其监控,或者
// 把 epoll正在监控的某个socket句并移出epoll
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
// 在指定的timeout时间内,当所有句柄中有事件发生时,就返回给用户态的进程
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
- 基本原理:将所有的文件描述符
fd_set存储在共享内存(用户空间和内核空间都可以直接访问)。调用epoll_create函数创建epoll对象,并以红黑树的结构存储在内核空间,epoll_ctl函数用来在红黑树中添加或者注销待监视文件描述符,最后调用epoll_wait函数直到有就绪的文件描述符立即返回给用户态进程

- 时间复杂度:
O(1) - 文件描述符最大限制:能打开的fd的上限远大于
1024(1G的内存上能监听约10w+)
epoll的两种工作方式
- 水平触发(LT):若就绪的事件一次没有处理完所有要做的事件,就会一直去处理。即就会将没有处理完的事件继续放回到就绪队列之中(即那个内核中的链表),一直进行处理
- 边缘触发(ET) :就绪的事件只能处理一次,若没有处理完会在下次的其它事件就绪时再进行处理。而若以后再也没有就绪的事件,那么剩余的那部分数据也会随之而丢失。
ET模式的效率比LT模式的效率要高很多。只是如果使用ET模式,就要保证每次进行数据处理时,要将其处理完,不能造成数据丢失,这样对编写代码的人要求就比较高。 为了保证数据的完整性,ET模式只支持非阻塞的读写。
select、poll和epoll对比
| 实现机制 | 时间复杂度 | 连接数 | 传递方式 |
|---|---|---|---|
| select | O(n) |
1024 |
内核-->用户 |
| poll | O(n) |
无限制 | 内核-->用户 |
| epoll | O(1) |
很大 | 共享内存 |
在select和poll中,进程只有在调用方法后,内核才对所有监视的文件描述符进行扫描,发现有任何一个文件描述符就绪或者超时就立刻返回。epoll采用基于事件的就绪通知方式,事先通过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait()时便得到通知。
select、poll和epoll之间的区别的更多相关文章
- select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
- select、poll、epoll之间的区别
select.poll.epoll之间的区别总结[整理] select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就 ...
- select、poll、epoll之间的区别(搜狗面试)
(1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对 ...
- 网络篇:linux下select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪 ...
- [转帖] select、poll、epoll之间的区别总结[整理] + 知乎大神解答 https://blog.csdn.net/qq546770908/article/details/53082870 不过图都裂了.
select.poll.epoll之间的区别总结[整理] + 知乎大神解答 2016年11月08日 15:37:15 阅读数:2569 http://www.cnblogs.com/Anker/p/3 ...
- (转)select、poll、epoll之间的区别
本文来自:https://www.cnblogs.com/aspirant/p/9166944.html (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道 ...
- 转:select、poll、epoll之间的区别总结[整理]
转:select.poll.epoll之间的区别总结[整理] select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就 ...
- select,poll,epoll之间的区别
(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替.而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替, ...
- select、poll、epoll之间的区别总结[整理]
select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...
随机推荐
- leetcode125. 验证回文串 python 简单
125. 验证回文串 难度简单 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: &quo ...
- 【秒懂Java】【第1章_初识Java】01_编程语言
各位小伙伴们好哇!从今日起,我将开始更新<秒懂Java>系列文章,从0开始讲解Java的方方面面,后面也将推出配套的视频版,欢迎大家保持关注! 我会尽力办到:在保证通俗易懂的同时,不丢失知 ...
- vueX基础知识点笔记
vuex是专门用来管理vue.js应用程序中状态的一个插件.他的作用是将应用中的所有状态都放在一起, 集中式来管理.需要声明的是,这里所说的状态指的是vue组件中data里面的属性.简单的来说, 它就 ...
- MongoDB快速入门教程 (2)
2.MongoDB的基本的CRUD操作 2.1.创建文档 在具体操作之前,想要知道有多少数据库,可以执行下面命令 show dbs 在mongodb中,数据库中包含的叫做集合(表),集合中存储的内容叫 ...
- Spring AOP学习笔记05:AOP失效的罪因
前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ...
- Python3笔记018 - 4.3 元组
第4章 序列的应用 python的数据类型分为:空类型.布尔类型.数字类型.字节类型.字符串类型.元组类型.列表类型.字典类型.集合类型 在python中序列是一块用于存放多个值的连续内存空间. py ...
- css兼容大部分浏览器的文本超出部分显示省略号
css之字体多行省略(兼容大部分浏览器) 字体单行显示省略号 <style> .box1{ width: 500px; height: 1.5em; overflow: hidden; t ...
- 面试WEB前端如何才能通过?
从事web前端工作七年时间,因为一直是非常热爱编程的,从小就有兴趣,大学就是学计算机的,技术应该比一般同龄的都要好一些,今天我想给大家讲述一下,目前想要做web前端开发,面试成功应该如何去学习,要具备 ...
- Evacuation,题解
题目: 题意: 有人,门(只有边上有,且1s只能出去一个人),和墙,每s人可移动一个格子,问多少秒所有人可以逃出,逃不出输出“impossible” 分析: 首先,我们先想着样一个问题,如果这个人在某 ...
- #pragma comment(linker,"/SECTION:shared,RWS")
Windows在一个Win32程序的地址空间周围筑了一道墙.通常,一个程序的地址空间中的数据是私有的,对别的程序而言是不可见的.但是执行多个执行实体表示了程序的所有执行实体之间共享数据是毫无问题的.当 ...