Java NIOAIO了解

一、阻塞和非阻塞

阻塞和非阻塞是进程在访问数据的时候,数据内是否准备就绪的一种处理方式,当数据没有准备的时候。

阻塞:往往需要等到缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。

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

二、同步和异步

同步和异步都是基于应用程序和操作系统处理IO时间所采用的方式,比如同步应用程序要直接参与IO读写的操作,异步所有的IO读写交给操作系统处理。

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

同步:
1. 阻塞到IO事件
阻塞到 read 或者 write,这个时候我们就完全不能做自己的事情。让读写方法加入到线程里面,然后阻塞线程的方式来实现。对线程的性能开销比较大。
2. IO事件的轮询(多路复用技术 select模型)
读写事件交给一个单独的线程来处理,这个线程完成IO事件的注册功能,还有不断地去轮询我们的读写缓冲区,看是否有数据准备好。通知我们相应的读写线程。这样的话,以前的读写线程就可以做其他的事情,这个时候阻塞的不是所有的IO线程,阻塞的 select 这个线程。

三、Java IO模型

  1. BIO JDK1.4 以前我们使用的都是BIO(阻塞IO),阻塞我们的读写方法到线程来提高性能。对于线程的开销本来就是一种性能的浪费。
  2. NIO JDK1.4 Linux 多路复用技术(select模型)实现IO事件的轮询方式来实现的同步非阻塞的模式。这种方式目前是主流的网络通信模式。Mina,Netty等网络通信框架比我们直接写NIO要容易些,并且代码可读性更好。
  3. AIO JDK1.7(NIO2) 真正的异步非阻塞IO,学习Linux epoll 模式。AIO使用得比较少,可以学习其思想。

四、NIO AIO原理的解读

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

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

对于三次握手的方式建立稳定的连接,性能开销比较大。解决方案从思想上来说比较容易,就是减少连接的次数,对我们的读写通信管进行一个抽象。Channel是在一个TCP连接之间的抽象,一个TCP连接可以对应多个管道,而不是以前只有一个通信信道,减少了TCP连接的次数

五、NIO 原理

通过select(选择器)就相当于管家,管理所有的IO事件(connection、accept、客户端和服务端的读写)。

六、select如何进行管理IO事件?

当IO事件注册给我们的选择器的时候,选择器会给他们分配一个key(可以简单地理解成一个事件的标签)。当IO事件完成后通过key值来找到相应的管道,然后通过管道发送数据和接收数据等操作。
* 数据缓冲区 通过bytebuffer,提供很多读写的方法put、get。
* 服务端 ServerSocketChannel
* 客户端 SocketChannel
* 选择器 Selector selector = select.open();这样就打开了我们的选择器。

七、Selectionkey 以通过它来判断IO事件是否已经就绪。

key.isAcceptable 是否可以接受客户端的连接
key.isConnectionable 是否可以连接服务端
key.isReadable 缓冲区是否可读
key.isWritable 缓冲区是否可写

八、如何获得事件keys

Selectionkey keys = selector.selectedKeys();

九、如何注册

channel.regist(Selector, selectionkey.OP_Wirte);
channel.regist(Selector, selectionkey.OP_Read);
channel.regist(Selector, selectionkey.OP_Connect);
channel.regist(Selector, selectionkey.OP_Accept);

十、AIO主要API

  • 服务端 AsynchronousServerSocketChannel
  • 客户端 AsynchronousSocketChannel
  • 用户处理器 CompletionHandler接口,这个接口实现应用程序向操作系统发起IO请求,当完成后处理具体逻辑,否则,做自己该做的事情。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章