BIO,NIO,AIO

2018-05-21  本文已影响0人  lionel880

都说生产碰到的问题会印象深刻,由于web应用部署使用了公司内部框架,需要进行参数优化,对此进行了一番了解

BIO,NIO,AIO参考资料:
十分钟了解BIO,NIO,AIO(http://loveshisong.cn/%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF/2016-06-25-%E5%8D%81%E5%88%86%E9%92%9F%E4%BA%86%E8%A7%A3BIO-NIO-AIO.html

之前看很多资料,都混淆了一些技术点,
理解了之后觉得特别重要的有:

select: 注册事件由数组管理, 数组是有长度的, 32位机上限1024, 64位机上限2048. 轮询查找时需要遍历数组.
poll: 把select的数组采用链表实现, 因此没了最大数量的限制
epoll方式: 基于事件回调机制, 回调时直接通知进程, 无须使用某种方式来查看状态.

这三者其实都是实现多路复用的方式

image.png

多路复用IO的特点是用户进程能同时等待多个IO请求, 系统来监控IO状态, 其中的任意一个进入读就绪状态, select函数就可以返回.

*AIO
前面讲的都是同步方法,至少第二阶段是同步的,只有AIO才是异步方法
AIO即Asynchronous I/O(异步 I/O), 这是Java 1.7引入的NIO 2.0中用到的. 整个过程中, 用户线程发起一个系统调用之后无须等待, 可以处理别的事情. 由操作系统等待接收内容, 接收后把数据拷贝到用户进程中, 最后通知用户程序已经可以使用数据了, 两个阶段都是非阻塞的. AIO整个过程如下图:


image.png

AIO属于异步模型, 用户线程可以同时处理别的事情, 我们怎么进一步加工处理结果呢? Java在这个模型中提供了两种方法:
一种是基于”回调”, 我们可以实现CompletionHandler接口, 在调用时把回调函数传递给对应的API即可
另一种是返回一个Future. 处理完别的事情, 可以通过isDone()可查看是否已经准备好数据, 通过get()方法等待返回数据.

上一篇 下一篇

猜你喜欢

热点阅读