当前位置: 首页 > news >正文

详细介绍:阻塞 IO为什么叫BIO,非阻塞IO为什么叫NIO,异步IO为什么叫AIO

IO

程序与外部设备之间进行传输,通过IO的核心可能分为,就是IO的核心就是数据传输,也就

文件IO和网络IO

文件IO交互的对象就是本地存储设备,比方说读写本地文件。

网络IO交互的对象就是网络设备,核心的应用场景就是网络通信。

按照操作方式来进行划分:同步IO和异步IO

同步IO核心逻辑是指调用者发起IO请求之后必须等待IO操作完全完毕,才能继续执行,缺点就是效率低,应用场景大部分便捷业务。

异步IO调用者发起IO请求后,无需等待,直接返回,IO完成后内核通知告知调用者和。缺点就是逻辑复杂,应该进行通知处理,应用在高并发场景。

按照内核是否拷贝素材分:阻塞IO和非阻塞IO。

阻塞IO核心逻辑是发起请求之后内核若材料未准备好,会让调用者阻塞,直到内容准备好并完成拷贝,才会叫醒调用者。

非阻塞IO否准备好就是:核心逻辑是调用者发起请求后,内核信息未准备好,会立即返回未就绪状态,调用者应该通过轮询进行反复的查找,确认数据

经典IO模型

1. BIO - Blocking I/O (阻塞 I/O)

  • 为什么叫“BIO”?
    因为它代表 Blocking I/O。在 Java 1.4 之前,只有一套原始的 I/O API(java.io 包,如 InputStream, OutputStream, ServerSocket, Socket)。这套 API 的核心特征就是 阻塞

  • “阻塞”体现在哪里?
    当线程调用 read()accept() 等方法时,线程会被挂起,直到数据准备好或连接建立成功。在此期间,这个线程什么也干不了,就像被“阻塞”住了一样。

  • 设计模式
    通常采用 “一个连接一个线程”的模型。当并发连接数很高时,需要创建大量线程,而线程上下文切换的开销巨大,会耗尽系统资源。

结论:BIO 是以其最核心的特征——Blocking(阻塞)——来命名的。


2. NIO - New I/O / Non-blocking I/O (新的 I/O / 非阻塞 I/O)

  • 为什么叫“NIO”?
    这个名字有双重含义

    1. 字面意思:New I/O。因为在 Java 1.4 中,它是一套全新的 I/O API(java.nio 包),旨在解决 BIO 的性能瓶颈。

    2. 核心特性:Non-blocking I/O。这是这套新 API 最引人注目的特性之一。它提供了非阻塞的工作模式。

  • “非阻塞”体现在哪里?
    线程可以向通道(Channel)发起一个读请求,如果当时没有材料可用,线程不会被挂起,而是立刻得到一个返回结果(比如返回 0),然后这个线程许可马上去处理其他通道的请求。

  • 核心机制
    它的非阻塞能力是建立在I/O 多路复用 机制之上的(通过 Selector 实现)。一个线程可以轮询多个通道(Channel),看哪些已经就绪,然后只对那些就绪的通道进行实际的 I/O 操作。这才是它能够用少量线程处理大量连接的关键。

结论:NIO 的名字既代表了它是“新”的 API,也强调了其“非阻塞”的核心特性。


3. AIO - Asynchronous I/O (异步 I/O)

  • 为什么叫“AIO”?
    因为它代表 Asynchronous I/O。这是在 Java 7 中引入的,更加强大和彻底的异步 I/O 模型。

  • “异步”体现在哪里?
    它与“非阻塞”有本质区别:

    • NIO (Non-blocking): 是 同步的。你需要不断地主动去问(轮询)数据好了没有,接着自己去拷贝数据。

    • AIO (Asynchronous): 是 真正异步的。你只需要发起一个 I/O 操作(如 read),并提供一个回调函数。当内核完成所有工作(包括信息准备和从内核空间拷贝到用户空间)后,会主动通知你,并调用你提供的回调函数。

    整个过程,应用程序线程完全不需要参与,可以继续执行其他逻辑。

  • 实现
    在 Java 中,AIO 的相关类在 java.nio.channels 包下,主要以 AsynchronousSocketChannel, AsynchronousServerSocketChannelCompletionHandler 为核心。

结论:AIO 的名字准确地描述了其“异步”的本质特征,即“你叫我,我来做,做好了回调告诉你”。

缩写全称中文核心特征模型比喻
BIOBlocking I/O阻塞式 I/O调用会阻塞线程同步阻塞同步排队:在餐厅点餐后,必须站在柜台前傻等,直到餐做好。
NIONew I/ONon-blocking I/O新的 I/O非阻塞 I/O调用不会阻塞线程同步非阻塞(I/O多路复用)异步排队:点餐后拿个号,你行去玩手机,但需要不时抬头看屏幕是否叫到你的号,然后自己去取
AIOAsynchronous I/O异步 I/O由环境搞定后回调异步非阻塞外卖手机下单后就不用管了,外卖小哥会直接送到你手上,并通知你。

“BIO 和 NIO 的命名主要源于 Java API 的演进。BIO 代表Blocking I/O,强调了其阻塞的特性。NIO 既是New I/O(一套新的 API),也代表了Non-blocking I/O(其核心特性之一)。而 AIO 则明确代表了Asynchronous I/O,即异步 I/O 模型,这是从它们最根本的行为特征来命名的。”

http://www.hskmm.com/?act=detail&tid=11060

相关文章:

  • Ubuntu系统使用gcc和Makefile编译C程序
  • 构造选记
  • 0133_解释器模式(Interpreter)
  • trick杂记 例题
  • 代码随想录算法训练营第四天 | leetcode 24
  • 网络流 最小割、费用流
  • DP tricks
  • 碎碎念(十七)
  • OpenCV的一些API的使用
  • 2971:抓住那头牛
  • 高效测试的第一步:5个用例设计基础思维模型
  • MFC Button 控件完全指南:从基础到进阶 - 指南
  • Python笔记总结
  • vulnhub靶机:GoldenEye-v1
  • 8465:马走日
  • 性能调优之NUMA调优
  • 深入解析:SpringMVC静态资源与Servlet容器指南
  • CCPC Online 2025 游寄
  • CentOS 7 容器时遇到了 yum update 报错
  • MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
  • 基于MATLAB的视频动态目标跟踪检测搭建方案
  • U522155 数据生成(小心电脑)
  • 实用指南:OSG中osgFX库
  • 如何将带有线网卡和无线网卡的台式机作为网关/路由器
  • 2025.9.20——1橙
  • 日期
  • 【GAN网络解惑】面向产品的优化:推理裁剪、蒸馏、INT8/FP8 量化,GAN 的真实延迟如何打下来? - 教程
  • 资本与资本主义
  • 202509_NBWS_encoded_csv
  • 滑雪