AIO与NIO

关于什么是NIO以及NIO和BIO 的区别是什么,之前我在博客里面其实讨论过,大家可以看看我之前的帖子,今天主要简单讲讲AIO和NIO的比较。

BIO和NIO:https://blog.csdn.net/qq_35590091/article/details/107121482

首先,给BIO、NIO、AIO三者做一个简答的比较:

在BIO里面,执行socket.read的时候,如果没有接收到数据,函数就会一直阻塞住,直到收到数据,返回读到的数据。也就是说等待就绪阶段阻塞,读写操作阶段也阻塞。

而在NIO里面,进行读取操作的时候,如果有数据直接读取数据,如果没有,则直接返回直接返回0,永远不会阻塞。但是NIO的读写IO阶段本身还是阻塞的。也就是等待就绪阶段不阻塞,但是读写操作阶段阻塞。

而在AIO(异步非阻塞io)里面,则更近一步:不但等待就绪是非阻塞的,就读写操作的过程也是异步的。

NIO所使用的模型是Reactor模型,而AIO所使用的是Proactor模型,以读为例,他们的具体过程如下:

在Reactor中实现读

  • 注册读就绪事件和相应的事件处理器。
  • 事件分发器等待事件。
  • 事件到来,激活分发器,分发器调用事件对应的处理器。
  • 事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。

在Proactor中实现读:

  • 处理器发起异步读操作(注意:操作系统必须支持异步IO)。在这种情况下,处理器无视IO就绪事件,它关注的是完成事件。
  • 事件分发器等待操作完成事件。
  • 在分发器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分发器读操作完成。
  • 事件分发器呼唤处理器。
  • 事件处理器处理用户自定义缓冲区中的数据,然后启动一个新的异步操作,并将控制权返回事件分发器。

概括一下:

Reactor模型等待的是一个”准备就绪的事件“的发生,然后事件分发器就会把事件转发给之前注册的处理器来执行具体的读写操作。

而Proactor模型,则是处理器直接发起一个异步读写操作(相当于请求),但是实际上真正的读写操作是由操作系统底层来完成的(可以理解成放在后台进行处理),发起请求的时候他会提供一个存放数据的地址,以及到底读取多少数据,以及完成之后的回调函数等信息

然后事件分发器等待这个请求由底层的操作系统来完成,完成之后通知对应的处理器该操作已完成,然后处理器对已经读取到指定缓冲区的数据进行处理。总的来说就是NIO中处理器关注的是IO就绪事件,而AIO处理器关注的则是完成事件。也就是最终回调处理器的时候,IO操作已经完成了。

 

参考:

https://tech.meituan.com/2016/11/04/nio.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值