bio.pngBIO 为阻塞式通信,主要性能消耗在开启新线程负责客户端的链接,该线程会一直等待直到客户端数据发送完,中间可能因为网速问题,文件太大 等,造成该线程长期处于等待状态,浪费该线程的开销。如下图:
NIO为非阻塞通信,基于事件通知机制。当有客户端请求时,会先把客户端的数据存储到系统缓存,等数据发送完毕,程序再开启一个线程去系统缓存拉去数据或者对数据其他处理
nio.png(如文件数据直接存入硬盘,是零拷贝数据不进入程序内 )
效率高。
下图可以粗略理解一下,一个客户端请求的事件通知,
AIO为 NIO
2.0
版本,JDK1.7后才有,完全异步非阻塞通信。
总结:
一、 BIO和NIO不同:本质就是阻塞和非阻塞的区别
- 阻塞:应用程序在获取客户端的网络数据时候,如果网络传输数据很慢,那服务端的线程就一直等待数据传输完毕。
- 非阻塞:应用程序直接可以获取已经准备好的数据
(存在系统缓存中)
,无需等待。 - BIO为同步阻塞机制,NIO为同步非阻塞机制。NIO并没有实现异步,在JDK1.7后,NIO支持异步非阻塞机制,即NIO2.0 (AIO)
二、 同步和异步不同:指操作系统与应用程序对IO的操作不同
- 同步:应用程序直接参与IO的读写操作,应用程序直接阻塞到某个方法上,直到数据准备就绪;或者采用轮询事件通知的机制检查数据是否就绪,如果就绪就读取数据。
- 异步:所有的IO读写操作都交给操作系统处理,与我们的应用程序没有直接关系,应用程序不关心IO读写,当操作系统完成IO读写操作时,会给我们的应用程序发通知,程序直接拿走数据即可。
同步指的是server服务器
阻塞指的是具体的技术(BIO/NIO)
*对AIO的封装,即是 Netty *
网友评论