相同点: 都是IO多路转接,都是一个线程能同一时间等待一堆描述符

      不同点:

        1.select接口使用不方便,每次调用完select都需要重新设置fd_set,因为输入输出未分离,返回的fd_set会将未就绪的fd清空;

          epoll接口使用方便,采用事件结构方式监控,简化了对多个监控结合的操作 , 输入输出也进行了分离,不需要再重新设置fd_set;

#include<sys/select.h> 

//select执行过程:
//在fd_set中添加要监控的fd-->调用select等待-->fd_set返回已就绪fd,未就绪的被清空 int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
//nfds为最大fd_set+1,减少遍历区间
//fd_set是存储要监控fd的位图,大小是系统设定的,系统提供了一套操作fd_set的增删改查的接口
//timeout == NULL阻塞 >=0等待时间
 //epoll执行过程:
//epoll_careate在内核创建eventpoll结构体,其中包含红黑树与双向链表--->
//为需要监控的fd创建一个事件结构并用epoll_ctl添加到红黑树中-->
//调用epoll_wait等待,当有fd就绪操作系统就会调用对应的回调函数将就绪的事件结构添加到双向链表中(红黑树中的就绪fd的事件类型会清空,下次遍历需要重新设置事件类型)-->
//epoll_wait每隔一段时间判断双向链表是否为空,如果不为空就将就绪的事件结构映射到用户传
//入的事件数组中 -->
//函数返回后,用户可以直接对返回的事件数组遍历操作 //创建eventpoll结构体
int epoll_create(int size); //添加监控事件
int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event); //等待就绪事件
int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout);

        2.select每次监控都需要在用户态与内核态之间频繁拷贝数据; epoll只需要将监控的事件向内核拷贝一次,不需要频繁拷贝。

        3.select监控的fd越多效率越低,因为内核要在内部遍历位图;epoll采用事件回调方式监控(谁就绪回调谁),因此效率不会因为fd增多而降低。

        4.select没有直接返回就绪的文件描述符,需要用户对集合进行遍历判断;epoll直接返回的就绪事件结构,用户可以直接操作,不需要空遍历;

        5.select监控的fd有限,默认是1024个;epoll监控的fd没有上限。

        6.select可以跨平台;epoll不可以跨平台。

        事件结构(epoll_event):

     \

        这里提一下poll:

        相比于select: 1.接口使用更方便,采用事件结构数组进行所有事件监控,简化了三种集合操作

               2.监控的fd没有上限

        除了这两个优点,缺点和select一样。

Select与Epoll的区别的更多相关文章

  1. select 和epoll模型区别

    1.select 和epoll模型区别 1.1.网络IO模型概述 通常来说,网络IO可以抽象成用户态和内核态之间的数据交换.一次网络数据读取操作(read),可以拆分成两个步骤:1)网卡驱动等待数据准 ...

  2. 多路复用select和epoll的区别(转)

    先说下本文框架,先是问题引出,然后概括两个机制的区别和联系,最后介绍每个接口的用法 一.问题引出 联系区别 问题的引出,当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一 ...

  3. select.poll,epoll的区别与应用

    先讲讲同步I/O的五大模型 阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型 而select/poll/epoll属于I/O复用模型 select函数 该函数 ...

  4. UNIX环境高级编程——select和epoll的区别

    select和epoll都用于监听套接口描述字上是否有事件发生,实现I/O复用 select(轮询) #include <sys/select.h> #include <sys/ti ...

  5. bio,nio,aio的区别 select,poll,epoll的区别

    先了解一些基本概念,什么是socket?什么是I/O操作 unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切 ...

  6. python select poll epoll的区别

    select 优点:为最早的异步io处理模块,他可以再linux上和windows上使用,跨平台兼容性好,而poll和epoll都不能在windows系统环境中使用. 缺点:select的机制决定了他 ...

  7. 最快理解 - IO多路复用:select / poll / epoll 的区别.

    目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...

  8. select与epoll分析

    关于select与epoll的区别,网上的文章已是一大堆.不过别人的终究是别人的,总得自己去理解才更深刻.于是在阅读了大量的文章后,再装模作样的看下源码,写下了自己的一些理解. 在开始之前,要明白li ...

  9. 转--select/poll/epoll到底是什么一回事

    面试题:说说select/poll/epoll的区别. 这是面试后台开发时的高频面试题,属于网络编程和IO那一块的知识.Android里面的Handler消息处理机制的底层实现就用到了epoll. 为 ...

随机推荐

  1. maven install

    1. install maven under ubuntu apt install maven 2 speed up package download vim ~/.m2/settings.xml & ...

  2. [Gradle] 发布 library 到本地 maven 仓库

    Java Library // publish_local_java.gradle apply plugin: 'maven-publish' publishing { publications { ...

  3. allure-pytest 测试报告分享给大家

    allure-pytest生成测试报告,经过实践得出如下经验,参考了很多大神的博客一并附上 1.安装allure-pytest pip install allure-pytest 2.执行命令生成js ...

  4. QML学习(一)——<简要概念知识点>

    转载:https://www.cnblogs.com/dengyg0710/p/10644936.html 1.一个 QML 文档有且只有一个根元素. 2.QML 元素名后所有内容使用 {} 包围起来 ...

  5. Java Spring 使用 Redis

    在 Java 中使用 Redis 需要使用 Jedis.jar github 页面 https://github.com/xetorthio/jedis javadocs http://xetorth ...

  6. TreeMap用法总结

    TreeMap用法总结 public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap&l ...

  7. Selenium对浏览器支持的版本【2019/10/25更新】

    最新的selenium与几种常用浏览器的版本兼容情况:(以下驱动,点击直接跳转官方下载地址) 尽量选择最新版本-1的浏览器,比如最新的是60,那就使用59.(建议Chrome更新至72+版本.Fire ...

  8. webpack构建篇

    WEBPack 构建  --  基于webpack4 1.环境准备 NodeJs: 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.其使用了一个事件驱动.非阻塞式 I/O 的模 ...

  9. var let const区别

      var let const 可否同一作用域下声明同名变量 可以 不可以 不可以 声明的变量是否会挂载到window上 会 不会 不会 声明变量是否存在变量提升 存在 不存在(变量必须声明之后才能使 ...

  10. http使用formData方式传输文件请求

    转载请注明出处: 项目中有遇到http使用formData请求传输文件,在此记录一下 1.依赖jar包: <dependency> <groupId>org.apache.ht ...