天天看点

【Java IO】I/O模型之BIO、NIO、AIO + 深拷贝、浅拷贝

1、关于I/O

应用程序对操作系统的内核发起IO调用(系统调用),操作系统负责的内核执行具体IO操作。

常见的IO操作有:磁盘IO(读写文件),网络IO(网络请求)

当应用程序发起 I/O 调用后,会经历两个步骤:

  • 内核等待 I/O 设备准备好数据
  • 内核将数据从内核空间拷贝到用户空间

Unix系统下的I/O模型一共有 5 种: 同步阻塞 I/O、同步非阻塞 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O。

2、Java中常见的IO模型

首先,应用程序发起read调用后,内核会先准备数据,等待数据就绪,然后拷贝数据。

BIO (Blocking I/O)——属于同步阻塞IO

应用程序发起 read 调用后,会一直阻塞,直到在内核把数据拷贝到用户空间。

【Java IO】I/O模型之BIO、NIO、AIO + 深拷贝、浅拷贝

NIO (Non-blocking/New I/O) ——属于同步非阻塞IO模型

面向缓冲,基于通道的I/O操作方法,适用于高负载高并发的网络应用。

应用程序发起 read 调用后,会不断进行 I/O 系统调用轮询数据是否已经准备好,避免一直阻塞。

【Java IO】I/O模型之BIO、NIO、AIO + 深拷贝、浅拷贝

但是,应用程序不断进行 I/O 系统调用轮询数据是否已经准备好的过程是十分消耗 CPU 资源的。

因此,就有了I/O多路复用模型:线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间->用户空间)还是阻塞的。

IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗。

【Java IO】I/O模型之BIO、NIO、AIO + 深拷贝、浅拷贝

AIO(Asynchronous I/O)——NIO的改进版NIO2,异步IO模型

异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

3、小总结:

【Java IO】I/O模型之BIO、NIO、AIO + 深拷贝、浅拷贝

可以这么理解和记忆:

一个商人,要求某个裁缝店为他做身衣服。

BIO就是,该商人一直在裁缝店等着裁缝空闲,然后拿走衣服;

NIO就是,商人派了几个小弟,守着各个裁缝店,哪个裁缝店是空闲的就要求店主做衣服,然后拿走衣服;

AIO就是,裁缝点空闲了,就打电话通知商人。

参考连接:I/O模型

【Java IO】I/O模型之BIO、NIO、AIO + 深拷贝、浅拷贝