BIO,NIO,AIO有什么区别?
1.BIO(Blocking I/O):
概念:
同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。也就说一个连接一个线程,而且无论客户端是否有数据,这边线程也会在这里傻等,给服务端添加麻烦,因为多一个线程就要多一些切换,创建,销毁等操作。
何时阻塞:
在服务端等待连接(连接阻塞,accept())与读客户端来的数据会阻塞(读阻塞,read())。
服务端的操作:
1.通过ServerSocket注册端口
2.服务端通过调用accept方法用于监听客户端的Socket请求。阻塞操作
3.从Socket中获取字节输入或者输出流进行数据的读写操作。阻塞操作
客户端的操作:
1.通过Socket对象请求与服务端的连接
2.从Socket中得到字节输入或者是字节输出流进行数据的读写操作。
2. NIO(Non-Blocking/New I/O):
概念:
同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理。轮询访问每个通道,如果通道没有数据,是不会一直等待的。
NIO有三大核心部分:Channel(通道),Buffer(缓冲区),Selector(选择器)
通俗来说,NIO是可以用一个线程处理多个操作。假设有1000个请求,根据实际情况,可以分配20或30线程来处理。不像之前的阻塞IO那样,非得分配1000个。
对比BIO的阻塞地方,NIO为什么不阻塞:
阻塞的原因:socket是阻塞的
3. BIO与NIO的比较
1. BIO是以流的方式处理数据,而NIO以块的方式处理数据,块I/O的效率比流I/O高很多
2. BIO是阻塞的,NIO则是非阻塞的(通道没有数据,是不用管的)
3.BIO基于字节流和字符流进行操作,而NIO基于Channel(通道)和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据达到等),因此使用单个线程就可以监听到多个客户端通道。
4.AIO(Asynchronous I/O):
AIO也就是NIO 2.0 版本。它是异步非阻塞的IO模型。异步IO是基于事件和回调机制实现的,也就是说客户端的I/O请求都是由操作系统先完成后再去通知服务器应用去启动线程进行处理。
5.应用场景
1.BIO适用于连接数小,对服务器资源要求高,因为线程要开很多。
2.NIO适合于连接数多且数据连接比较短的架构,比如聊天服务器,弹幕系统等
3.AIO适用于连接数多且连接比较长的架构。充分调用操作系统参与并发操作。