NIO简介

参考:守望者网站

一.基本概念解析

 

1)阻塞和非阻塞:

阻塞和非阻塞是进程在访问数据的时候,数据内是否准备就绪的一种处理方式,当数据没有准备的时候  阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里

非阻塞:当我们的进程访问我们的数据缓冲区的时候  数据没有准备好的时候   直接返回 不需要等待.数据有的时候 也直接返回.

2)同步和异步的方式:

同步和异步都是基于应用程序和操作系统处理IO时间锁采用的方式.比如同步应用程序要直接参与IO读写的操作,异步:所有的IO读写交给操作系统去处理. 同步的方式在处理IO事件的时候 必须阻塞在某个方法上面等待我们的IO时间完成(阻塞IO事件或则通过轮询IO事件的方式),对于异步来说,所有的IO读写都交给了操作系统  这个时候  我们可以去做其他的事情  并不需要去完成真正的IO操作,当操作完成IO后 给我们的应用程序一个通知就可以的,

同步:1)阻塞到IO事件  阻塞到read  或则 write.  这个时候我们就完全不能做自己的事情.让读写方法加入到线程里面   然后阻塞线程来实现.对线程的性能开销比较大.

3)IO事件的轮询  --多路复用技术(select模式)

读写事件交给一个单独的线程来处理,这个完成IO事件的注册供,还有就是不断的去轮询我们的读写缓冲区  看是否有数据准备好。 通知我们通知相应读写线程. 这样的话  以前的读写线程就可以做其他的事情  这个时候阻塞的不是所有的IO线程   阻塞的select这个线程.

Client                 Select  管家                BOSS

当客人来的时候,就给管家说 我来了,管家得到这个注册信息后, 给BOSS说  我这里有一个或则多个客人  ,BOSS你去给某人A

这件东西,给另外人B这样东西。这个时候  客人是可以去做自己的事情的,比如看看花园等等, 当管家知道boss给他任务后 他就是去找对应的某人  告诉他boss给他某样东西。(根据我们的注册信息)

二.Java IO模型

BIO:JDK1.4以前我们使用都是BIO 阻塞IO

阻塞到我们的读写方法,阻塞到线程来提供性能.对于线程的开销本来就是性能的浪费.

NIO:jdk1.4  linux 多路复用技术(select模式)  实现IO事件的轮询方式:同步非阻塞的模式.这个种方式目前是主流的网络通信模式.

Mina,netty    mina2.0    netty5.0---网络通信框架.比我直接写NIO要容易些  并且代码可读性更好

AIO:jdk1.7 (NIO2) 才是实现真正的异步aio,学习linux epoll模式

AIO使用的比较少,大家可以认真的学习一些思想

小结:1)BIO阻塞的IO

2)NIO  select+非阻塞  同步非阻塞

3)异步非阻塞IO

3.NIO AIO原理的解读

对于网络通信而言NIO,AIO并没有改变网通通信的基本步骤,只是在其原来的基础上(serverscoket,socket)做了一个改进.

Socket     <----建立连接需要三次握手----->           serversocket

对于三次握手的方式建立稳定的连接性能开销比较大.解决方案从思想上来说比较容易  就是减少连接的次数.对我们的读写通信管道进行一个抽象.

4.NIO原理

通过selctor(选择器)就相当管家 ,管理所有的IO事件

Connction   accept    客服端和服务端的读写.-----IO事件

selctor(选择器)如何进行管理IO事件

当IO事件注册给我们的选择器的时候   选择器会给他们分配一个key(可以简单的理解成一个时间的标签) 当IO事件完成过通过key值来找到相应的管道  然后通过管道发送数据和接收数据等操作.

数据缓冲区:

通过bytebuffer,提供很多读写的方法   put()   get()

服务端:ServerSocketChannel

客服端:  SocketChannel

选择器:  Selector  selector=Select.open();这样就打开了我们的选择器.

4.Selectionkey:

可以通过它来判断IO事件是否已经就绪.

key.isAccptable:是否可以接受客户端的连接

Key.isconnctionable:是否可以连接服务端

Key.isreadable():缓冲区是否可读

Key.iswriteable():缓冲区是否可写

5.如何获得事件的keys

Selectionkey  keys=  Selector.selectedkeys();

6.如何注册

channel.regist(Selector,Selectionkey.OP_Write);

channel.regist(Selector,Selectionkey.OP_Read);

channel.regist(Selector,Selectionkey.OP_Connct);

channel.regist(Selector,Selectionkey.OP_Accept);

6.AIO:

服务端:AsynchronousServerSocketChannel

客服端:AsynchronousSocketChannel\

用户处理器:CompletionHandler接口,这个接口实现应用程序向操作系统发起IO请求,当完成后处理具体逻辑,否则做自己该做的事情.

时间: 2024-11-07 07:37:06

NIO简介的相关文章

JAVA NIO 简介(转)

1.   基本 概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执行 I/O 较高级别的工具. (c 的 printf scanf,java 的面向对象封装 ) 2.    Java 标准 io 回顾 Java 标准 IO 类库是 io 面向对象的一种抽象.基于本地方法的底层实现,我们无须关注底层实现.InputStream\OutputStream( 字节流 ) :一次传送一个字

JAVA NIO 简介

1.   基本     概念   IO  是主存和外部设备 (  硬盘.终端和网络等 )  拷贝数据的过程. IO  是操作系统的底层功能实现,底层通过 I/O  指令进行完成. 所有语言运行时系统提供执行 I/O  较高级别的工具. (c  的 printf scanf,java  的面向对象封装 ) 2.      Java   标准 io   回顾 Java  标准 IO  类库是 io  面向对象的一种抽象.基于本地方法的底层实现,我们无须关注底层实现. InputStream\Outp

Java IO流-NIO简介

2017-11-05 22:09:04 NIO NIO:new IO就是新IO的意思,JDK4开始出现新IO,新IO和传统的IO有相同的目的,都是用于进行输入输出的,但是新IO使用了不同的方式来处理输入输出,采用内存映射文件的方式,将文件或者文件中的一段区域映射到内存中,就可以相访问内存一样来访问文件了,这种方式的效率比旧IO要高很多,但是目前好多地方我们看到还是旧IO为主. 一个小例子: Path:路径 Paths:有一个静态方法返回一个路径       public static Path

NIO 简介

上文我们描述了五中IO类型.第一种同步阻塞模型我们我们称之为BIO(Blocking IO), 第三种IO复用模型我们称之为NIO(Nonblocking IO). 上图我们可以很容易的发现 BIO会为每个socket请求创建一个线程,而NIO可以通过一个线程处理多个请求.当然,我们可以为BIO构建一个线程池,这是一种伪异步的BIO模型.BIO和NIO最大的区别还是在阻塞上面. 阻塞主要有两方面 等待网络可读写  server.accept() 读写阻塞 通过观察InputStream的Api我

Java-NIO(一):简介

Java NIO简介: Java New IO Non Blocking IO,从java1.4版本就开始引入了新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的.基于通道的IO操作.NIO将更加高效的方式进行文件的读写操作. Java NIO与IO的区别: IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented) 阻塞IO(Blocking IO) 非阻塞IO(

1.NIO概述

/*Java NIO 简介*/ java NIO (New IO)是从 java1.4版本开始引入的一个新的IO API,可以替代标准的 java IO API (jdk1.7又对其进行了改进, 称为NIO2) NIO 与 原来的 IO 有相同的作用和目的,但是使用的方式完全不同,NIO支持面向 /*缓冲区*/的.基于 /*通道*/的 IO 的操作 NIO 将以更加高效的方式进行文件的读写操作 /*Java NIO 与 IO 的 主要区别*/ /*通道 和 缓冲区 */ Java NIO 系统的

不惑JAVA之JAVA基础 - NIO (二)

上面主要讲解了java IO类及其如何使用,本篇主要讲NIO原理. NIO原理 阻塞IO 非阻塞与阻塞也就是我们常说的IO与NIO.在聊非阻塞前,我们先来看看网络通讯中的阻塞. 常见的网络 IO 通讯流 上面是一个网络通信IO流程图,何为阻塞呢 ? 在以上过程中若连接还没到来,那么 accept 会阻塞 , 程序运行到这里不得不挂起, CPU 转而执行其他线程. 在以上过程中若数据还没准备好, read 会一样也会阻塞. 阻塞式网络 IO 的特点:多线程处理多个连接.每个线程拥有自己的栈空间并且

Java中的BIO、NIO、AIO-3

Java中的BIO.NIO.AIO-3 java 这一篇是代码篇,敲代码有助于理解记忆这些抽象的东西: 参考资料: http://www.blogjava.net/killme2008/archive/2012/09/17/295743.html Java AIO初探(异步网络IO) https://www.ibm.com/developerworks/cn/java/j-lo-nio2/index.html 在 Java 7 中体会 NIO.2 异步执行的快乐 https://blog.csd

JAVA NIO(死磕1)

[正文]JAVA NIO 死磕1:  JAVA NIO简介 1. JAVA NIO简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O,所以,更多的人喜欢称之为非阻塞I/O(Non-block I/O). NIO弥补了原来同步阻塞I/O的不足,它在标准Java代码中提供了高速的.面向块的I/O. Java NIO 由以下几个核心部分组成: Channel Buffer Sel