认识NIO

来源:互联网 发布:淘宝泳衣模特是谁 编辑:程序博客网 时间:2024/06/05 15:03

1 NIO的优势

NIO,也就是所谓的non-blocking I/O,翻译成中文就是非阻塞I/O。在电商、大数据、游戏、金融等高负载、高并发的领域,传统的阻塞式I/O(BIO)越来越不能满足人们的日常使用需求,最显著的特点就是处理性能差,这已经不是业务逻辑层面可以解决的问题。每次客户端请求发过来之后,服务器都要创建线程去处理;并且如果没有东西可读/写的时候,程序就进入等待状态,直到有东西可读/写为止,这就是“阻塞”。

在这种背景下,非阻塞NIO的应运而生和逐步成熟很好地解决了这一问题。服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读就绪),则调用该socket连接的相应读操作;如果发现某个 Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。

2 NIO核心组件

NIO有很多组件,最核心的是以下三个:缓冲区Buffer、通道Channel、多路复用器Selector,下面我们逐一介绍:

2.1 缓冲区Buffer

缓冲区的本质是数组,最常用的是字节数组ByteBuffer,当然,除了boolean之外的每一种数据类型都有对应的数组,例如整型数组IntBuffer等等。NIO中,所有数据都读写到缓冲区中

2.2 通道Channel

相比于只能单向传输的stream(InputStream/OutputStream二选一),Channel可以同时进行网络数据的读写。Channel主要分为两大类:用于操作文件的FileChannel和用于网络读写的SelectableChannel(其子类包括ServerSocketChannel和SocketChannel)。

2.3 多路复用器Selector

Selector的主要作用是不断轮询注册在其上的Channel(没有最大连接句柄的限制,一个线程就可以轮询数以万计的客户端),如果某个Channel发生读或者写,表明它处于就绪状态,这样轮询下去就可以通过SelectionKey获取就绪Channel的集合,并进一步进行I/O操作。

2.4 NIO原理图

这里写图片描述

这里不做NIO的服务端、客户端的具体源码分析,在后面的博客中Netty的服务端和客户端构建的时候,会做详细的源码解析。

3 NIO与AIO

AIO,就是我们常说的异步IO,是在NIO2.0中提出来的。由于相比于同步阻塞的传统方式,NIO是异步的,因此很多人习惯于称NIO为异步非阻塞I/O。下面列出了BIO、AIO和NIO的一些区别,看看就好,这一点不必过分纠结

不同点 BIO NIO AIO 是否阻塞 阻塞 非阻塞 非阻塞 I/O线程个数 每个线程处理一个客户端 每个线程处理多个客户端 被动回调,不需要额外启动I/O线程 是否同步 同步 同步(多路复用) 异步 调试难度 低 高 高 可靠性和吞吐量 低 高 高

4 为什么选择Netty

直接使用JDK原生的API开发NIO程序,编程者的任务量、编程难度都很大。Netty则为我们提供了相对成熟得多的解决方案,综合性能好,相比于原生API大大减轻了开发者的工作难度,而且拥有活跃的社区。目前Hadoop等都在使用Netty作为底层通信框架。

当然,并不是所有Java网络编程都需要用到Netty,在并发量要求不高的时候,选择BIO可以降低调试难度。

说明
如有转载,请务必在文章开头注明出处:
http://blog.csdn.net/antony9118/article/details/52126189

1 0
原创粉丝点击