I/O多路复用是用于提升效率,单个进程可以同时监听多个网络连接IO。

举例:通过一种机制,可以监视多个文件描述符,一旦描述符就绪(读就绪和写就绪),能通知程序进行相应的读写操作,I/O多路复用避免阻塞在io上,原本为多进程或多线程来接收多个连接的消息变为单进程或单线程保存多个socket的状态后轮询处理

select是通过系统调用来监视一组由多个文件描述符组成的数组,通过调用select()返回结果,数组中就绪的文件描述符会被内核标记出来,然后进程就可以获得这些文件描述符,然后进行相应的读写操作。

每次调用select,都需要把fd集合由用户态拷贝到内核态,在fd多的时候开销会很大,每次select都是线性遍历整个列表,当fd很大的时候,遍历的开销也很大

poll本质上与select基本相同,只不过监控的最大连接数上相较于select没有了限制,因为poll使用的数据结构是链表,而select使用的是数组,数组是要初始化长度大小的,且不能改变

Epoll:解决select和poll本身的缺陷

数组长度限制解决方案:fd上限是最大可以打开文件的数目,具体数目可以查看/proc/sys/fs/file-max。一般会和内存有关

需要每次轮询将数组全部拷贝到内核态解决方案:每次注册事件的时候,会把fd拷贝到内核态,而不是每次poll的时候拷贝,这样就保证每个fd只需要拷贝一次。

每次遍历都需要列表线性遍历解决方案:不再采用遍历的方案,给每个fd指定一个回调函数,fd就绪时,调用回调函数,这个回调函数会把fd加入到就绪的fd列表中,所以epoll只需要遍历就绪的list即可    

最新文章

  1. 使用nwjs开发桌面应用之Hello,World!
  2. 配合 APP 调用 JS 的一次尝试
  3. Php 笔记
  4. asp.net json 与xml 的基础事例
  5. 特殊的Josn格式
  6. WPF ListView DoubleClick
  7. sqlserver 存储过程 以及统计整个数据库数据
  8. Freebie: Material Design UI Kit
  9. VC6.0下string不能用pusk_back,可用+=代替
  10. [Leveldb源码剖析疑问]-block_builder.cc之Add函数
  11. 分析器错误消息: 未能加载文件或程序集“System.WEB.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。
  12. Archlinux 安装配置指导 2015-05-24
  13. 运行ORB-SLAM笔记_使用篇(二)
  14. Exchange无法发送邮件 未找到匹配的连接器来路由外部收件人解决办法
  15. 【第二十一篇】手C# MVC 微信授权登录 OAuth2.0授权登录
  16. JEECG 新版在线文档WIKI正式发布
  17. 升级:DNAtools for Excel工具箱,2.x英文版- VBA代码破解工具
  18. python集合使用范例的代码
  19. 测者的测试技术笔记:揭开java method的一个秘密--巨型函数
  20. 数据库学习二三事儿(不打代码永远get不到的东西)

热门文章

  1. 2017.7.1 ftp文件服务器安装与配置(已验证可使用)
  2. NeatBean下ssh 私钥格式问题
  3. Web项目中用mybatis配置多个数据库
  4. 使用Junit4对web项目进行测试(一)Junit初配置
  5. 【高级功能】使用 Ajax
  6. Android中IntentService详解
  7. Laravel的本地化
  8. 算法练习--ABCD*E=DCBA
  9. httpModules 与 httpHandlers
  10. WebService学习小结