【IO】Java 中的 BIO、NIO、AIO
在上一篇我们讲了 Linxu 下的五种 IO 模型,操作系统的 IO 模型是底层基石,Java对于IO的操作其实就是进一步的封装。适配一些系统调用方法,让我们玩地更得劲。
1.同步(Synchronization) & 异步(Asynchronous)
同步和异步是指应用程序和操作系统处理 IO 事件所采用的方式
- 同步:应用程序要直接参与 IO 读写的操作。
- 同步方式在处理 IO 事件的时候,必须阻塞在某个方法上面等待我们的 IO 事件完成(阻塞IO 事件或者通过轮询IO事件的方式)。
- 这个时候我们就完全不能做自己的事情。让读写方法加入到线程里面,然后阻塞线程来实现,对线程的性能开销比较大。
- 异步:所有的 IO 读写交给操作系统去处理,应用程序只需要等待通知(比如通过回调函数)。
- 对于异步来说,所有的 IO 读写都交给了操作系统。
- 这个时候,我们可以去做其他的事情,并不需要去完成真正的 IO 操作,当操作完成 IO 后,会给我们的应用程序一个通知。
=> 异步与同步是相对于时间而言,同步在一个时刻只能做一件事,异步在一个时刻可以做多件事
2.阻塞(Block) & 非阻塞(Non-Block)
阻塞和非阻塞是进程在访问数据时,应对数据没有准备就绪而无法继续工作的处理方式
- 阻塞:工作线程往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。
- 非阻塞:如果数据没有准备好,工作线程则直接返回,不会等待。如果数据已经准备好,也直接返回。
=> 阻塞与非阻塞是相对于状态而言,阻塞在任务进行不下去时存在等待状态,非阻塞不存在等待状态
3.BIO、NIO、AIO
那我们对于 IO 所讲的同步阻塞,同步不阻塞,异步阻塞,异步不阻塞是什么呢?首先强调一点,异步阻塞是个伪命题,根本不存在。
1)BIO:同步阻塞 IO;采用的是阻塞 IO 模型
- 同步:同一时刻只能读写一个文件。
- 阻塞:若调用 read()/write() 读写时没有数据,线程则进入阻塞状态。
2)NIO:同步不阻塞IO;这里一定要注意 NIO 采用的并不是非阻塞 IO 模型,而是 IO 多路复用模型,是基于 Reactor 设计模式的
- 同步:同一时刻只能读写读写一个文件。
- 不阻塞:若调用 read()/write() 读写时没有数据,直接返回 0,线程不会进入阻塞状态。
当然,对于返回 0 的情况你可以自己通过 while(true) 进行忙等。但是,NIO 的设计之初不是采用非阻塞 IO 模型,即不是为了非阻塞而设计它。
NIO 实际上使用的是 IO 多路复用模型,也就是说 NIO 要实现的最重要的目的之一就是在 Socket 编程中,通过一个线程管理多个连接。
=> BIO(TPR模式):一个连接对应一个线程,
- –> TRP模型的根本原因是线程会出现阻塞
- –> 阻塞的原因是不确定性,即该连接要占用该线程多久。因为在进行I/O操作的时候,没有办法知道到底能不能写、能不能读,即使通过各种估算,算出来操作系统没有能力进行读写,也没法在socket.read()和socket.write()函数中返回,这两个函数无法进行有效的中断,只能”傻等”客户端的指令(注:实际的读写时间很短,可以忽略不计)
- –> 为了更充分的利用 CPU,只好多开线程另起炉灶
==> 那可不可以使用事件驱动?即在事件确定的前提下,采用一种单线程的轮询机制?
- –> 什么事件?四种事件:ACCEPT(服务端),CONNECT(客户端),READ,WRITE
- –> 事件怎么读取?每个Channel可以注册一个或多个事件,为其相应端(客户端/服务端)提供指定服务
- –> 怎么实现?由Selector(选择器,相当于Reactor模式的事件分离器)提供绑定和取出功能
===> Reactor模式:IO 多路复用
注意:NIO 在直接对文件进行读写时无阻塞,但是使用 Selector 进行连接管理时,在等待就绪事件 select() 时还是会阻塞的。
3)AIO:异步不阻塞 IO;采用的是异步 IO 模型,基于 Proactor 设计模式
- 异步:同一时刻可以读写多个文件。实际是把读写操作交给了操作系统,待完成后OS会将数据会放到用户缓冲区中,然后通知服务端程序去处理。
- 不阻塞:若读写时没有数据,线程不会进入阻塞状态。都把读写操作交给IO系统了,工作线程怎么会阻塞。
=> BIO里用户最关心“我要读”,NIO里用户最关心”我可以读了”,在AIO模型里用户更需要关注的是“读完了”。
【IO】Java 中的 BIO、NIO、AIO相关推荐
- bio阻塞的缺点_java 中的 BIO/NIO/AIO 详解
java 的 IO 演进之路 我们在前面学习了 linux 的 5 种 I/O 模型详解 下面我们一起来学习下如何使用 java 实现 BIO/NIO/AIO 这 3 种不同的网络 IO 模型编程. ...
- IO之 java中BIO NIO AIO原理、区别以及应用
在本篇文章中,我们主要介绍一下java中的BIO NIO AIO,重点是NIO 先说一下同步.异步.阻塞和非阻塞. 简单来讲,同步和异步是针对内核和应用程序之间的交互而言的:阻塞和非阻塞其实是针对进程 ...
- java io流区别_Java中IO流的分类和BIO,NIO,AIO的区别
到底什么是IO 我们常说的IO,指的是文件的输入和输出,但是在操作系统层面是如何定义IO的呢?到底什么样的过程可以叫做是一次IO呢? 拿一次磁盘文件读取为例,我们要读取的文件是存储在磁盘上的,我们的目 ...
- Java中IO流的分类和BIO,NIO,AIO的区别
到底什么是IO 我们常说的IO,指的是文件的输入和输出,但是在操作系统层面是如何定义IO的呢?到底什么样的过程可以叫做是一次IO呢? 拿一次磁盘文件读取为例,我们要读取的文件是存储在磁盘上的,我们的目 ...
- Java的IO:BIO | NIO | AIO
原文: http://my.oschina.net/bluesky0leon/blog/132361 BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...
- Java IO(BIO, NIO, AIO) 总结
文章转载自:JavaGuide 目录 BIO,NIO,AIO 总结 同步与异步 阻塞和非阻塞 1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 ...
- JAVA IO : BIO NIO AIO
JAVA IO : BIO NIO AIO 同步异步.阻塞非阻塞概念 同步与异步 阻塞与非阻塞 IO VS NIO VS AIO 面向流与面向缓冲 阻塞与非阻塞IO BIO.NIO.AIO的JAVA实 ...
- Java的IO流 ,BIO NIO AIO 的区别?
目录 1.在了解不同的IO之前先了解:同步与异步,阻塞与非阻塞的区别: 2.BIO NIO AIO 分别代表什么?(面试简答): 3.BIO和NIO.AIO的区别: 4.java中io流的分类: • ...
- Java之IO,BIO,NIO,AIO知多少?
开心一笑 [一女人:"我真不放心丈夫,他准备到湖中心水最深的地方把猫扔掉."邻居:"那有什么不放心的?"女人:"猫已回家一钟头了!"] 提出 ...
- 也谈BIO | NIO | AIO (Java版--转)
http://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BI ...
最新文章
- 网络营销外包专员浅析尽管快照不见了网络营销外包仍在继续
- mac 安装php5.6 redis 扩展,centos6.5环境 安装php5.6的redis扩展
- 收藏 | OpenCV新手入门预处理
- [BZOJ1927]星际竞速(费用流)
- 呵呵呵,一周这么来也不错
- 【codevs1004】四子连棋
- 剑指offer——面试题58:二叉树的下一个结点
- win7怎么设置悬浮桌面便签
- KL距离(衡量两个概率分布的差异情况)
- Free Dwg Viewer-免费的AutoCAD DWG/DWF/DXF文件查看器
- java.io.IOException: http://XXX provided port:50000 is not reachable
- 【动手撸深度学习】不吹不黑一份代码即可进Kaggle排行榜!
- java swing 汽车租赁管理系统 java swing mysql实现的汽车租赁管理系统源码(1027)
- 干货资源共享之阿里云大学的学习路线和免费课程
- 运放参数——压摆率(SR)
- php 中大括号,PHP中大括号#39;{}#39;用法实例总结
- 如何将自己的网站发布在互联网上?(仅针对小白,大佬忽略)
- nodejs async.whilst用法
- 无土栽培远程监空技术方案
- Android自定义安全键盘