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

news/2025/9/20 21:34:20/文章来源:https://www.cnblogs.com/lxjshuju/p/19102885

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.mzph.cn/news/908559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu系统使用gcc和Makefile编译C程序

一.用Ubuntu系统编写hello world程序并编译运行 1.用vim命令编写hello world程序代码

构造选记

CF1815B Sum Graph 考虑肯定要把图建成一个特殊形态,考虑链。指定x分别为\(n+1,n+2\)即可做到,这个时候链的实际形态已经确定下来(这里预处理出来链的实现没有想到)。有了链查询n-1次与\(p_1\)的距离,最长的肯定是…

0133_解释器模式(Interpreter)

解释器模式(Interpreter) 意图 给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 UML 图优点易于扩展文法:由于使用类来表示语言的文法规则,可以通过继承来扩展文…

trick杂记 例题

会把一些不太有分类的trick放在这里,弄得好乱啊! 其实感觉大部分算不上trick,就是一些思考的方向)组合数学。一些决策对总贡献没有影响,可以先钦定它们,在该局面下考虑对总贡献有影响的决策。CF2092E She knows.…

代码随想录算法训练营第四天 | leetcode 24

两两交换链表中的节点 注意:交换两个节点的步骤,采用虚拟节点会更加方便,每次交换的步骤是相同的所以可以使用递归做出来(二刷再做吧),然后就是注意指针是否为空,普通做法时可以将保存交换节点的下一个接地点,…

网络流 最小割、费用流

网络流 最小割、费用流 割 网络流中的割被定义为一种点集的划分方式,源点 \(s\in S\) ,汇点 \(t\in T\) 割 \((S,T)\) 的容量为 \(c(S,T)\) 表示所有从 \(S\) 到 \(T\) 的边的容量之和 最小割问题就是求一个割 \((S,…

DP tricks

乱记随机做到的dptricks 交换状态与答案 适用场景:状态大但是答案小AT_dp_e Knapsack 2 CF176D Hyper String AT_agc033_d [AGC033D] Complexity用map存 写出明显存不了的状态的柿子之后 发现只有比较少的几个会有更新…

碎碎念(十七)

awa听风听雨,留云留意 还在怀念过去吗? 那个清晨一起抓住了温柔的风, 那个午后一起接住了淅沥的雨, 那个黄昏一起数清了着火的云, 那个夜晚一起点亮了暗淡的星。那么现在呢? 只能祈祷吹过相同的风, 只能独自撑起…

OpenCV的一些API的使用

本文章会陆续记录一些OpenCV的API方法

AdMergeX与小川科技最右App合作案例入选中国信通院“高质量数字化转型典型案例集” - 实践

AdMergeX与小川科技最右App合作案例入选中国信通院“高质量数字化转型典型案例集” - 实践2025-09-20 21:19 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !importan…

在 macOS 上准备 CentOS 7.5 离线迁移文件的完整指南

在 macOS 上准备 CentOS 7.5 离线迁移文件的完整指南本地使用的是 macOS,但目标机器是 CentOS 7.5,我们需要特别小心地准备兼容的安装包。以下是详细步骤: 准备工作:在 macOS 上设置环境 1. 创建工作目录 mkdir -p…

2971:抓住那头牛

题目 总时间限制: 2000ms 内存限制: 65536kB 描述 农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式: 1、从X移动…

高效测试的第一步:5个用例设计基础思维模型

测试之路,思维先行。掌握这些基础思维模型,让你在测试领域走得更远更稳。欢迎分享你的测试设计经验和心得!在软件开发领域,测试是确保产品质量的关键环节。而对于测试工作来说,测试用例设计无疑是核心中的核心。一…

MFC Button 控件完全指南:从基础到进阶 - 指南

MFC Button 控件完全指南:从基础到进阶 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

Python笔记总结

python简练记录1 Python语言概述 1.1 走进Python 1.1.1 Python简史 一种解释型的、面向对象的、带有动态语义的高级程序设计语言。 使用Python作为语言的名字,因为Guido是英国幽默剧团 Monty Python飞行马戏团的fans。…

vulnhub靶机:GoldenEye-v1

扫描挖掘本地的IP地址信息: nmap -sT 192.168.111.101发现开放了25,80端口 访问http://192.168.111.101:80提示可以访问/sev-home/ ,访问后让我们输入账号密码,查看页面原代码 访问/terminal.js提示账号Boris,Nata…

8465:马走日

题目 总时间限制: 1000ms 内存限制: 65536kB 描述 马在中国象棋以日字形规则移动。 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上…

性能调优之NUMA调优

什么是NUMA NUMA(Non-Uniform Memory Access,非统一内存访问)是一种用于多处理器系统的内存设计架构。在NUMA系统中,每个处理器(或一组处理器)拥有自己的本地内存,处理器访问本地内存的速度比访问其他处理器的内…

深入解析:SpringMVC静态资源与Servlet容器指南

深入解析:SpringMVC静态资源与Servlet容器指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

CCPC Online 2025 游寄

CCPC Online 2025 游寄 赛时 随机 roll 题,先 roll 到 \(K\) 然后没看懂,又 roll 到 \(E\) 谁家好人上来就把两道签到题就 roll 完了() 和队友讨论了一下 \(E\),发现很简单,队友推了个式子过了 回头一看,发现自…