zoukankan      html  css  js  c++  java
  • 假期小结 BIO, NIO, AIO

    虽然忙碌,但仍小有收获,开心。

    引子

    BIO: Blocking IO,阻塞式IO

    NIO: Non-blocking IO,非阻塞式IO

    AIO: Async IO,异步IO

    问题

    什么是阻塞式IO/非阻塞式IO,什么又是同步IO/异步IO呢?

    前提

    ① IO实际上分为两大步:应用程序请求的IO操作、操作系统的IO操作 - 用户空间和内核空间(kernel)。用户空间的应用程序需要IO操作,实际上是调用的操作系统的IO操作。

    ② kernel的IO操作是需要时间的 - 姑且叫它准备时间吧。

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

    以应用程序读取数据为例(这里不考虑缓存),操作系统其实有两类回复:

    ① 等到需要的数据都准备完毕再回复 -- 中间一直默不作声,这就是同步IO。

    ② 先告诉应用程序数据没有准备好,然后准备好数据,通知(回调)应用程序或被轮询 -- 这就是异步IO。

    那应用程序如何对待这个响应呢?其实还是两类:

    ① 一直等,直接数据都发过来,然后再进行下一步。-- 阻塞IO。

    ② 先干别的,然后定期查询或等待回调。-- 非阻塞IO。

    小结

    阻塞/非阻塞IO 说的是应用程序的IO操作;同步/异步IO 说的是操作系统的IO操作。

    注意,异步、非阻塞,都有两个彼此对应的小分类。

    略深入

    前面已经说过,操作系统的IO操作分为同步IO和异步IO。同步IO没什么好说的,我们就来看看异步IO。

    异步IO,其实是三个系统函数select、poll、epoll中的一个(跟Linux内核版本有关),搞C/C++编程的人应该熟悉这个。

    虽然select和poll的性能极高,但能处理的数量有限制,没记错的话是不能超过1000个,否则性能降低。

    epoll的性能略低(当然还是很高),但能处理的数量很高。

    这几年的Linux核心用的都是epoll,就是说新版本系统上 JDK NIO调用的是epoll。

    感兴趣的人可以查阅相关资料了解下。

    注意,这里说的操作系统都是指Linux。

    优缺点

    查了一些资料,都是用网络编程为例来说明BIO、NIO、AIO的区别,这里就不再敲代码了,直接说说彼此的优缺点好了。

    BIO:优点是编码简单,容易上手、调试。缺点则是因为多线程本身的问题,①每个线程都要分配内存空间(最少128K),②线程的切换需要耗费时间。所以,一是线程数量有限;二是线程多了会严重降低响应时间。当然也可以使用线程池,但又涉及到队列任务积压问题。

    NIO:刚好跟BIO相反。优点是速度快,耗费资源少。缺点是编码复杂,难以上手、调试。

    AIO:这个暂时没研究,不过想想应该跟js的回调是一个道理。事件驱动(回调),性能高。

    补充

    说到NIO,其实很少有直接使用JDK的NIO的,因为有严重bug,会导致Linux下select占用CPU 100%。虽说后续有改进,但也只是降低了几率,并没有彻底消除。

    所以建议使用Netty、Mina之类的框架,要好的多。

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

  • 相关阅读:
    poj3278 Catch That Cow
    poj2251 Dungeon Master
    poj1321 棋盘问题
    poj3083 Children of the Candy Cor
    jvm基础知识—垃圾回收机制
    jvm基础知识1
    java面试基础必备
    java soket通信总结 bio nio aio的区别和总结
    java scoket aIO 通信
    java scoket Blocking 阻塞IO socket通信四
  • 原文地址:https://www.cnblogs.com/larryzeal/p/8463930.html
Copyright © 2011-2022 走看看