高性能网络服务器--I/O复用 select poll epoll_wait之间的区别
一.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之间的区别的更多相关文章
- 高性能网络server--I/O复 select poll epoll_wait之间的差
一个.select 方式作为收集,最多只能监控1024描述叙事断裂的文件,内部使用位操作,相应的位置1或设置0,必须是可读.可写.三类除单独的事件,内部查询方法.将全部的套接字从内核到用户空间之间进行 ...
- select poll epoll之间的区别
1.select poll每次循环调用时都需要将文件描述符和事件拷贝到内核空间,epoll只需要拷贝一次: (这种情况在对于描述符数量不大的情况下还可以,但是当描述符的数量达到十几万甚至上百万的时候, ...
- Linux中select poll和epoll的区别
在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select.poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加 ...
- [转载] select, poll和epoll的区别
源地址:http://sheepxxyz.blog.163.com/blog/static/61116213201022003513530/ 随着2.6内核对epoll的完全支持,网络上很多的文章和示 ...
- 云服务器、VPS、虚拟主机三者之间的区别?
更多精彩内容欢迎访问我的个人博客皮皮家园:https://www.zh66.club期待您的光临哦!我是皮皮猪,感谢各位光临,能为您排忧解难小站深感荣幸!祝您生活愉快! 什么是虚拟主机? 同云主机不一 ...
- I/O复用中的 select poll 和 epoll
I/O复用中的 select poll 和 epoll: 这里有一些不错的资料: I/O多路复用技术之select模型: http://blog.csdn.net/nk_test/article/de ...
- I/O多路复用之select,poll,epoll简介
一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...
- 多路IO复用模型--select, poll, epoll
select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用se ...
- Linux I/O复用中select poll epoll模型的介绍及其优缺点的比較
关于I/O多路复用: I/O多路复用(又被称为"事件驱动"),首先要理解的是.操作系统为你提供了一个功能.当你的某个socket可读或者可写的时候.它能够给你一个通知.这样当配合非 ...
随机推荐
- AOJ.849 分数 (暴力)
AOJ.849 分数 (暴力) 题意分析 每次枚举分子,然后根据给出的分数值,推算出来分母,然后取分母上下几个数进行进一步计算,看看哪个更接近. 一开始想着直接枚举分子和分母,复杂度爆炸... 代码总 ...
- group by多字段分组
在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据.比如有一个学生选课表,表结构如下: Table: Subject_Selection S ...
- JQuery学习二(获取元素控件并控制)
$(’#id‘).+function; 例如: 1 <head> 2 <title>JQuery</title> 3 <script src="js ...
- crontab 定期拉取代码
* * * * * cd /home/wwwroot/default/lion/ && /usr/bin/git pull origin 5hao >> /tmp/git. ...
- arm架构与体系结构
1.cpu与soc 内核版本号与soc版本号由arm公司确定. 芯片型号由各半导体公司确定. soc包括cpu与一些基本内设.(一般提到CPU都指的是soc,实际上cpu只是soc的一部分). RIS ...
- jquery动画切换引擎插件 Velocity.js 学习02
案例实践: 第一页会以动画形式进入页面: 点击进入按钮时,第一页以动画消失,第二页以动画形式进入,同时四张图片也定义从小到大的动画形式: 第二页关闭按钮点击时,先是四张图片以缩小动画消失,然后第二页以 ...
- Spring @Async开启异步任务
1. 开启异步 @SpringBootApplication @EnableAsync //开启异步任务 public class Application { @Bean(name="pro ...
- 「模板」 FHQ_Treap 区间翻转
「模板」 FHQ_Treap 区间翻转 没有旋转的 Treap 实现区间操作的功能,很好理解,也很好写,只是速度不算太快. 对于要翻转的区间,把整棵 Treap(存有区间 \([1,n]\) 的信息) ...
- activemq依赖包获取
现在项目中使用的是activemq-all.jar的jar,17M多,里面集成了日志.spring等相关的包.但项目启动时发现系统使用的是activemq包中的日志实现,没有用本项目的日志包.只能将整 ...
- bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 ——中位数排序
Description 经过多年的积蓄,农夫JOHN决定造一个新的牛舍.他知道所有N(2 <= N <= 10,000)头牛的吃草位置,所以他想把牛舍造在最方便的地方. 每一头牛吃草的位置 ...