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之间的区别的更多相关文章

  1. 高性能网络服务器--I/O复用 select poll epoll_wait之间的区别

    一.select select采用的是集合的方式,最多只能访问1024个套接字.可读,可写,异常,三种访问,并且采用的是轮训的方式进行每次访问都需要从内核向用户空间拷贝 二.poll poll采用的是 ...

  2. I/O多路复用之select,poll,epoll简介

    一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...

  3. select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...

  4. select、poll、epoll之间的区别

    select.poll.epoll之间的区别总结[整理]   select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就 ...

  5. select、poll、epoll之间的区别(搜狗面试)

    (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对 ...

  6. 网络篇:linux下select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪 ...

  7. [转帖] 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 ...

  8. select,poll,epoll之间的区别

    (1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替.而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替, ...

  9. (转)select、poll、epoll之间的区别

    本文来自:https://www.cnblogs.com/aspirant/p/9166944.html (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道 ...

随机推荐

  1. js的三种异步处理

    js的三种异步处理   Promise 对象 含义: Promise是异步编程的一种解决方案, 优点: 相比传统回调函数和事件更加合理和优雅,Promise是链式编程(后面会详细讲述),有效的解决了令 ...

  2. html5文件夹上传下载组件

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

  3. 三元环HDU 6184

    HDU - 6184 C - Counting Stars 题目大意:有n个点,m条边,问有一共有多少个‘structure’也就是满足V=(A,B,C,D) and E=(AB,BC,CD,DA,A ...

  4. CUDA-F-1-1-异构计算-CUDA

    开篇废话 成熟与智慧其实和年龄相关,但绝不是完全由年龄决定,少年老成的人肯定是存在的,不是长得老,而是心态成熟,当然大多数老年人其实有些事情思考起来还是老原则,所以他们有时候做事没那么周到,所以一个人 ...

  5. Cow and Snacks

    ​ D. Cow and Snacks 参考:Codeforces 1209D. Cow and Snacks 思路:利用并查集,构建一个生成树,然后树的边数就是能够开心的客人的人数.用一个条件fin ...

  6. Java线程之Dump

    什么是线程dump Java Thread dump记录了线程在jvm中的执行信息,可以看成是线程活动的日志.Java线程转储文件有助于分析应用程序和死锁情况中的瓶颈. 如何获取线程转储文件 在这里, ...

  7. Android学习_服务

    一.           服务1.         Android多线程 每一个Android应用程序都会分别运行在一个独立的Dalvik(或ART?)虚拟机中,而每个虚拟机在启动时会运行一个UI主线 ...

  8. DB 分库分表(5):一种支持自由规划无须数据迁移和修改路由代码的 Sharding 扩容方案

    作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一 ...

  9. elasticsearch 单实例安装启动

    elasticsearch 初次启动 下载 elasticsearch-6.3.2.tar.gz 创建目录 /usr/local/elasticsearch/ 解压 tar -zxf elastics ...

  10. 在mac上如何用safari调试ios手机的移动端页面

    第一步:打开iphone手机的开发者模式,流程是:[设置]->[Safari]->[高级]->开启[Web检查器] ,如图1.图2 图1 图2第二步:打开Mac上Safari的开发者 ...