Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1574|回复: 0
打印 上一主题 下一主题

BIO, NIO, AIO

[复制链接]

697

主题

1142

帖子

4086

积分

认证用户组

Rank: 5Rank: 5

积分
4086
跳转到指定楼层
楼主
发表于 2018-3-13 17:11:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
http://www.cnblogs.com/larryzeal/p/8463930.html
引子
[size=13.3333px]BIO: Blocking IO,阻塞式IO
[size=13.3333px]NIO: Non-blocking IO,非阻塞式IO
[size=13.3333px]AIO: Async IO,异步IO

问题
[size=13.3333px]什么是阻塞式IO/非阻塞式IO,什么又是同步IO/异步IO呢?

前提
[size=13.3333px]① IO实际上分为两大步:应用程序请求的IO操作、操作系统的IO操作 - 用户空间和内核空间(kernel)。用户空间的应用程序需要IO操作,实际上是调用的操作系统的IO操作。
[size=13.3333px]② kernel的IO操作是需要时间的 - 姑且叫它准备时间吧。

[size=13.3333px]那问题来了:在这个准备时间里,操作系统和应用程序都是如何工作的?

[size=13.3333px]以应用程序读取数据为例(这里不考虑缓存),操作系统其实有两类回复:
[size=13.3333px]① 等到需要的数据都准备完毕再回复 -- 中间一直默不作声,这就是同步IO。
[size=13.3333px]② 先告诉应用程序数据没有准备好,然后准备好数据,通知(回调)应用程序或被轮询 -- 这就是异步IO。

[size=13.3333px]那应用程序如何对待这个响应呢?其实还是两类:
[size=13.3333px]① 一直等,直接数据都发过来,然后再进行下一步。-- 阻塞IO。
[size=13.3333px]② 先干别的,然后定期查询或等待回调。-- 非阻塞IO。

小结
[size=13.3333px]阻塞/非阻塞IO 说的是应用程序的IO操作;同步/异步IO 说的是操作系统的IO操作。
[size=13.3333px]注意,异步、非阻塞,都有两个彼此对应的小分类。

略深入
[size=13.3333px]前面已经说过,操作系统的IO操作分为同步IO和异步IO。同步IO没什么好说的,我们就来看看异步IO。
[size=13.3333px]异步IO,其实是三个系统函数select、poll、epoll中的一个(跟Linux内核版本有关),搞C/C++编程的人应该熟悉这个。
[size=13.3333px]虽然select和poll的性能极高,但能处理的数量有限制,没记错的话是不能超过1000个,否则性能降低。
[size=13.3333px]epoll的性能略低(当然还是很高),但能处理的数量很高。
[size=13.3333px]这几年的Linux核心用的都是epoll,就是说新版本系统上 JDK NIO调用的是epoll。
[size=13.3333px]感兴趣的人可以查阅相关资料了解下。

[size=13.3333px]注意,这里说的操作系统都是指Linux。

优缺点
[size=13.3333px]查了一些资料,都是用网络编程为例来说明BIO、NIO、AIO的区别,这里就不再敲代码了,直接说说彼此的优缺点好了。
[size=13.3333px]BIO:优点是编码简单,容易上手、调试。缺点则是因为多线程本身的问题,①每个线程都要分配内存空间(最少128K),②线程的切换需要耗费时间。所以,一是线程数量有限;二是线程多了会严重降低响应时间。当然也可以使用线程池,但又涉及到队列任务积压问题。
[size=13.3333px]NIO:刚好跟BIO相反。优点是速度快,耗费资源少。缺点是编码复杂,难以上手、调试。
[size=13.3333px]AIO:这个暂时没研究,不过想想应该跟js的回调是一个道理。事件驱动(回调),性能高。

补充
[size=13.3333px]说到NIO,其实很少有直接使用JDK的NIO的,因为有严重bug,会导致Linux下select占用CPU 100%。虽说后续有改进,但也只是降低了几率,并没有彻底消除。
[size=13.3333px]所以建议使用Netty、Mina之类的框架,要好的多。

[size=13.3333px]另外,Tomcat,自版本7开始,使用的就是NIO技术,以提升服务性能。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-4-20 00:42 , Processed in 0.055744 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表