java NIO 原理解析之学习笔记
关键抽象
1.Buffer缓冲区
NIO数据传递模型,是一个连续的内存区域、所有数据传递均通过buffer类处理;NIO提供了字符串、整形、字节、堆等多种缓冲区。
2.Channel(通道)
NIO把它支持的I/O对象抽象为Channel。它模拟了通信连接,类似于原I/O中的流(Stream),用户可以通过它读取和写入数据。目前已知的实例类有SocketChannel、ServerSocketChannel、DatagramChannel、FileChannel等。
|
通道 |
备注 |
|
FileChannel |
通过文件中读取数据 |
|
DatagramChannel |
通过UDP网络读取数据 |
|
SocketChannel |
通过TCP网络读取数据 |
|
ServerSocketChannel |
监听新进来的TCP连接,对每一个新进来的连接都会创建一个SocketChannel |
3.SelectionKey事件模型
NIO的服务端通过一个专门的线程来处理IO相关事件,采用双向通道进行数据传输,而不是单向的通道,通过在通道上注册我们感兴趣的事件来完成一系列操作。
事件模型如下:
|
事件KEY |
备注 |
|
SelectionKey.OP_ACCEPT |
服务器接受客户端请求 |
|
SelectionKey.OP_CONNECT |
客户端连接服务器事件 |
|
SelectionKey.OP_READ |
读取事件 |
|
SelectionKey.OP_WRITE |
写入事件 |
知识点
一、javaNIO和IO的区别
|
IO |
NIO |
|
面向流 |
面向缓冲区 |
|
阻塞IO |
非阻塞IO |
|
无 |
选择器/反应堆 |
1.阻塞/IO通信模型
阻塞IO在调用Read()方法时是阻塞的,它会等待数据返回获取超时才会返回;同理在accept方法时是阻塞,会等到有客户端连接才会返回;服务端会为每个客户端连接启动一个线程处理该客户端请求;
阻塞IO模型示意图如下:

2.javaNIO通信模型
Java NIO是在jdk1.4中引入的,用户新I/O之说,是非阻塞式I/O。工作原理如下:
专门线程处理所有IO事件,负责分发;事件驱动机制:事件到达处发,线程之间通信是通过wait,notify等方式通信。减少不必要的线程切换。
1.Selector(选择器)模式
Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。示意图如下

2.reactor(反应器)模式
使用单线程模拟多线程,提高资源利用率和程序的效率,增加系统吞吐量。示意图如下:

3.服务端与客户端通讯模式
服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道 (channel) 上的事件。我们以服务端为例,如果服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,阻塞I/O这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达,则处理这些事件,如果没有感兴趣的事件到达,则处理线程会一直阻塞直到感兴趣的事件到达为止。
下面是我理解的java NIO的通信模型示意图:

小结
java NIO面向缓存区、非阻塞IO
处理模式有选择器、反应堆
基于事件监听模式响应IO流

浙公网安备 33010602011771号