IO我们非常熟悉了,IO不仅仅针对文件的操作,网络编程socket的通信,就是IO操作。通常所说的 BIO 是相对于 NIO 来说的,BIO 也就是 Java 开始之初推出的 IO 操作模块,BIO 是 BlockingIO 的缩写,顾名思义就是阻塞 IO 的意思。
5种Linux网络I/O模型简介
Linux提供了5中I/O模型,如下:
- 阻塞I/O模型:所有文件操作都是阻塞的,数据从硬盘到内核态到用户态整个过程都是阻塞的。
- 非阻塞I/O模型:一般通过轮询的方式检查数据是否准备好数据。
- I/O复用模型:Linux提供了select/poll ,select/poll顺序扫描fd是否就绪,而且fd有限,因此使用收到了一些制约;linux还提供了epoll,epoll使用了基于事件的方式替代了顺序扫描,因此性能更高。
- 信号驱动I/O模型
- 异步I/O:告知内核开启某个操作,并再操作完成(包括数据从内核态复制到用户自己的缓冲区)后通知我们。
BIO、NIO、AIO的区别
- BIO(Block IO) 就是传统的 java.io 包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。
- NIO 是 Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。
- AIO 是 Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
BIO、NIO、AIO使用场景
- BIO 适用于连接数小且固定的架构,堆服务器资源要求比较高,jdk1.4前的唯一选择,但程序简单易懂
- NIO 适用于连接数多且连接比较短的架构,比如聊天服务器,弹幕系统,服务间通讯;编程比较负责,jdk1.4开始支持。
- AIO 适用于连接数比较多且比较长的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,jdk7开始支持
BIO(block IO)同步阻塞
- 每个请求都要创建独立的线程与对应的客户端进行交互
- 并发量大的时候需要创建大量的线程来处理连接,系统资源占用比较大
- 连接建立后,如果当前线程没有数据可读,则线程阻塞再read操作上,造成线程资源浪费
NIO (non-block IO/New IO) 同步非阻塞
NIO有三大核心类:Channel,Selector,Buffer, 面向缓冲区编程。