select,poll,epoll区别:

select优点

1)select()的可移植性更好,在某些Unix系统上不支持poll()

2)select() 对于超时值提供了更好的精度:微秒,而poll是毫秒。

select缺点

1) 单个进程可监视的fd数量被限制。

2) 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。

3) 对fd进行扫描时是线性扫描。fd剧增后,IO效率较低,因为每次调用都对fd进行线性扫描遍历,所以随着fd的增加会造成遍历速度慢的性能问题

4)select() 函数的超时参数在返回时也是未定义的,考虑到可移植性,每次在超时之后在下一次进入到select之前都需要重新设置超时参数。

poll

poll与select不同,通过一个pollfd数组向内核传递需要关注的事件,故没有描述符个数的限制, 

pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,故pollfd数组只需要被初始化一次。

poll的实现机制与select类似,其对应内核中的sys_poll,只不过poll向内核传递pollfd数组,然后对pollfd中的每个描述符进行poll,相比处理fdset来说,poll效率更高。 

poll返回后,需要对pollfd中的每个元素检查其revents值,来得指事件是否发生。

poll优点

1)poll() 不要求开发者计算最大文件描述符加一的大小。

2)poll() 在应付大数目的文件描述符的时候相比于select速度更快

3)它没有最大连接数的限制,原因是它是基于链表来存储的。

poll缺点

1)大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。

2)与select一样,poll返回后,需要轮询pollfd来获取就绪的描述符

epoll

epoll是Linux下多路复用IO接口select/poll的增强版本。

  它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它不会复用文件描述符集合来传递结果而迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合。

  另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。

epoll除了提供select/poll 那种IO事件的电平触发(Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

底层实现

epoll在底层实现了自己的高速缓存区,并且建立了一个红黑树用于存放socket,另外维护了一个链表用来存放准备就绪的事件。

工作过程:

  执行epoll_ create时,创建了红黑树和就绪链表,执行epoll_ ctl时,如果增加socket句柄,则检查在红黑树中是否存在,存在立即返回,不存在则添加到树干上,然后向内核注册回调函数,用于当中断事件来临时向准备就绪链表中插入数据。执行epoll_wait时立刻返回准备就绪链表里的数据即可。

epoll优点

1)支持一个进程打开大数目的socket描述符(FD)

2)IO效率不随FD数目增加而线性下降

3)使用mmap加速内核与用户空间的消息传递。

select,poll,epoll区别面试常问相关推荐

  1. select,poll,epoll区别

    2019独角兽企业重金招聘Python工程师标准>>> select的本质是采用32个整数的32位,即32*32= 1024来标识,fd值为1-1024.当fd的值超过1024限制时 ...

  2. select,poll,epoll区别。

    1,select的用法 fd_set fd_in, fd_out; struct timeval tv;// Reset the sets FD_ZERO( &fd_in ); FD_ZERO ...

  3. JAVA中堆和栈的区别[面试常问点一]

    概念 堆内存:在java虚拟jvm中堆内存主要是存储数组和对象(当然数组也是对象),只要是通过new关键字创建的对象都是在堆中,而堆中存放的就是对象的实体,实体用来封装数据的,封装对象的属性,所以堆内 ...

  4. IO模型(select, poll, epoll的区别和原理)

    参考<unix网络编程> 参考http://blog.csdn.net/blueboy2000/article/details/4485874 参考http://blog.csdn.net ...

  5. select/poll/epoll 与 /dev/poll

    select/poll 这两种实际上差不多,都是把一组fd传送给kernal,然后返回一个就绪fd的数量,然后开始遍历所有的fd,找到那些可读或者可写的. 区别在于,poll相比select来说,传送 ...

  6. C++面试 select poll epoll之间的区别

    目录 摘要 场景描述 Select poll epoll 总结 摘要 先明确几个概念: 面试官问:给我讲讲什么事同步阻塞.异步阻塞.同步非阻塞.异步非阻塞. 我:????? 同步和异步的概念 同步是指 ...

  7. IO多路复用select,poll epoll以及区别

    看这个一次读懂 Select.Poll.Epoll IO复用技术 文章来简单理解下,如果不是很明白的话,可以参考下面转的知乎上面白话文列子 作者:Leslie 链接:https://www.zhihu ...

  8. GET 和 POST 的区别(重要,面试常问)

    GET 和 POST 的区别(重要,面试常问) 1.GET 在浏览器回退时是无害的,而 POST 会再次提交请求. (get:不会再次发送请求:post:浏览器会继续向URI发送请求) 2.GET 产 ...

  9. 【C/C++服务器开发】文件,文件描述符,I/O多路复用,select / poll / epoll 详解

    文章目录 一.前言 1.文件的概念 2.文件描述符和文件指针 文件描述符 文件描述符和文件指针的区别 文件描述符太多了怎么办 二.I/O多路复用 1.I/O多路复用的由来 不要打电话给我,有需要我会打 ...

最新文章

  1. 一个初级程序员学习新技术的策略
  2. Py之textrank4zh:textrank4zh的简介、安装、使用方法之详细攻略
  3. DeepLearning:环境配置(cuda+cudnn)
  4. 华为鸿蒙系统推出的背景美国,鸿蒙系统+麒麟芯片,流畅度相当ios,手机性能不输苹果芯片...
  5. Js 模拟鼠标点击事件
  6. TiDB数据库备份恢复与数据迁移
  7. InfoQ观点:Java EE的未来
  8. 【白皮书分享】2020中国硬科技创新白皮书.pdf(附下载链接)
  9. Nginx使用Expires增加浏览器缓存加速
  10. C# string 保留数字英文字母
  11. c语言程序设计问号是什么意思,在C语言中,该语句在z=xy?x:y中是什么意思,问号表示什么意思...
  12. 深入理解多线程(四)—— Moniter的实现原理
  13. 有服务器还需要网站空间吗,有服务器还需要空间吗
  14. Redis——过期时间/过期回收策略
  15. 介绍一个成功的 Git 分支模型——终于知道如何管理git分支了(好文章!!强烈建议看本文的英文原文)
  16. 用PAM自定义身份验证
  17. 计算机应用基础 周凌,计算机基础毕业论文范文
  18. linux重启was控制台,was控制台打不开了 详细
  19. Infiniband
  20. umat到vumat转化程序_umatvumat

热门文章

  1. 【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)
  2. python3.6+RF连接mysql
  3. 子串在主机中出现的位置indexOf()--简单
  4. lz0-007 读书笔记09
  5. 汇编实验1遇到的问题及解决之记录(以及尚未解决的疑惑,大神可以帮帮看看吗)
  6. 单位四元数(unit quaternion)
  7. C/C++编程的一些技巧
  8. Java基础学习总结(10)——static关键字
  9. 判断Oracle中某个字段是否含有数字
  10. vue-cli项目打包多个与static文件同级的静态资源目录(copy-webpack-plugin插件的使用)...