BIO、NIO、AIO入门认识
同步、异步。阻塞。非阻塞概念理解。
同步:
比如在执行某个逻辑业务,在没有得到结果之前一直处于等待阻塞状态,得到结果后才继续执行
异步:
比如在执行某个逻辑业务,在没有得到结果可以去干其他的事情,等待通知再回来执行刚才没执行完的操作。
阻塞:
比如在执行某个逻辑业务,在结果没有返回之前,当前线程会被挂起,直到有结果了才继续执行
非阻塞:
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程的执行,继续执行直接返回
IO、BIO、NIO、AIO
- Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
- Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
- Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
IO :
IO操作分为两个部分:发起IO请求、IO数据读写,再简单一点就input和output流,作用于数据传
BIO : 同步阻塞IO
同步阻塞IO处理 在程序的开发之中Java里面最小的处理单元就是线程,也就是说每一个线程可以进行IO的处理,在处理之中,该线程无法进行任何的其他操作。 多线程是不可能无限制进行创造的,所以需要去考虑堆线程进行有效的个数控制。如果产生的线程过多,那么直接的问题在于,处理性能降低 ,响应的速度变慢。 需要去区分操作系统的内核线程,以及用户线程的区别,所以最好与内核线程有直接联系,需要使用到固定线程池。 【BIO】现在烧水,意味着你现在需要一直盯着水壶去看,一直看它已经烧为止,在这之中你什么都干不了。
最广泛的模型是阻塞I/O模型,默认情况下,整个过程是阻塞的,直到数据复制到进程缓冲区时才返回
NIO : 同步非阻塞IO
同步非阻塞IO处理 在传统的Java环境里面,最初的程序需要依赖于JVM虚拟机技术。最早的时候由于虚拟机的性能很差,所以很少有人去关注通讯的速度问题,大部分的问题都出现在了CPU处理上。 但是随着硬件的性能提升,实际上CPU的处理速度加强了。所以从JDK 1.4开始就引入NIO的开发包,可以带来底层数据的传输性能。 在NIO之中采用了一个Reactor事件模型,注册的汇集点Selector 【NIO】烧水,不会一直傻站着看,你采用轮询的方式来观察水是否烧开。
NIO的三个组成部分: Channel(通道)、Buffer(缓冲区)、Selecter(选择器)
Channel :通道
Channel是一个对象,连接Date数据和缓冲区的桥梁,看以看成IO中的流,不同的是:
流分为读取流和写入流是单向的,通道是双向的,既可以读又可以写;
hannel可以进行异步的读写;
Channel是通过Buffer来读写数据的,Buffer才是处理数据的对象,Channel只是桥梁
因为Channel是双向的,所以Channel可以比流更好地反映出底层操作系统的真实情况
Buffer :缓冲区
Buffer是一个缓冲区对象,数据是从通道读入缓冲区,从缓冲区写入到通道中的
从Buffer读写数据一般遵循以下四个步骤
写入数据到 Buffer;
调用 flip() 方法;
从 Buffer 中读取数据;
调用 clear() 方法或者 compact() 方法。
当向 Buffer 写入数据时,Buffer 会记录下写了多少数据。
一旦要读取数据,需要通过 flip() 方法将 Buffer 从写模式切换到读模式。
在读模式下,可以读取之前写入到 Buffer 的所有数据。
一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。
有两种方式能清空缓冲区:调用 clear() 或 compact() 方法。
clear() 方法会清空整个缓冲区。compact() 方法只会清除已经读过的数据。
任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。
- public void test1(String r,String w) throws IOException {
- //声明读取文件和写入文件
- FileInputStream fi=new FileInputStream(new File(r));
- FileOutputStream fo=new FileOutputStream(new File(w));
- //获得传输通道channel
- FileChannel inChannel=fi.getChannel();
- FileChannel outChannel=fo.getChannel();
- //获得容器buffer
- ByteBuffer buffer= ByteBuffer.allocate(1024);
- while(true){
- //判断是否读完文件
- int eof =inChannel.read(buffer);
- if(eof==-1) {
- break;
- }
- //从读取模式转换我写入模式
- buffer.flip();
- //开始写
- outChannel.write(buffer);
- //写完要清空重置buffer缓冲区,
- buffer.clear();
- }
- inChannel.close();
- outChannel.close();
- fi.close();
- fo.close();
- }
- }
- public void test1(String r,String w) throws IOException {
Selector :选择器
Selecter是一个选择器对象,它可以注册到各个Channel上并监听发生的事件,
优点:1.通过一个线程管理多个Channel,就可以处理大量网络连接了。
2.线程上下文的切换在高并发是的开销很大,使用Selecter,对许系统动用的线程来说,是优化的
由于selector的原因,可以将NIO简单区分为两种:普通的NIO,和多路复用的NIO(加入了selector管理)
普通的NIO :
NIO在IO操作的准备数据阶段时有一个轮询操作,
会不停地发出“system call”到kernel轮询数据是否准备好,
没准备好,应用进程可以处理其他事,
准备好了之后在发出一个“system call”到kernel进行第二个阶段复制数据,
这个过程是blocking的,所以NIO的特点就是在IO执行的第一阶段不会阻塞,
但是在第二阶段将数据从内核拷贝到进程这个真是的IO操作还是会阻塞。
多路复用NIO:
多路复用的NIO则是上述的普通NIO的补充,
在并发量过大的情况下,不可能每个线程都要轮询自己的IO状态,
这时就可以使用selector管理所有的IO通道channel,
开启一个线程,便可解决成千上万的高并发问题
AIO:异步IO
异步非阻塞IO、是在JDK 1.7的时候才推出的模型。 是利用了本地操作系统的IO操作处理模式,当有IO操作产生之后,会启动有一个单独的线程,它将所有的IO操作全部交由系统完成,只需要知道返回结果即可。 主要的模式是基于操作回调的方式来完成处理的,如果以烧水为例:在烧水的过程之中你不需要去关注这个水的状态,在烧水完成后才进行通知。
虽然NIO在网络操作中,提供了非阻塞的方法,但是NIO的IO行为还是同步的。
对于NIO来说,我们的业务线程是在IO操作准备好时,得到通知,接着就由这个线程自行进行IO操作,IO操作本身是同步的。
AIO它不是在IO准备好时再通知线程,而是在IO操作已经完成后,再给线程发出通知,因此AIO是不会阻塞的
此时我们的业务逻辑将变成一个回调函数,等待IO操作完成后,由系统自动触发,节省了NIO中selector循环遍历检测数据就绪的资源开销
与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的;
对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;
对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。
即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。
三个IO模型的适用场景
- BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
- NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
- AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
BIO、NIO、AIO入门认识的更多相关文章
- 也谈BIO | NIO | AIO (Java版--转)
关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...
- Netty5序章之BIO NIO AIO演变
Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...
- Netty序章之BIO NIO AIO演变
Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...
- BIO | NIO | AIO (Java版)
几篇解释的不错的文章: BIO NIO AIO NIO.2 入门,第 1 部分: 异步通道 API 使用异步 I/O 大大提高应用程序的性能
- 转载:BIO | NIO | AIO
http://my.oschina.net/bluesky0leon/blog/132361 也谈BIO | NIO | AIO (Java版) 转载自:zheng-lee博客 发布时间: 201 ...
- (转)也谈BIO | NIO | AIO (Java版)
原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...
- 拿搬东西来解释udp tcpip bio nio aio aio异步
[群主]雷欧纳德简单理解 tcpip是有通信确认的面对面通信 有打招呼的过程 有建立通道的过程 有保持通道的确认 有具体传输udp是看到对面的人好像在对面等你 就往对面扔东西[群主]雷欧 ...
- IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)
有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...
- I/O模型系列之三:IO通信模型BIO NIO AIO
一.传统的BIO 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请 ...
- 【netty】(1)---BIO NIO AIO演变
BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用的技术. Net ...
随机推荐
- 拓展KMP求回文串
题目:hdu3613: 题意:有26字母对应的价值,然后给出以个串,把它分成两段字串,如果字串是回文串,串的价值就是每个字符和,不是就为0.求最大价值. 博客 分析:拓展KMP的应用求回文字串. #i ...
- Win10下安装erl和RabbitMQ踩坑【版本不兼容】
版本不兼容 erl:otp_win64_21.0.1.exe rabbitmq:rabbitmq-server-3.8.1.exe(2019.12.06时最新版) 根据官方文档的匹配表:https:/ ...
- sublime里面几个个人觉得比较实用的快捷键
Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中并更改所有相同的变量名.函数名等. Ctrl+L 选中整行,继续操作则继续选择下一行,效果和 Shift+ ...
- Android基础——框架模式MVC在安卓中的实践
本篇文章包含以下内容: MVC的介绍 MVC的实践 MVC的介绍 MVC (Model View Controller),是模型(model)视图(view)控制器(controller)的缩写,一种 ...
- windows 远程登录
在我的电脑 属性当中开启远程登录功能 然后制作账号,这里对于账号的命名是有要求的,具体网上查找说是要用户名和全名一样,我没有做测试,不过新创建了一个用户用来登录,总是告知我密码错误,导致登录失败,所 ...
- Hbase和Hive在大数据架构中处在不同位置
先放结论:Hbase和Hive在大数据架构中处在不同位置,Hbase主要解决实时数据查询问题,Hive主要解决数据处理和计算问题,一般是配合使用.一.区别:Hbase: Hadoop database ...
- 依赖背包变形——poj1947(经典)
/*这题显然不适用依赖背包的优化,因为不能保证根是必选的,但是可以按照常规依赖背包的思路进行转移,即每次对一个儿子进行C^2的转移 还是树形的背包,dp[u][j]表示u的子树里,切割出一个大小为j的 ...
- hive中的lateral view 与 explode函数的使用
hive中的lateral view 与 explode函数的使用 背景介绍: explode与lateral view在关系型数据库中本身是不该出现的. 因为他的出现本身就是在操作不满足第一范式的数 ...
- APIO 2007 风铃
题目描述 你准备给弟弟 Ike 买一件礼物,但是,Ike 挑选礼物的方式很特别:他只喜欢那些能被他排成有序形状的东西. 你准备给 Ike 买一个风铃.风铃是一种多层的装饰品,一般挂在天花板上. 每个风 ...
- NX二次开发-获得图纸抑制尺寸的表达式UF_DRF_ask_controlling_exp
#include <uf.h> #include <uf_modl.h> #include <uf_drf.h> #include <uf_obj.h> ...