NIO2(AIO)-实现原理源码分析---初稿(后面完善)

本文主要分析以下内容

  • 什么是AIO,AIO的特征有哪些?应用场景?
  • jdk是如何实现的,分别分析window、linux
    • 线程模型
    • 源码分析创建异步通道、其他IO操作

 

前提概要

不管是非阻塞还是异步的实现,都要基于应用启动一个线程(线程池)来轮训调用OS API,比如Select.select(或者ServerSocketChannel的accpet)方法,外层都要使用while循环来调用。

AIO也一样,也需要开启线程循环调用某个API来处理逻辑。

AIO以来两个MAP将各个操作(比如读、写、accept、connect、close等)与事件关联起来。

AIO的实现具体过程,以read为例:

  1. 首先,应用程序在调用 read API ,传递给API至少包含3个参数:socket、buffer、当前请求的唯一标识,调用后立即返回。当然在调用前需要将唯一标识与应用内部定义的某个回调处理对象绑定,待后面可以通过唯一标识映射出回调对象进行逻辑及处理。
  2. read的过程就结束了。那么OS如何通知应用程序read系统调用准备好了呢(准备好的意思就是:已经将数据从内核缓冲区拷贝到用户缓冲区了)?下面就是另外一个线程该干的事了。这个线程就是在while循环里不断调用操作系统API阻塞式获取是否有准备好的IO事件,这个API会返回上面提到的那个唯一标识。这样就可以关联了。

 大概流程如下:

 

既然是异步、而且是非阻塞调用,jdk提供了两种实现获取执行结果的API,一种返回Future、另外一种是基于回调函数。如果是基于回调函数,那么肯定是通过其他线程或者线程池执行的。

 

 window平台下AIO的实现

1、线程模型

 我还没整理完的图,先分享下:https://www.processon.com/view/link/60888cbb7d9c083bd837a167

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值