本文主要分析以下内容
- 什么是AIO,AIO的特征有哪些?应用场景?
- jdk是如何实现的,分别分析window、linux
- 线程模型
- 源码分析创建异步通道、其他IO操作
前提概要
不管是非阻塞还是异步的实现,都要基于应用启动一个线程(线程池)来轮训调用OS API,比如Select.select(或者ServerSocketChannel的accpet)方法,外层都要使用while循环来调用。
AIO也一样,也需要开启线程循环调用某个API来处理逻辑。
AIO以来两个MAP将各个操作(比如读、写、accept、connect、close等)与事件关联起来。
AIO的实现具体过程,以read为例:
- 首先,应用程序在调用 read API ,传递给API至少包含3个参数:socket、buffer、当前请求的唯一标识,调用后立即返回。当然在调用前需要将唯一标识与应用内部定义的某个回调处理对象绑定,待后面可以通过唯一标识映射出回调对象进行逻辑及处理。
- read的过程就结束了。那么OS如何通知应用程序read系统调用准备好了呢(准备好的意思就是:已经将数据从内核缓冲区拷贝到用户缓冲区了)?下面就是另外一个线程该干的事了。这个线程就是在while循环里不断调用操作系统API阻塞式获取是否有准备好的IO事件,这个API会返回上面提到的那个唯一标识。这样就可以关联了。
大概流程如下:
既然是异步、而且是非阻塞调用,jdk提供了两种实现获取执行结果的API,一种返回Future、另外一种是基于回调函数。如果是基于回调函数,那么肯定是通过其他线程或者线程池执行的。
window平台下AIO的实现
1、线程模型
我还没整理完的图,先分享下:https://www.processon.com/view/link/60888cbb7d9c083bd837a167