BIO,NIO和AIO的区别联系

BIO,NIO和AIO是Java网络编程的三种模型

BIO(blocking input & output):同步并阻塞,服务实现模式为一个连接对应一个线程,即客户端发送一个连接,服务端要有一个线程来处理。如果连接多了,线程数量不够,服务端资源也有限,还容易出现C10K问题,就只能等待,即会发生阻塞。如果采用线程连接池可以解决服务端资源有限的问题。

NIO(no-blocking input & output):同步非阻塞,服务实现模式是一个线程可以处理多个连接,即客户端发送的连接都会注册到多路复用器上,然后进行轮询连接,有I/O请求就处理。

AIO:异步非阻塞,引入了异步通道,采用的是proactor模式,特点是:有效的请求才启动线程,先有操作系统完成在通知服务端。

应用场景:

BIO:适用连接数目比较小且固定的架构,对服务器要求比较高,并发局限于应用中

NIO:适用连接数目多且连接比较短的架构,如:聊天服务器,弹幕系统等,编程比较复杂

AIO:适用连接数目多且连接长的架构,如相册服务器

BIO和NIO的区别

1.BIO主要是以I/O流的形式处理数据;NIO以I/O块(buffer)的形式处理数据,效率:块>流

2.BIO是阻塞的,NIO是非阻塞的。即BIO如果没有连接,那么就会一直卡住,等待连接,直到连接上了,才能够往下进行操作。而NIO不会卡住在等待连接的位置。

3.BIO主要是以字节流和字符流操作,NIO是基于channel(通道)、buffer(缓冲区)操作的;selector(选择器)是用来监听channel的。

4.BIO是单向的,要么是输入流要么是输出流,NIO是双向的,可以从channel往buffer读写数据,同时buffer也可以向channel读写数据。

NIO的三大核心流程图

selector(选择器),channel(通道),buffer(缓冲区)

从图可以看出,一个线程对应selector,selector对应三个channel,channel又对应buffer(双向)。程序切换到哪个channel取决于event事件决定,selector会根据事件去切换channel。

NIO如果把所有的连接对象都放在channellist里,性能会非常低,因为channellist里的对象可能非常多至成百上千至万,当一个用户的客户端发来请求,服务器就需要在这么多的对象里用for循环去找那一个channel,非常慢,所以就有了selector(多路复用器),使用主从模式,并注册在sever socket channel上。

buffer是一个内存块,底层有一个数组标榜发表。

猜你喜欢

转载自blog.csdn.net/qq_45947664/article/details/127850553