概念解释

Java 中的 BIO、NIO 和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。

  • BIO属于同步阻塞IO,(Blocking I/O)
  • NIO属于同步非阻塞IO,(Non-blocking IO)
  • AIO属于异步非阻塞IO,(Asynchronous I/O)

1. BIO

BIO是典型的一请求一应答通信模型,也叫做每连接每线程。socket的三个函数socket.accept()、socket.read()、socket.write()都是同步阻塞的,当一个连接在处理I/O的时候,系统是阻塞的,处理完一个I/O才能处理另一个I/O。因为进程阻塞时是不占用CPU的,如果是单线程的话,CPU必然存在很多空闲,会使得系统效率很低。

这时候,为了充分利用空闲的CPU,并且可以同时处理多个I/O请求,可以使用多线程。但是多线程也会带来新的问题:

  • 大量的线程创建和销毁,会消耗CPU资源
  • 无限制地创建线程,当并发量大时,会耗尽服务器的资源,可能导致服务其宕机或崩溃

为此,可以使用线程池来进行优化。现在的多线程一般都使用线程池,可以让线程的创建和回收成本相对较低。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的I/O并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。

但是,即使使用了线程池,此模型还是严重依赖于线程,但是线程是很宝贵的资源,主要体现在

  • 线程的创建和销毁成本很高,在Linux这样的操作系统中,线程本质上就是一个进程。创建和销毁都是重量级的系统函数。
  • 线程本身占用较大内存,像Java的线程栈,一般至少分配512K~1M的空间,如果系统中的线程数过千,恐怕整个JVM的内存都会被吃掉一半。
  • 线程的切换成本是很高的。操作系统发生线程切换的时候,需要保留线程的上下文,然后执行系统调用。如果线程数过高,可能执行线程切换的时间甚至会大于线程执行的时间,这时候带来的表现往往是系统load偏高、CPU sy使用率特别高(超过20%以上),导致系统几乎陷入不可用的状态。

线程池+任务队列实现+阻塞I/O可以实现一种叫做伪异步的I/O通信框架,它的模型图如下图所示。

将客户端的 Socket 封装成一个Task(该任务实现java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK 的线程池维护一个任务队列和 N 个活跃线程,对任务队列中的任务进行处理。由于线程池可以设置任务队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。

伪异步I/O通信框架采用了线程池实现,因此避免了为每个请求都创建一个独立线程造成的线程资源耗尽问题。不过因为它的底层任然是同步阻塞的BIO模型,因此无法从根本上解决问题。是想线程池设置的最大线程数是1000,当活跃连接数不是很高时候,还可以轻松应付;但是当活跃连接数达到十万甚至百万,你这1000个线程全部上阵,也无济于事呀,最后导致的大量用户请求超时,用户们悻悻而退。用户体验可想而知,造成的直接经济损失以及口碑损失可想而知。所以,对于低负载、低并发的应用程序,可以使用BIO来提升开发速率、更易于维护。对于高负载、高并发的网络应用,BIO是无能为力的。

2. NIO

NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel,Selector,Buffer等对象。NIO是基于I/O多路复用实现的,使用一个或者很少的线程就能处理大量的客户端连接请求。

NIO的缺点是类库及API繁杂,编程难度大;Java的NIO是基于epoll实现的,存在一个广为诟病的epoll bug,它会导致Selector空轮询,最终导致CPU100%。项目庞大之后,自行实现的 NIO 很容易出现各类 bug,因此大家不愿意使用Java原生的NIO类库进行开发。Netty是业界最流行的NIO框架之一。

3. AIO

AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2.0,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。具体可以去了解五种IO模型中的异步I/O模型。

4.对比总结

参考文献

Java面试常考的 BIO,NIO,AIO 总结

Java NIO浅析

面试常问:BIO,NIO,AIO相关推荐

  1. 【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

  2. Java常见面试题:BIO,NIO,AIO 有什么区别?

    Java 中 IO 流分为几种? 按功能来分:输入流(input).输出流(output). 按类型来分:字节流和字符流. 字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流 ...

  3. Netty序章之BIO NIO AIO演变

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

  4. 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章

    来源:编程新说 网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTT ...

  5. Java IO(BIO, NIO, AIO) 总结

    文章转载自:JavaGuide 目录 BIO,NIO,AIO 总结 同步与异步 阻塞和非阻塞 1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 ...

  6. cpu 被挂起和阻塞_迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章...

    网上有很多讲同步/异步/阻塞/非阻塞/BIO/NIO/AIO的文章,但是都没有达到我的心里预期,于是自己写一篇出来. 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HTTP接口拿到详情数 ...

  7. java面试常问问题及答案,附源代码

    找大厂面试题,看套路!Java面试题及答案及面试解析请阅读严宏博士的Java模式或设计模式解释中的桥梁模式). 封装:一般认为封装是将数据和操作数据的方法绑定起来,数据的访问只能通过定义的界面进行.面 ...

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

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

  9. IO: BIO ? NIO ? AIO?

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  10. 内核aio_今天来说说令人让人傻傻分不清的BIO,NIO,AIO

    | 作者:新一. | 简书:https://www.jianshu.com/u/b3263fc54bce | 知乎:https://www.zhihu.com/people/qing-ni-chi-y ...

最新文章

  1. 类和对象—对象特性—const修饰成员函数
  2. C++11 unique_ptr用法
  3. java lang保_java.lang.Object的受保护方法如何保护子类?
  4. mysql 36条军规_mysql开发36条军规(转)
  5. Android开发杂谈更新中
  6. 学计算机好轻松,猎证全国计算机等级考试学习系统
  7. Java中Xml文件的解析
  8. 汽车CAN总线关闭故障的诊断与恢复
  9. 计算机专业英语pdf词汇百度盘,计算机专业英语词汇词.pdf
  10. TeX Live 2021 从卸载到安装指南
  11. Adobe Acrobat 如何批量删除PDF文件最后一页或倒数第二页?
  12. filebeat报错:Harvester could not be started on exist file
  13. 上取整与下取整的解析
  14. Mgo统计查询及显示附加字段
  15. editplus里python技巧_editplus调试python
  16. flutter-布局学习
  17. 《Collaborative Memory Network for Recommendation Systems》推荐系统之协同记忆网络CMN
  18. skpaint matchcharacter 不能显示英文_微信新增6个搞笑小表情!翻白眼,666,裂开,让我看看…英文都咋说?...
  19. 多媒体技术融合了计算机,多媒体技术和计算机技术的融合开辟了多学科图形和2296以下图形的新领域...
  20. IPM 鸟瞰图公式转换与推导

热门文章

  1. SQL数据查询语句(一)
  2. 关于testNG和JUnit的对比
  3. Leetcode(二):Add Two Numbers
  4. Java数据结构——二叉树
  5. 转载:详解C中volatile关键字
  6. 比较简单搞定S60的签名
  7. 2008年最新CCNA第二学期第十单元题目(2008-12-14 14:34:59)
  8. VssPlus1.1-微软VSS增强工具
  9. python----运行机制
  10. 在做简单网页时,遇到的一些js问题