一.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. PE格式示意图

  2. nodejs创建多层目录

    1. fs.mkdir不能一次创建多层目录,必须先创建上层目录,再创建下层目录 //同步 fs.mkdirSync("./tmp/"); fs.mkdirSync("./ ...

  3. 【简单算法】17.字符串转整数(atoi)

    题目: 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为 ...

  4. python邮件服务

    文件形式的邮件 [python] view plaincopy #!/usr/bin/env python3 #coding: utf-8 import smtplib from email.mime ...

  5. vue中使用 contenteditable 制作输入框并使用v-model做双向绑定

    <template> <div class="div-input" :class="value.length > 0 ? 'placeholder ...

  6. 使用httpclient post请求中文乱码解决办法

    使用httpclient post请求中文乱码解决办法   在使用httpclient发送post请求的时候,接收端中文乱码问题解决. 正文: 我们都知道,一般情况下使用post请求是不会出现中文乱码 ...

  7. Spring框架介绍和原理

    SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...

  8. mongo在centos与windows上部署与配置,及远程连接mongo与数据用户和角色分配

    1.下载mongodb社区版: windows 安装包安装: https://www.mongodb.com/download-center#community(mongo下载中心) 配置环境变量 控 ...

  9. mysql 在查询结果中进行二次查询

    第一次查询:查询身份证编号和出现次数 select cardid,count(cardid) as total from p_person_info group by cardid 在第一次查询结果进 ...

  10. u3d局域网游戏网络(c# socket select 模型)

    之前写了一篇. 发完之后第二天实际应用到游戏之后还是发现了一些小毛病. 比如网络模块有重复使用(多对象)的情况.所以将静态类该成了普通类. 比如安卓下会有些异常出现导致游戏逻辑不正常.所以网络相关的函 ...