IO模型
介绍
IO是输入输出,IO是面向流的。
java中有三种IO模型: BIO,NIO,AIO。它们又可以分为同步异步,阻塞与非阻塞。
而在linux中有5中IO模型。
同步与异步
同步与异步说的都是被调用者。
同步就是发起一个调用后,被调用者未处理完以前,不用返回。
异步就是发起一个调用后,立刻得到被调用者的回应,表示收到请求,但是并没有返回结果;被调用者通常依靠事件,回调等机制通知调用者返回结果。
阻塞与非阻塞
阻塞与非阻塞说的都是调用者。
阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。
非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。
BIO、NIO、AIO
这些都是经典的IO模型,IO模型就是使用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能。
- BIO:BIO就是传统的IO模型,是同步阻塞的IO模型,java.io包中类就是BIO的工具,它提供了很多IO功能,比如输入输出流,对文件进行操作。在网络编程(Socket通信)中也同样进行IO操作。
服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不作任何事情会造成不必要的线程开销。
- NIO:NIO是一种同步非阻塞的IO模型,对应java.nio包,提供了Channel , Selector,Buffer等抽象。
服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求会被注册到多路复用器上,多路复用器轮询到有 I/O 请求就会进行处理。
- AIO:异步非阻塞的IO模型,是改进版的NIO。
AIO引入了异步通道的概念,采用了Proactor模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。
举个例子
以讲的很多的烧水为例子。
- BIO就是叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。
- NIO是叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
- AIO是每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
场景分析
- BIO 方式适用于连接数比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。
- NIO 方式适用于连接数目多且连接比较短的架构,比如聊天服务器,弹幕系统,服务器间通讯等,编程比较复杂,JDK1.4开始支持。
- AIO 方式适用于连接数目多且连接比较长的架构,比如相册服务器,充分调用 OS 参与并发操作,变成比较复杂,JDK7 开始支持。
linux的5中IO模型
linux中共有5中IO模型:阻塞IO,非阻塞IO,IO复用模型,信号驱动IO模型,异步IO模型;最后一种是异步的其他都是同步的。
参考资料 & 鸣谢
相关文章