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

引子

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技术,以提升服务性能。

假期小结 BIO, NIO, AIO的更多相关文章

  1. Netty5序章之BIO NIO AIO演变

    Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...

  2. 【netty】(1)---BIO NIO AIO演变

    BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用的技术. Net ...

  3. Netty序章之BIO NIO AIO演变

    Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...

  4. Java提供了哪些IO方式?IO, BIO, NIO, AIO是什么?

    IO一直是软件开发中的核心部分之一,而随着互联网技术的提高,IO的重要性也越来越重.纵观开发界,能够巧妙运用IO,不但对于公司,而且对于开发人员都非常的重要.Java的IO机制也是一直在不断的完善,以 ...

  5. (转)也谈BIO | NIO | AIO (Java版)

    原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...

  6. 拿搬东西来解释udp tcpip bio nio aio aio异步

     [群主]雷欧纳德简单理解 tcpip是有通信确认的面对面通信   有打招呼的过程  有建立通道的过程 有保持通道的确认    有具体传输udp是看到对面的人好像在对面等你 就往对面扔东西[群主]雷欧 ...

  7. 也谈BIO | NIO | AIO (Java版--转)

    关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  8. IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)

    有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...

  9. I/O模型系列之三:IO通信模型BIO NIO AIO

    一.传统的BIO 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请 ...

随机推荐

  1. Luogu2586 [ZJOI2008]杀蚂蚁 ---- 模拟

    Luogu2586 [ZJOI2008]杀蚂蚁 题意 还是一道大模拟 https://www.luogu.org/problemnew/show/P2586 大概就是炮塔大蚂蚁的故事 下载这个游戏ht ...

  2. 图解 Java 内存模型

    图解 Java 内存模型 (图片来自于:http://www.cnblogs.com/zhangs1986/p/7903722.html)

  3. 8.10 正睿暑期集训营 Day7

    目录 2018.8.10 正睿暑期集训营 Day7 总结 A 花园(思路) B 归来(Tarjan 拓扑) C 机场(凸函数 点分治) 考试代码 A B C 2018.8.10 正睿暑期集训营 Day ...

  4. python-memcached包使用方法

    本文转载自:http://my.oschina.net/flynewton/blog/10660 将memcached.pyc拷贝到工作目录 #!/usr/bin/env python import ...

  5. python:爬虫入门

    直接上代码吧: 一.爬取某外卖平台的指定商家菜品信息 from urllib import request import json import random url = "https:// ...

  6. [Python] 糗事百科文本数据的抓取

    [Python] 糗事百科文本数据的抓取 源码 https://github.com/YouXianMing/QiuShiBaiKeText import sqlite3 import time im ...

  7. Java全栈程序员之02:Ubuntu下Java环境安装、配置、测试

    在上文讲完之后,我们手里的ubuntu只能算是一个上网机,什么也干不了,本篇我们将折腾它为开发机. 这里,我们这里假定你对linux体系是初级选手,所以本篇会讲的啰嗦一点,高手就出门左转吧. 1.安装 ...

  8. ASP.NET Core -中间件(Middleware)使用

    ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...

  9. Spark2.2+ES6.4.2(三十一):Spark下生成测试数据,并在Spark环境下使用BulkProcessor将测试数据入库到ES

    Spark下生成2000w测试数据(每条记录150列) 使用spark生成大量数据过程中遇到问题,如果sc.parallelize(fukeData, 64);的记录数特别大比如500w,1000w时 ...

  10. Spring Cloud Netflix Eureka源码导读与原理分析

    Spring Cloud Netflix技术栈中,Eureka作为服务注册中心对整个微服务架构起着最核心的整合作用,因此对Eureka还是有很大的必要进行深入研究. 本文主要分为四部分,一是对项目构建 ...