BIO、NIO、AIO
BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
AIO(NIO.2): 异步非阻塞IO,在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。
BIO
阻塞IO,一个请求对应一个线程,线程是阻塞的。

缺点:
阻塞式IO、弹性伸缩能力强、多线程消耗资源。
NIO
每个客户端请求都会注册到Selector(多路复用器)

优点:
非阻塞式IO模型、弹性伸缩能力强、单线陈节省资源。

同步非阻塞式IO,关键是采用了事件驱动的思想来实现了一个多路转换器。
NIO与BIO最大的区别就是只需要开启一个线程就可以处理来自多个客户端的IO事件,实现原理就是多路复用器,可以监听来自多个客户端的IO事件:
A. 若服务端监听到客户端连接请求,便为其建立通信套接字(java中就是通道),然后返回继续监听,若同时有多个客户端连接请求到来也可以全部收到,依次为它们都建立通信套接字。
B. 若服务端监听到来自已经创建了通信套接字的客户端发送来的数据,就会调用对应接口处理接收到的数据,若同时有多个客户端发来数据也可以依次进行处理。
C. 监听多个客户端的连接请求和接收数据请求同时还能监听自己是否有数据要发送。
总之就是在一个线程中就可以调用多路复用接口(java中是select)阻塞同时监听来自多个客户端的IO请求,一旦有收到IO请求就调用对应函数处理。
一旦有请求到来(不管是几个同时到还是只有一个到),都会调用对应IO处理函数处理,所以:
(1)NIO适合处理连接数目特别多,但是连接比较短(轻操作)的场景,Jetty,Mina,ZooKeeper等都是基于java nio实现。
(2)BIO方式适用于连接数目比较小且固定的场景,这种方式对服务器资源要求比较高,并发局限于应用中。

本文详细介绍了Java中的三种IO模型:BIO、NIO和AIO。BIO是同步阻塞模型,每个请求对应一个线程,适合连接数少且连接短的场景;NIO是同步非阻塞,通过多路复用器实现单线程处理多个请求,节省资源,适合高并发连接;AIO则是异步非阻塞,内核完成IO操作后通知用户进程,适合处理大量连接。NIO因其高效的资源利用在Jetty、Mina等框架中被广泛应用。
https://www.bilibili.com/video/BV1qL411u7eE?spm_id_from=333.999.0.0
2万+

被折叠的 条评论
为什么被折叠?



