引入了一个IO多路复用模型
我们前面讲的非阻塞仍然需要进程不断的轮询重试。能不能实现当数据可读了以后给程序一个通知呢?所以这里引入了一个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多路复用模型相关推荐
- NIO详解(三):IO多路复用模型之select、poll、epoll
1. 前言 最近在研究基于Java的高性能异步非阻塞I/O框架Netty,因为最近做的RDMAChannel要用到其中的思想.Netty底层是通过大量的NIO实现的,通过分析底层NIO源码,发现NIO ...
- Linux :IO多路复用模型
转载:http://blog.csdn.net/mr253727942/article/details/50827127 一.IO多路复用定义 IO多路复用允许应用在多个文件描述符上阻塞,并在某一个可 ...
- 基于epoll实现一个IO多路复用的回声服务器
任务: 实现一个TCP server的回声服务器,功能是将客户端发送的消息原样返回,应用epoll处理事件循环实现IO多路复用.借此任务理解IO多路复用应用的开发模式. 参考资料: http://ma ...
- java httputil_Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型
本文转载自:https://github.com/jasonGeng88/blog 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 http ...
- java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_2整起~IO们那些事【包括五种IO模型:(BIO、NIO、IO多路复用、信号驱动、AIO);零拷贝、事件处理及并发等模型】
PART0.前情提要: 通常用户进程的一个完整的IO分为两个阶段(IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者!):[操作系统和驱动程序运行在内核空间,应用程序运行在用户空间, ...
- IO模型、IO多路复用
IO多路复用 基础概述 用户空间和内核空间 PIO与DMA 缓存IO和直接IO 缓存IO 优点 缺点 直接IO IO访问方式 磁盘IO 网络IO 磁盘IO和网络IO对比 Socket网络编程 客户端 ...
- IO 模型 IO 多路复用
IO 模型 IO 多路复用 IO多路复用:模型(解决问题的方案) 同步:一个任务提交以后,等待任务执行结束,才能继续下一个任务 异步:不需要等待任务执行结束, 阻塞:IO阻塞,程序卡住了 非阻塞:不阻 ...
- 事件驱动模型与IO多路复用
传统模式 传统的编程是线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结束 每一个代码块里是完成各种各 ...
- 聊一个不常见的面试题:为什么数据库连接池不采用 IO 多路复用?
欢迎关注方志朋的博客,回复"666"获面试宝典 今天我们聊一个不常见的 Java 面试题:为什么数据库连接池不采用 IO 多路复用? 这是一个非常好的问题.IO多路复用被视为是非常 ...
最新文章
- centos系统为php安装memcached扩展步骤
- leetcode 349. Intersection of Two Arrays
- linux加密解密基础、PKI及SSL、创建私有CA
- Thread如何中断
- SAP Commerce Cloud Spartacus UI 读取 Component 元数据的 Action 设计
- 句法依存分析_复旦大学邱锡鹏教授:词法、句法分析研究进展综述
- git 怎么备份本地分支_git 入门教程之协同开发
- 朋友圈发原图或泄露位置信息?微信回应:系统自动压缩,不会泄露
- 苹果怒封Google、FB:私下购买用户隐私被制裁,数万员工受牵连
- 现在电脑的主流配置_主流级玩家 应该如何配置高性价比电脑
- linux系统用虚拟光驱装win7,用虚拟光驱加载win7或者xp iso镜像文件安装系统的图解步骤...
- CCProxy使用 记录
- win11更新后任务栏空白怎么办? win11更新后任务栏空白卡死的解决方法
- c语言 结束360进程,python修改注册表终止360进程实例
- 加州房价--决策树与随机森林
- .csv是什么文件格式,什么软件可以打开?xls与csv文件是什么区别?功能和作用上有什么不同?
- 7-10 黑洞数(20 分)
- 中国成语测试软件,中国汉字水平测试
- AOS | 推出无线充电发射器(TX)解决方案
- scons的介绍、使用和简单实例