博客
关于我
netty 基础理解之 BIO,NIO,AIO 总结
阅读量:208 次
发布时间:2019-02-28

本文共 1486 字,大约阅读时间需要 4 分钟。

BIO、NIO、AIO 总结

Java 中的 BIO、NIO 和 AIO 是 Java 语言对操作系统不同 IO 模型的封装。程序员在使用这些 API 时,无需深入了解操作系统层面的细节,也无需为不同操作系统编写不同的代码。只需使用 Java 的 API 就可以实现对应的功能。

在讨论 BIO、NIO 和 AIO 之前,先来回顾一下同步与异步、阻塞与非阻塞的概念。

同步与异步

  • 同步:发起一个调用后,被调用者在处理完请求之前,调用才会返回。等待完成才能继续下一步操作。
  • 异步:发起一个调用后,立刻得到被调用者的回应(表示已接收到请求),但结果尚未返回。此时可以处理其他任务,被调用者通过事件或回调机制通知结果。

同步和异步的区别主要在于,异步中调用者不需要等待处理结果,结果由事件或回调机知晓。

阻塞与非阻塞

  • 阻塞:发起一个请求后,当前线程等待结果返回,无法执行其他任务,直到条件就绪。
  • 非阻塞:发起一个请求后,当前线程可以继续执行其他任务,等待结果返回通过回调或事件机制。

同步阻塞、同步非阻塞和异步非阻塞的含义可以通过生活中的例子来理解:烧开水的过程从同步阻塞到同步非阻塞再到异步非阻塞。

BIO (Blocking I/O)

BIO 是同步阻塞 I/O 模型。传统 BIO 通信模型中,服务端需要一个独立的 Acceptor 线程监听客户端连接,接收到连接后,为每个客户端创建一个新的线程处理链路。这种模型通过线程池实现伪异步 I/O,但线程的创建和销毁成本高,难以应对高并发访问量。

伪异步 IO

为了解决 BIO 中线程资源耗尽的问题,伪异步 IO 使用线程池和任务队列。客户端接入后,创建一个 Task 投递到线程池中处理。线程池维护消息队列和活跃线程,资源占用可控,但仍无法从根本解决问题。

代码示例

BIO 服务端代码示例显示,传统 BIO 需要多个线程处理多个客户端连接,而伪异同步程使用线程池优化资源分配。

BIO 的优缺点

BIO 在低负载、低并发场景下表现优异,开发简单易懂。但在高并发场景下线程资源耗尽,性能差。

NIO (New I/O)

NIO 是 Java 1.4 引入的同步非阻塞 I/O 模型,基于 java.nio 包的 Channel、Selector 和 Buffer 组件。

NIO 的特性

  • 非阻塞 I/O:NIO 流是非阻塞的,可以在读取或写入数据时立即返回。
  • 面向缓冲区:所有 IO 操作都通过缓冲区完成。
  • 通道:双向的,读写都通过 Buffer。
  • 选择器:用于处理多个通道,减少线程切换成本。

NIO 的优势

NIO 提供了更高效的资源管理,适合高负载、高并发场景。但 JDK 原生 NIO 存在 epoll 实现中的空轮询问题,维护复杂度高。

NIO 的代码示例

NIO 服务端代码示例显示,选择器用于轮询多个通道,减少线程数,提高效率。

NIO 的优缺点

NIO 在高并发场景下性能优于 BIO,但底层实现复杂,维护困难。

AIO (Asynchronous I/O)

AIO 是 NIO 2 的改进版,Java 7 引入的异步非阻塞 I/O 模型。基于事件驱动,操作后立即返回,等待操作完成后通过回调处理结果。

AIO 的主要特点是异步 IO,适合高并发场景,但学习曲线陡峭,适合复杂的异步编程需求。

总结

BIO、NIO 和 AIO 分别适用于不同场景:

  • BIO:适合低负载、低并发。
  • NIO:适合高负载、复杂场景。
  • AIO:适合高并发、对异步要求高的场景。

选择时需根据具体需求权衡性能、开发复杂度和资源消耗。

转载地址:http://hwln.baihongyu.com/

你可能感兴趣的文章
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>