我们前面讲的非阻塞仍然需要进程不断的轮询重试。能不能实现当数据可读了以后给程序一个通知呢?所以这里引入了一个IO多路复用模型,I/O多路复用的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作

【什么是fd:在linux中,内核把所有的外部设备都当成是一个文件来操作,对一个文件的读写会调用内核提供的系统命令,返回一个fd(文件描述符)。而对于一个socket的读写也会有相应的文件描述符,成为socketfd】

常见的IO多路复用方式有【select、poll、epoll】,都是Linux API提供的IO复用方式,那么接下来重点讲一下select、和epoll这两个模型

select:进程可以通过把一个或者多个fd传递给select系统调用,进程会阻塞在select操作上,这样select可以帮我们检测多个fd是否处于就绪状态。

这个模式有二个缺点

1. 由于他能够同时监听多个文件描述符,假如说有1000个,这个时候如果其中一个fd 处于就绪状态了,那么当前进程需要线性轮询所有的fd,也就是监听的fd越多,性能开销越大。

2. 同时,select在单个进程中能打开的fd是有限制的,默认是1024,对于那些需要支持单机上万的TCP连接来说确实有点少

epoll:linux还提供了epoll的系统调用,epoll是基于事件驱动方式来代替顺序扫描,因此性能相对来说更高,主要原理是,当被监听的fd中,有fd就绪时,会告知当前进程具体哪一个fd就绪,那么当前进程只需要去从指定的fd上读取数据即可

另外,epoll所能支持的fd上线是操作系统的最大文件句柄,这个数字要远远大于1024

【由于epoll能够通过事件告知应用进程哪个fd是可读的,所以我们也称这种IO为异步非阻塞IO,当然它是伪异步的,因为它还需要去把数据从内核同步复制到用户空间中,真正的异步非阻塞,应该是数据已经完全准备好了,我只需要从用户空间读就行】

引入了一个IO多路复用模型相关推荐

  1. NIO详解(三):IO多路复用模型之select、poll、epoll

    1. 前言 最近在研究基于Java的高性能异步非阻塞I/O框架Netty,因为最近做的RDMAChannel要用到其中的思想.Netty底层是通过大量的NIO实现的,通过分析底层NIO源码,发现NIO ...

  2. Linux :IO多路复用模型

    转载:http://blog.csdn.net/mr253727942/article/details/50827127 一.IO多路复用定义 IO多路复用允许应用在多个文件描述符上阻塞,并在某一个可 ...

  3. 基于epoll实现一个IO多路复用的回声服务器

    任务: 实现一个TCP server的回声服务器,功能是将客户端发送的消息原样返回,应用epoll处理事件循环实现IO多路复用.借此任务理解IO多路复用应用的开发模式. 参考资料: http://ma ...

  4. java httputil_Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型

    本文转载自:https://github.com/jasonGeng88/blog 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 http ...

  5. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_2整起~IO们那些事【包括五种IO模型:(BIO、NIO、IO多路复用、信号驱动、AIO);零拷贝、事件处理及并发等模型】

    PART0.前情提要: 通常用户进程的一个完整的IO分为两个阶段(IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者!):[操作系统和驱动程序运行在内核空间,应用程序运行在用户空间, ...

  6. IO模型、IO多路复用

    IO多路复用 基础概述 用户空间和内核空间 PIO与DMA 缓存IO和直接IO 缓存IO 优点 缺点 直接IO IO访问方式 磁盘IO 网络IO 磁盘IO和网络IO对比 Socket网络编程 客户端 ...

  7. IO 模型 IO 多路复用

    IO 模型 IO 多路复用 IO多路复用:模型(解决问题的方案) 同步:一个任务提交以后,等待任务执行结束,才能继续下一个任务 异步:不需要等待任务执行结束, 阻塞:IO阻塞,程序卡住了 非阻塞:不阻 ...

  8. 事件驱动模型与IO多路复用

    传统模式 传统的编程是线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结束 每一个代码块里是完成各种各 ...

  9. 聊一个不常见的面试题:为什么数据库连接池不采用 IO 多路复用?

    欢迎关注方志朋的博客,回复"666"获面试宝典 今天我们聊一个不常见的 Java 面试题:为什么数据库连接池不采用 IO 多路复用? 这是一个非常好的问题.IO多路复用被视为是非常 ...

最新文章

  1. centos系统为php安装memcached扩展步骤
  2. leetcode 349. Intersection of Two Arrays
  3. linux加密解密基础、PKI及SSL、创建私有CA
  4. Thread如何中断
  5. SAP Commerce Cloud Spartacus UI 读取 Component 元数据的 Action 设计
  6. 句法依存分析_复旦大学邱锡鹏教授:词法、句法分析研究进展综述
  7. git 怎么备份本地分支_git 入门教程之协同开发
  8. 朋友圈发原图或泄露位置信息?微信回应:系统自动压缩,不会泄露
  9. 苹果怒封Google、FB:私下购买用户隐私被制裁,数万员工受牵连
  10. 现在电脑的主流配置_主流级玩家 应该如何配置高性价比电脑
  11. linux系统用虚拟光驱装win7,用虚拟光驱加载win7或者xp iso镜像文件安装系统的图解步骤...
  12. CCProxy使用 记录
  13. win11更新后任务栏空白怎么办? win11更新后任务栏空白卡死的解决方法
  14. c语言 结束360进程,python修改注册表终止360进程实例
  15. 加州房价--决策树与随机森林
  16. .csv是什么文件格式,什么软件可以打开?xls与csv文件是什么区别?功能和作用上有什么不同?
  17. 7-10 黑洞数(20 分)
  18. 中国成语测试软件,中国汉字水平测试
  19. AOS | 推出无线充电发射器(TX)解决方案
  20. scons的介绍、使用和简单实例

热门文章

  1. JavaScript将成为浏览器战争的主战场
  2. jQuery 阻止冒泡和默认事件
  3. Zabbix JVM 安装
  4. HTTP 302报文
  5. 功能测试工具Selenium IDE
  6. 您的支持是作者写作最大的动力!
  7. 稳坐视频云行业第一,阿里云将用边缘计算开辟新赛道
  8. 如何更改Joomla中的默认语言
  9. 网络编程7_ multiprocessing类-管道.数据共享, 信号量,事件,进程池
  10. 迎合人工智能时代 码教授开设Python课程