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事件发生了,却并不知道 ...
随机推荐
- C# 列排序
private void button2_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns. ...
- BZOJ 2976: [Poi2002]出圈游戏 Excrt+set
人数很少,可以直接用 $set$ 来模拟人的情况. 然后就能得到若干个方程,用 $excrt$ 进行合并即可. #include <set> #include <cmath> ...
- Linux下SHA256校验
一.将Hash: SHA256文件和需要检验的文件放在同一个文件夹内 二.$sha256sum -c SHA265 文件 输出: 校验文件:ok
- A. Sea Battle
A. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- 消费端ACK和重回队列
使用场景 消费端ACK和重回队列 消费端ACK使用场景: 1.消费端进行消费的时候,如果由于业务异常我们可以进行日志记录,然后进行补偿. 2.由于服务器宕机等严重问题,那我们就需要手工进行ACK保障消 ...
- Java线程之如何分析死锁及避免死锁
什么是死锁 java中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java死锁情况出现至少两个线程和两个或更多资源. 在这里,我们将写了一个简单的程序,它将导致java死锁场景,然后我们将分析 ...
- python-获取程序的路径
python获取当前路径 import os,sys 使用sys.path[0].sys.argv[0].os.getcwd().os.path.abspath(file).os.path.realp ...
- log4j 多进程配置要注意的
多进程写日志文件 方法一: 解决log4j公用配置文件,多进程同时写同一个log文件,因存在操作系统pv操作问题, 导致部分日志丢失.解决方案是不同的进程写不同的log文件 测试于:Log4j 1.2 ...
- Vue调试工具vue-devtools安装详解
https://blog.csdn.net/github_37360787/article/details/80284418
- 七十九:flask.Restful之flask-Restful蓝图与渲染模板
1.flask-Restful与蓝图结合使用如果要在蓝图中使用flask-Restful,那么在创建Api对象的时候,就不应该使用app,而是蓝图,如果有多个蓝图,则需在每一个蓝图里面创建一个Api对 ...