BIO、NIO、AIO三者的区别及其应用场景(结合生活例子,简单易懂)
再解释三者之前我们需要先了解几个概念:

- 阻塞、非阻塞:是相较于线程来说的,如果是阻塞则线程无法往下执行,不阻塞,则线程可以继续往下 执行。
- 同步、异步:是相较于IO来说的,同步需要等待IO操作完毕后再往下执行,异步等待IO执行完毕后被通知去操作数据就好了。
此时我们将这四个概念组合起来就是BIO、NIO和AIO了。
1、BIO(Blocking I/O):
BIO是同步阻塞模型,他再进行IO操作时需要进行等待,等待IO操作完成才能继续往下执行,再没有数据可读时,它会阻塞再这里,不继续往下执行,直到有数据可读。这样的模型时很浪费资源的。 而且这种同步阻塞模式下,一个线程只能监测一个socket端口,因为如果检测两个socket,一个因为第一个socket迟迟没有可读操作,一直阻塞着,则第二个socket即便有可读操作也无法进行读取,因为线程没有执行到那里。两个就如此麻烦,跟不用说更多socket了。所以再这种情况下需要创建很多线程。
例如,当我们去散步,路过早餐店买早点,但包子还要一会儿才能熟,我们要在这一直等,等到熟了买好了才能继续散步,而不是先去散步,等散步回来后路过再买。这个等待时间也是成本。
适用场景:
BIO模型适用于简单的I/O操作,特别是在单线程环境下。由于BIO模型使用阻塞式I/O操作,它在处理少量并发连接时可能会比较简单和直观。因此,对于一些简单的网络服务或小型应用程序来说,BIO模型可能是一个合适的选择。
2、NIO(Non-blocking I/O):
NIO是同步非阻塞模型,这个模型通过使用多路复用器将进行分离,由一个选择器(select)大量的文件描述符(一个文件描述符代表着一个socket,因为再linux中万物皆文件),当有事件发生时,选择器会接收到消息并将这些有事件发生的管道返回给应用程序进行处理。当然选择器返回给应用程序的是哪些管道有事件发生,并没有进行操作,所以读取这些操作还得有自己进行读取,再这里就是同步。并不进行阻塞,因为通过选择器将监测和读取进行了分离,使这个模型不再阻塞。
这就相当于早餐店老板充当选择器,当我想买包子时虽然还没好,但我会告诉老板我想要买包子,等包子好了和我说,当包子好了时,老板会打电话告诉所有预约包子事件的人(比如我),包子好了,快来拿。此时我就需要自己回去取包子吃。
适用场景:
NIO模型适用于需要处理大量并发连接的场景。由于NIO模型使用非阻塞式I/O操作和事件驱动的方式,它能够更高效地处理大量的并发连接,适合于构建高性能的网络服务或服务器应用程序。
3、AIO(Asynchronous I/O):
AIO是异步非阻塞模型,它允许应用程序在发起I/O操作后继续执行其他任务,例如再NIO中他不需要自己去等待,而是待有事件发生时再去读取,而AIO则可以做到连读取都不需要自己读取,而是系统内核帮忙把数据都读取好了,自己再过去处理数据就好了。
相当于当包子熟了后不是自己过去取包子,而是包子店老板把包子打包好送到你面前吃就好了。
适用场景:
AIO模型适用于需要处理大量I/O操作且每个操作耗时较长的场景,比如数据库访问、磁盘读写、网络数据传输等。由于AIO模型使用异步I/O操作,它能够在等待I/O操作完成时执行其他任务,提高了系统的并发性能和资源利用率。
4、总结:
再前面我并没有说异步阻塞,因为我觉得这两者的组合并没有什么用,好像也没有具体实现的模型,所有我并没有说它。
总的来说,选择合适的I/O模型需要考虑到应用程序的需求、系统的特性以及预期的并发连接数量和I/O操作类型。不同的场景可能需要选择不同的I/O模型来获得最佳的性能和效率。
ps:在Java中,AIO模型的实现是通过NIO.2来实现的。NIO.2提供了对AIO模型的支持,使得开发者可以更方便地使用异步I/O操作来构建高性能的应用程序。
相关文章:
BIO、NIO、AIO三者的区别及其应用场景(结合生活例子,简单易懂)
再解释三者之前我们需要先了解几个概念: 阻塞、非阻塞:是相较于线程来说的,如果是阻塞则线程无法往下执行,不阻塞,则线程可以继续往下 执行。同步、异步:是相较于IO来说的,同步需要等待IO操作完…...
深度学习YOLO图像视频足球和人体检测 - python opencv 计算机竞赛
文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov5算法5 数据集6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习YOLO图像视频足球和人体检测 该项目较为新颖,适合作为竞赛课题方向,学长非…...
系列七、JVM的内存结构【堆(Heap)】
一、概述 一个JVM实例只存在一个堆内存,堆内存的大小是可以手动调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为三个部分,即…...
什么是Selenium?如何使用Selenium进行自动化测试?
什么是 Selenium? Selenium 是一种开源工具,用于在 Web 浏览器上执行自动化测试(使用任何 Web 浏览器进行 Web 应用程序测试)。 等等,先别激动,让我再次重申一下,Selenium 仅可以测试Web应用…...
【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I)
目录 A、求全是字母的最小十六进制数 B、Excel表格组合 C、求满足条件的日期 D、 取数字 - 二分 (1)暴力 (2)二分 E、最大连通块 - bfs F、哪一天? G、信号覆盖 - bfs (1)bfs…...
【数据结构】手撕双向链表
目录 前言 1. 双向链表 带头双向循环链表的结构 2. 链表的实现 2.1 初始化 2.2 尾插 2.3 尾删 2.4 头插 2.5 头删 2.6 在pos位置之前插入 2.7 删除pos位置 3.双向链表完整源码 List.h List.c 前言 在上一期中我们介绍了单链表,也做了一些练习题&…...
性能测试 —— Jmeter接口处理不低于200次/秒-场景
需求:期望某个接口系统的处理能力不低于200次/秒,如何设计? ①这个场景是看服务器对某个接口的TPS值是否能大于等于200,就可以了; ②系统处理能力:说的就是我们性能测试中的TPS; ③只要设计一…...
Qt中使用QNetworkAccessManager类发送https请求时状态码返回0
前言 在项目开发中,碰到一个问题,使用QNetworkAccessManager类对象发送https请求时,状态码一直返回0,抓包分析看请求响应也是正常的。费了好大劲终于搞定了,主要是两个原因导致的。 原因一:未设置支持SSL…...
Linux - 物理内存管理 - memmap
说明 裁减内核预留内存占用,在启动log中,发现memmap占用了大块内存(446个pages)。 On node 0 totalpages: 32576 memblock_alloc_try_nid: 1835008 bytes align0x40 nid0 from0x0000000000000000 max_addr0x0000000000000000 al…...
Python爬虫动态ip代理防止被封的方法
目录 前言 一、什么是动态IP代理? 二、如何获取代理IP? 1. 付费代理IP 2. 免费代理IP 3. 自建代理IP池 三、如何使用代理IP爬取数据? 1. 使用requests库设置代理IP 2. 使用urllib库设置代理IP 3. 使用selenium库设置代理IP 四、常…...
01Urllib
1.什么是互联网爬虫? 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据 解释1:通过一个程序,根据Url(http://www.…...
python爬取酷我音乐 根据歌名进行爬取
# _*_ coding:utf-8 _*_ # 开发工具:PyCharm # 公众号:小宇教程import urllib.parse from urllib.request import urlopen import json import time import sys import osdef Time_1...
【深度学习】吴恩达课程笔记(五)——超参数调试、batch norm、Softmax 回归
笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【吴恩达课程笔记专栏】 【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础 【深度学习】吴恩达课程笔记(二)——浅层神经网络、深层神经网络 【深度学习】吴恩达课程笔记(三)——参数VS超参数、深度…...
腾讯云轻量级服务器和云服务器什么区别?轻量服务器是干什么用的
随着互联网的迅速发展,服务器成为了许多人必备的工具。然而,面对众多的服务器选择,我们常常会陷入纠结之中。在这篇文章中,我们将探讨轻量服务器和标准云服务器的区别,帮助您选择最适合自己需求的服务器。 腾讯云双十…...
解决:虚拟机远程连接失败
问题 使用FinalShell远程连接虚拟机的时候连接不上 发现 虚拟机用的VMware,Linux发行版是CentOs 7,发现在虚拟机中使用ping www.baidu.com是成功的,但是使用FinalShell远程连接不上虚拟机,本地网络也ping不通虚拟机,…...
SpringBoot项目集成发邮件功能
1:引入依赖2:配置设置3:授权码获取:4:核心代码5:postman模拟验证6:安全注意 1:引入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>c…...
【Spring篇】使用注解进行开发
🎊专栏【Spring】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 🥰欢迎并且感谢大家指出小吉的问题 文章目录 🌺原代码(无注解)🎄加上注解⭐两个注…...
Flink(六)【DataFrame 转换算子(下)】
前言 今天学习剩下的转换算子:分区、分流、合流。 每天出来自学是一件孤独又充实的事情,希望多年以后回望自己的大学生活,不会因为自己的懒惰与懈怠而悔恨。 回答之所以起到了作用,原因是他们自己很努力。 …...
【2023春李宏毅机器学习】生成式学习的两种策略
文章目录 1 各个击破2 一步到位3 两种策略的对比 生成式学习的两种策略:各个击破、一步到位 对于文本生成:把每一个生成的元素称为token,中文当中token指的是字,英文中的token指的是word piece。比如对于unbreakable,他…...
Android13 adb 无法连接?
Android13 adb 无法连接? 文章目录 Android13 adb 无法连接?一、前言二、替换adbGoogle 官网对adb的介绍:Google 提供的adb tools的下载: 三、总结1、adb connect 连接后显示offline2、输入adb devices 报错:版本不匹配导致3、adb常用命令4…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
