一.select

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

二.poll

  poll采用的是轮训的方式对给定大小的文件描述符进行轮询,并且有pollfd结构体,事件的返回时存储在结构体中的revents中,与select不相同的是内核对fd_set的参数直接进行修改,所以在每次进行调用时,需要对三个参数进行重新定义;而poll是在pollfd结构体中的revents钟存储返回的结果,每次调用时,不需要对其重新定义。

三.epoll_wait

  epoll_wait是将内核关心的文件描述符,放在内核的事件表中,无需象select和epoll那样,每次从内核空间往用户空间调用,epoll_wait如果监测到事件就将所有就绪的事件传送到第二个struct epoll_event 结构体中,这个结构体适用于输出epoll_wait检测到内核中监测到的就绪文件描述符,这就极大地提高了应用程序索引就绪文件描述符的效率。不需要从内核传送到用户空间,内部相当于红黑树和链表,红黑树中存储的是内核关心的文件描述符,而在epoll_wait()监测到就绪事件时,就会触发回调,这个描述符加入链表中,每次调用epoll_wait返回链表是从内核返回给用户空间的,每次从内核传送到用户空间的描述符并不是很多。select和poll的时间复杂度是O(n),而epoll的时间复杂度是O(1).

  epoll_wait存在两种触发,水平触发和边缘触发。

  水平触发和边缘触发的区别是当一段数据没有读完,水平触发会触发,而边缘触发不会响应,只有当事件改变时,边缘触发才会触发。

区别:

  select的参数类型是fd_set没有将文件描述符和事件绑定,仅仅是一个文件描述符的集合,并且只能处理可读,可写,异常,不能处理更多类型的数据。并且fd_set的修改是在线修改,所以在下次调用select时,要对三个参数进行重置。pollfd参数是pollfd结构体,它是统一管理,并且是在结构体中的revents中存储修改,所以在下次调用时,不需要对pollfd结构体进行重置。由于每次select和poll调用逗返回整个用户注册的事件集合,所以应用程序索引就绪文件描述符的时间复杂度就是O(n),而epoll是在内核中维护一个事件表,采用一个独立的系统调用epoll_ctl来控制往其中添加,删除和修改时间,这样每次epol_wait调用都是直接从内核事件表中取得用户注册的时间,而无需反复的从用户空间读入一些事件,epoll_wait系统调用的event参数仅用来返回就绪事件,这使得应用程序索引就绪文件描述符的时间复杂度为O(1).

  从原理上,select和poll采用的都是轮询的访问方式,每次调用都要访问整个文件描述符集,并将其中准备好的文件描述符返回给用户程序,因此时间复杂度是O(n),epoll_wait采用回调的方式,内核检测到就绪文件描述符时,将触发回调函数,回调函数将文件描述符上对应的事件插入内核就绪队列,内核最后在适合的时机将就绪队列中的内容拷贝到用户空间,因此epoll_wait无需轮询整个文件描述符集合来检测那些事件已经就绪,其算法事件复杂度是O(1).

高性能网络服务器--I/O复用 select poll epoll_wait之间的区别的更多相关文章

  1. 高性能网络server--I/O复 select poll epoll_wait之间的差

    一个.select 方式作为收集,最多只能监控1024描述叙事断裂的文件,内部使用位操作,相应的位置1或设置0,必须是可读.可写.三类除单独的事件,内部查询方法.将全部的套接字从内核到用户空间之间进行 ...

  2. select poll epoll之间的区别

    1.select poll每次循环调用时都需要将文件描述符和事件拷贝到内核空间,epoll只需要拷贝一次: (这种情况在对于描述符数量不大的情况下还可以,但是当描述符的数量达到十几万甚至上百万的时候, ...

  3. Linux中select poll和epoll的区别

    在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select.poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加 ...

  4. [转载] select, poll和epoll的区别

    源地址:http://sheepxxyz.blog.163.com/blog/static/61116213201022003513530/ 随着2.6内核对epoll的完全支持,网络上很多的文章和示 ...

  5. 云服务器、VPS、虚拟主机三者之间的区别?

    更多精彩内容欢迎访问我的个人博客皮皮家园:https://www.zh66.club期待您的光临哦!我是皮皮猪,感谢各位光临,能为您排忧解难小站深感荣幸!祝您生活愉快! 什么是虚拟主机? 同云主机不一 ...

  6. I/O复用中的 select poll 和 epoll

    I/O复用中的 select poll 和 epoll: 这里有一些不错的资料: I/O多路复用技术之select模型: http://blog.csdn.net/nk_test/article/de ...

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

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

  8. 多路IO复用模型--select, poll, epoll

    select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用se ...

  9. Linux I/O复用中select poll epoll模型的介绍及其优缺点的比較

    关于I/O多路复用: I/O多路复用(又被称为"事件驱动"),首先要理解的是.操作系统为你提供了一个功能.当你的某个socket可读或者可写的时候.它能够给你一个通知.这样当配合非 ...

随机推荐

  1. BZOJ1861:[ZJOI2006]书架——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1861 (题面复制于洛谷) 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上 ...

  2. 20165218 2017-2018-1《Java程序设计》第二周学习总结

    20165218 2017-2018-1 <Java程序设计>第2周学习总结 教材学习内容总结 Ch2 基本数据类型与数组 Unicode字符集之中所有都叫做"字母", ...

  3. [APIO2017]商旅

    link 这题卡我精度,调了一晚上才调对,因为没有想到图还可以不连通 其实可以预处理出好多东西,距离($dis(u,v)$),买卖物品(从$u$到$v$买卖物品的最大利润,例($max{S_{u,i} ...

  4. 破解wingide编辑器

    先到官网下载最新版的wingide(我下载的是5.1.11-1),然后安装,打开,出现下面的界面时选第三个,然后输入“ENX27-HWM6G-XYVFA-165PG”,如下图所示: 接下来你软件会给你 ...

  5. Wand FZU - 2282 全错位重排

    N wizards are attending a meeting. Everyone has his own magic wand. N magic wands was put in a line, ...

  6. udhcpd源码分析3--IP租赁管理

    1:重要的结构体 全局链表的成员struct dhcpOfferedAddr *leases 记录了当前租赁出去的IP信息 /* leases.h */ struct dhcpOfferedAddr ...

  7. hdu4085 Peach Blossom Spring

    Peach Blossom Spring http://acm.hdu.edu.cn/showproblem.php?pid=4085 Time Limit: 10000/5000 MS (Java/ ...

  8. 2015/9/3 Python密码输入屏蔽字符

    在使用Python的过程中,想输入账号和密码,但是密码会随着输入显示在屏幕上,为了解决这个问题需要用到msvcrt模块 这里是使用代码 import msvcrt, sys def pwd_input ...

  9. Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  10. 【51NOD】消灭兔子

    [算法]贪心 #include<cstdio> #include<algorithm> #include<cstring> #include<queue> ...