一.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. UVA.11300 Spreading the Wealth (思维题 中位数模型)

    UVA.11300 Spreading the Wealth (思维题) 题意分析 现给出n个人,每个人手中有a[i]个数的金币,每个人能给其左右相邻的人金币,现在要求你安排传递金币的方案,使得每个人 ...

  2. bzoj1042: [HAOI2008]硬币购物(DP+容斥)

    1600+人过的题排#32还不错嘿嘿 浴谷夏令营讲过的题,居然1A了 预处理出f[i]表示购买价值为i的东西的方案数 然后每次询问进行一次容斥,答案为总方案数-第一种硬币超限方案-第二种超限方案-第三 ...

  3. pandas模块(数据分析)------dataframe

    DataFrame DataFrame是一个表格型的数据结构,含有一组有序的列,是一个二维结构. DataFrame可以被看做是由Series组成的字典,并且共用一个索引. 一.生成方式 import ...

  4. JS实现的随机乱撞的彩色圆球特效代码

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) A map B贪心 C思路前缀

    A. A Serial Killer time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. bzoj 1100 [POI2007]对称轴osi manacher

    [POI2007]对称轴osi Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 771  Solved: 307[Submit][Status][Dis ...

  7. 用HTML5 File API 实现截图粘贴上传、拖拽上传

    <!DOCTYPE html><html><head> <title>test chrome paste image</title> < ...

  8. svn update解决冲突

    (p) postpone 暂时推后处理,我可能要和那个和我冲突的家伙商量一番 (df) diff-full 把所有的修改列出来,比比看 (e) edit 直接编辑冲突的文件 (mc) mine-con ...

  9. jedis,spring-redis-data 整合使用,版本问题异常

    jedis,spring-redis-data 整合使用,版本不匹配的时候经常会报一些异常,例如1: java.lang.NoClassDefFoundError: org/springframewo ...

  10. PowerDesigner逆向工程

    再用PD建表完成后导成SQL脚本然后在SQL Server中运行后生成数据库后,就想到,可不可以将直接将数据库的内容生成PD文档?经过上网查,当然可以的. 要将SQL Server中的数据库导入到PD ...