select poll epoll之间的区别
1、select poll每次循环调用时都需要将文件描述符和事件拷贝到内核空间,epoll只需要拷贝一次;
(这种情况在对于描述符数量不大的情况下还可以,但是当描述符的数量达到十几万甚至上百万的时候,他们的效率就会急速降低,因为每一次轮询都需要将这些所有的socket描述符从用户态拷贝到内核态,会造成大量的浪费和资源开销)
2、select poll每次返回后,需要遍历所有描述符才能找到就绪的,因此它俩的时间复杂度为O(n),而epoll只需要O(1);
3、select poll内核通过轮询的方式完成,时间复杂度为O(n),而epoll是在每个文件描述符上设置回调函数,时间复杂度为O(1)。
(与select相比poll没有太多的区别,唯一的改进是使用了链表来保存fd,使得能够监听的数量远远超过了1024,但是对于将用户数据拷贝到内核空间,线性遍历fd这两个并没有太大的改变)
epoll的底层实现
利用sys_epoll_create()创建内核事件表,在sys_epoll_creat()里面创建了struct eventpoll结构体,其中包括两个成员:
就绪队列struct list_head rdlist,用来存放有就绪事件的描述符;
红黑树struct rb_root rbr,作为内核事件表,用来收集描述符;
每一个epoll对象都有一个独立的eventpoll结构体,用于存放通过epoll_ctl方法向epoll对象中添加进来的事件。这些事件都会通过ep_instert挂载到红黑树上,这样重复添加的事件就可以通过红黑树而高效的识别出来;
而所有添加到epoll中的事件都会与驱动程序建立回调关系,当相应的事件发生时,会调用ep_poll_callback这个回调方法,它会将发生的事件添加到rdlist中;
在epoll中,对于每一个事件,都会建立一个epitem结构体,它里面包括:
红黑树节点
Rdlist节点
事件句柄信息
一个指向其所属的eventpoll对象的指针
期待发生的事件类型
当调用epoll_wait检查是否有事件发生时,只需要检查eventpoll对象中的rdlist中是否有epitem元素即可。如果rdlist不为空,则把事件复制到用户态,同时将事件数量返回给用户;如果为空,就等待直到超时
通过分析可知:通过红黑树和双链表数据结构,并结合回调机制,造就了epoll的高效;
epoll的工作模式ET和LT
ET模式是高速模式,叫做边缘触发模式,LT模式是默认模式,叫做水平触发模式;
两种工作模式的区别:
ET模式:如果一个描述符上有数据到达,然后读取这个描述符上的数据,如果没有将数据读取完,当下次epoll_wait返回的时候这个描述符中的数据就再也读取不到了;
LT模式:如果对一个描述符的数据没有读取完成,那么下次当epoll_wait返回的时候会继续触发,也就可以继续获取到这个描述符,从而能够接着读;
实现方式:
当一个socket描述符的中断事件发生,内核会将数据从网卡复制到内核,同时将1socket描述符插入到rddlist中,如果此时调用了epoll_wait会把rdlist中就绪的socket描述符复制到用户空间,然后清理掉这个rdlist中的数据,最后epoll_wait还会再次检查这些socket描述符。如果是工作在LT模式下,并且这些socket描述符上还有数据没有读取完,那么LT就会再次把没有读完的socket描述符放入到rdlist中,所以再次调用epoll_wait的时候会再次触发。
select poll epoll之间的区别的更多相关文章
- 高性能网络服务器--I/O复用 select poll epoll_wait之间的区别
一.select select采用的是集合的方式,最多只能访问1024个套接字.可读,可写,异常,三种访问,并且采用的是轮训的方式进行每次访问都需要从内核向用户空间拷贝 二.poll poll采用的是 ...
- I/O多路复用之select,poll,epoll简介
一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...
- 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之间的区别
(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替.而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替, ...
- (转)select、poll、epoll之间的区别
本文来自:https://www.cnblogs.com/aspirant/p/9166944.html (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道 ...
随机推荐
- 流程控制(判断if switch)
判断语句 判断条件比特别多大 时候用switch 其他时候if语句比较方便 1.if……else a) if(判断条件) {执行语句:} b) else if (判断语句){执行语句:} ...
- CodeForces 754D Fedor and coupons ——(k段线段最大交集)
还记得lyf说过k=2的方法,但是推广到k是其他的话有点麻烦.现在这里采取另外一种方法. 先将所有线段按照L进行排序,然后优先队列保存R的值,然后每次用最小的R值,和当前的L来维护答案即可.同时,如果 ...
- python接口自动化:python3.6中import Crypto.Hash报错的解决方案
一:问题 python3.6中算法加密引入包Crypto报错,即便安装了: pip install crypto pip install pycrypto pip install pycryptodo ...
- Fastadmin 后台编辑,或者添加的时候,出现的问题
1.情况如图:编辑的时候,这个关联id,默认查出来的是用户昵称,如果要显示用户名,该怎么修改,不要着急,听我慢慢道来 2.首先要找到 编辑页面,检查问题 3.完成
- VNC连接Ubuntu 16.04桌面灰色的问题解决
1.安装gnome apt-get install --no-install-recommends ubuntu-desktop gnome-panel gnome-settings-daem ...
- 如何使用Navicat监控mysql数据库服务器
https://jingyan.baidu.com/article/c33e3f48de5208ea15cbb525.html 打开Navicat 点击[工具]菜单,选择[服务器监控]下的[MyS ...
- 打开新窗口(window.open)关闭窗口(window.close)
打开新窗口(window.open) open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法: window.open([URL], [窗口名称], [参数字符串]) 参数说明: URL: ...
- [Tool]截屏利器FSCapture7.6下载
下载地址:https://pan.baidu.com/s/1XQ1P5hHwZd0NE7bdz_znQQ 或是:https://files.cnblogs.com/files/xiandedanten ...
- Spring Bean学习创建及使用<二>
转自:http://blessht.iteye.com/blog/1162131 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的 ...
- mongodb将mysql数据导入
1.首先将数据从mysql数据库导出为xls文件 SELECT * FROM user INTO OUTFILE "F:\1.xls" 2.notepad++打开,用utf8编码保 ...