在设计高性能IO系统时,BIO、NIO和AIO的概念经常被混淆。这个问题在Java面试中经常被问到。例如:
BIO、NIO、AIO的概念,同步/异步、阻塞/非阻塞的区别,NIO如何实现复用功能,AIO、BIO、NIO的适用场景,NIO的核心概念、应用、框架等。内容本身比较复杂,很难一言以蔽之,书中的定义也不容易。本文内容是根据我的理解,用尽可能简单易懂的方式总结出来的,希望能帮助你快速理解这些概念。
AIO、BIO、NIO的区别
在澄清上述问题之前,我们首先要了解什么是同步、异步、阻塞、非阻塞。一旦清楚地理解了这些单独的概念,组合起来理解它们就相对容易了。
IO型号主要分类:
同步(synchronous)IO 和异步(asynchronous)IO 阻塞(blocking)IO 和非阻塞(non-blocking)IO 称为同步阻塞(blocking IO) BIO 称为同步非阻塞(non-blocking IO) NIO 称为异步非阻塞阻塞(同步非阻塞IO)称为AIO1.BIO(同步阻塞I/O模式)。
数据读取和写入应阻塞在等待完成的线程上。
这里我们将使用沸水的典型例子。我们假设有一系列水壶在沸腾的情况。 BIO的操作模式要求线程等待水壶沸腾后再处理下一个水壶。壶。但实际上,线程在等待水壶沸腾时什么也不做。
2.NIO(同步非阻塞)
虽然同时支持阻塞和非阻塞模式,但我们在这里讨论同步非阻塞I/O 模式。以烧水为例,NIO 的做法是让一个线程不断轮询每个水壶的状态,看水壶的状态是否发生变化,以便进行下一步操作。
3.AIO(异步非阻塞I/O模型)
异步非阻塞和同步非阻塞有什么区别?异步非阻塞不需要线程轮询每个IO 操作的状态变化。相应的状态发生改变后,系统会通知相应的线程进行处理。与沸水兼容,每个水壶都配有一个开关,当水沸腾时会自动通知您。
4.IO和NIO的区别
5 同步和异步的区别
您可以通过同步发送请求并在发送下一个请求之前等待返回来避免死锁和脏读。
异步发送请求而不等待返回可以提高效率并保证并发性,因为下一个请求可以随时发送。
6. 阻塞和非阻塞
传统IO流中的块就是一个块。也就是说,当线程调用read()或write()方法时,线程会被阻塞,直到数据被读取或写入,在此期间线程无法执行其他任务。由于线程在完成网络通信和执行IO操作时会被阻塞,因此服务器必须为每个客户端提供独立的线程进行处理,这样服务器就很难处理大量的客户端,如果有的话,性能会急剧下降。
非阻塞JavaNIO 是非阻塞的。当线程从通道读取或写入数据时,如果没有可用数据,则该线程执行其他任务。单个线程可以管理多个I/O 通道,因为线程通常使用非阻塞IO 空闲时间在其他通道上执行IO 操作。因此,NIO 允许服务器使用一个或有限数量的线程来同时处理连接到该服务器的所有客户端。
7、BIO、NIO、AIO适用场景
BIO方法适用于连接数相对较少且固定的架构。这种方式对服务器资源要求较高,并且在JDK1.4之前,并发能力有限。 NIO方式适用于连接数较多、连接相对较短(轻操作)的架构,例如聊天服务器,并发量仅限于应用程序,编程相对复杂。 AIO方式用于连接数较多、连接相对较长(运算量较大)的架构,例如相册服务器。它的编程相对复杂,但在JDK7 中开始支持。那。
NIO的3个核心概念
NIO的重点是理清三个类之间的关系:Channel、Buffer、Selector。
1.缓冲缓冲
缓冲区是对象。包含要写入或读取的数据。面向流的I/O 允许您直接向Stream 对象写入数据或从Stream 对象读取数据。
在NIO 中,所有数据都使用缓冲区进行处理。这意味着本文前面提到的IO是面向流的,而NIO是面向缓冲区的。
缓冲区本质上是一个数组,通常是字节数组(ByteBuffer),但其他类型的数组也是可能的。但缓冲区不仅仅是一个数组。缓冲区提供对数据的结构化访问并维护诸如读取和写入位置(限制)之类的信息。
最常用的缓冲区是ByteBuffer,它提供了一组用于操作字节数组的函数。事实上,除了ByteBuffer之外,每个Java基本类型(Boolean除外)都对应一个缓冲区:
ByteBuffer:字节缓冲区CharBuffer: 字符缓冲区ShortBuffer:短整数缓冲区IntBuffer:整数缓冲区LongBuffer: 长整数缓冲区FloatBuffer:浮点缓冲区DoubleBuffer:双精度浮点缓冲区
2. 渠道渠道
Channel是可以读写数据的通道,网络数据通过Channel进行读写。
通道和流之间的区别在于,通道是双向的,而流仅在一个方向上移动,并且通道可用于读取、写入或两者。
由于通道是全双工的,因此它们比流更好地映射底层操作系统API。特别是在UNIX网络编程中,底层操作系统的通道是全双工的,支持同时读写。
通道有四种实现方式。
FileChannel: 从文件读取数据。 DatagramChannel: 从UDP 网络读取和写入数据。 SocketChannel: 从TCP 网络读取和写入数据。 ServerSocketChannel: 允许您像服务器一样监听来自TCP 的连接。为每个连接生成一个SocketChannel。 3. 多路复用器选择器
选择器监控涉及多个通道的事物(读、写、accept(服务器端接收)、连接),实现一个线程管理多个通道,在线程切换上下文中处理资源可以节省消耗。选择器只能管理非阻塞上下文。 Channel、FileChannel被阻塞,无法管理。
关键对象
选择器:与选择器对象、通道订阅、通道监听对象和选择器关联。 SelectorKey:通道监控关键字,用于监控通道状态。
听众登记
Listener 已注册到Selector
SocketChannel.register(选择器, SelectionKey.OP_READ);
监控的事件有:
OP_ACCEPT: 是可接收的,由serviceSocketChannel 使用。 OP_READ: 是可读的,OP_WRITE: 是由socketChannel 使用的,是可写的。 OP_CONNECT: 是可连接的,由socketChannel 使用的。
NIO的应用和框架
1.蔚来应用
Java NIO已成功应用于多种分布式即时通讯和中间件Java系统中,充分证明基于NIO的通信基础是一种高效且高度可扩展的通信架构。
示例:Dubbo(服务框架)默认使用Netty作为基础通信组件,实现进程节点之间的内部通信。
Jetty、Mina、Netty、Dubbo、ZooKeeper等都是基于NIO实现的。
Mina诞生于开源界大牌Apache组织,Netty诞生于商业开源界大牌阿里巴巴分布式服务框架。
2.蔚来框架
特别是Netty是目前最流行的Java开源框架NIO Framework,一个异步、事件驱动的网络应用框架,用于快速开发高性能、高可靠性的网络服务器和客户端程序和工具。
与JDK原生的NIO相比,Netty提供了相对简单易用的API,非常适合网络编程。
Mina 和Netty 这两个NIO 框架是由同一个人Trustin Lee 创建的。从某种程度上来说,Netty是Mina的延伸,解决了Mina的设计缺陷,优化了Mina的设计理念。
另一方面,Netty 相对于Mina 也有一些优势。更容易学习的API、更简单、更详细的示例源代码和API文档、更活跃的论坛和社区以及更快的代码更新和维护。
Netty绝对是NIO框架的首选。其稳健性、功能、性能、可定制性和可扩展性在同类框架中是首屈一指的。本文剩余部分重点介绍Netty 实现原理和实际场景。
以上是关于BIO、NIO、AIO的知识点总结。
如果觉得对你有帮助,请点赞支持我哦~
- - - 结尾- - -
关注私信【666】即可领取专属福利包。
礼包内容:
1.【100个BAT架构主题】
2.【1000+BAT面试问答合集】
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。