图解四种 IO 模型 轻松区分BIO、NIO 和 AIO 、SIGIO

操作系统:I/O控制方式的分类和各自的优缺点及适用场景 一、I/O控制方式的分类? 1.程序I/O控制方式 2.中断驱动I/O控制方式 3.直接存储器访问DMA控制方式 4.I/O通道控制方式 二、四种I/O控制方式的优缺点及适用场景 1.程序I/O控制方式 (1)优点 控制简单,不需要多硬件支持 (2)缺点 CPU利用率低 不能实现设备间的并行工作 无法发现和处理产生的错误 ... 阅读详情

前言

最近越来越认为,在讲解技术相关问题时,大白话固然很重要,通俗易懂,让人有想读下去的欲望。但几乎所有的事,都有两面性,在看到其带来好处时,不妨想想是否也引入了不好的地方。

例如在博客中,过于大白话的语言的确会让你阅读起来更加顺畅,也更容易理解。但这都是其他人理解,已经咀嚼过了的,人家是已经完全理解了,你从这些信息中大概可能会观察不到全貌。所以,适当的白话是很好的,但这个度得控制一下。

接下来切入正文。

相信大家经常看到这个问题:

BIO、NIO 和 AIO 有什么区别?

看到这个问题,可能你脑海中就会浮现以下这些字眼。比如 BIO 就是如果从内核获取数据会一直阻塞,直到数据准备完毕返回。再比如 NIO,内核在数据没有准备好时不会阻塞住,调用程序会一直询问内核数据是否 Ready。

虽然是正确的,字数也很少。但是这样一来,你看这些概念就不是理解,而是背诵了。其实 BIO 和 NIO 这类的名词还有一个共同的名字叫——IO模型,总共有:

由于信号驱动 IO 在实际中不常用,我们主要讲以下四种模型:

  1. 同步阻塞

  2. 同步非阻塞

  3. IO 多路复用

  4. 异步 IO

这里还是通过例子来理解这 4 种 IO 模型:

假设此时客户端正在发送一些数据到服务器,并且数据已经通过客户端的协议栈、网卡,陆陆续续的到达了服务器这边的内核态 Buffer 中了。

同步阻塞 BIO

我们需要知道,内核在处理数据的时候其实是分成了两个阶段:

  • 数据准备

  • 数据复制

在网络 IO 中,数据准备可能是客户端还有部分数据还没有发送、或者正在发送的途中,当前内核 Buffer 中的数据并不完整;而数据复制则是将内核态 Buffer 中的数据复制到用户态的 Buffer 中去。

当调用线程发起 read 系统调用时,如果此时内核数据还没有 Ready,调用线程会阻塞住,等待内核 Buffer 的数据。内核数据准备就绪之后,会将内核态 Buffer 的数据复制到用户态 Buffer 中,这个过程中调用线程仍然是阻塞的,直到数据复制完成,整个流程用图来表示就张这样:

同步非阻塞 NIO

相信大家知道 Java 中有个包叫 nio,但那跟我们现在正在讨论的 NIO 不是同一个概念。

现在正在讨论的是 Non-Blocking IO,代表同步非阻塞,是一种基础的 IO 模型。而 nio 包则是 New IO,里面的 IO 模型实际上是 IO多路复用,大家不要搞混淆了。

有了 BIO 的基础,这次我们直接来看图:

还是分为两个阶段来讨论。

数据准备阶段。此时用户线程发起 read 系统调用,此时内核会立即返回一个错误,告诉用户态数据还没有 Read,然后用户线程不停地发起请求,询问内核当前数据的状态。

数据复制阶段。此时用户线程还在不断的发起请求,但是当数据 Ready 之后,用户线程就会陷入阻塞,直到数据从内核态复制到用户态。

稍微总结一下,如果内核态的数据没有 Ready,用户线程不会阻塞;但是如果内核态数据 Ready 了,即使当前的 IO 模型是同步非阻塞,用户线程仍然会进入阻塞状态,直到数据复制完成,并不是绝对的非阻塞。

那 NIO 的好处是啥呢?显而易见,实时性好,内核态数据没有 Ready 会立即返回。但是事情的两面性就来了,频繁的轮询内核,会占用大量的 CPU 资源,降低效率。

IO 多路复用

IO 多路复用实际上就解决了 NIO 中的频繁轮询 CPU 的问题。在之前的 BIO 和 NIO 中只涉及到一种系统调用——read,在 IO 多路复用中要引入新的系统调用——select。

read 用于读取内核态 Buffer 中的数据,而 select 你可以理解成 MySQL 中的同名关键字,用于查询 IO 的就绪状态。

在 NIO 中,内核态数据没有 Ready 会导致用户线程不停的轮询,从而拉满 CPU。而在 IO 多路复用中调用了 select 之后,只要数据没有准备好,用户线程就会阻塞住,避免了频繁的轮询当前的 IO 状态,用图来表示的话是这样:

异步 AIO

该模型的实现就如其名,是异步的。用户线程发起 read 系统调用之后,无论内核 Buffer 数据是否 Ready,都不会阻塞,而是立即返回。

内核在收到请求之后,会开始准备数据,准备好了&复制完成之后会由内核发送一个 Signal 给用户线程,或者回调用户线程注册的接口进行通知。用户线程收到通知之后就可以去读取用户态 Buffer 的数据了。

由于这种实现方式,异步 IO 有时也被叫做信号驱动 IO。相信你也发现了,这种方式最重要的是需要 OS 的支持,如果 OS 不支持就直接完蛋。

Linux 系统在 2.6 版本的时候才引入了异步IO,不过那个时候并不算真正的异步 IO,因为内核并不支持,底层其实是通过 IO 多路复用实现的。而到了 Linux 5.1 时,才通过 io_uring 实现了真 AIO。

原文地址:https://www.cnblogs.com/detectiveHLH/p/15765528.html

如果你觉的本文对你有帮助,麻烦点赞关注支持一下

新凯来嵌入式面经及参考答案 利用编译器预定义宏判断目标架构,如。 阅读详情

相关推荐

零基础教程:用Python给试卷照片自动切题(有道OCR+PIL完整流程)

本文为零基础用户提供了一套完整的Python自动化切题方案。通过调用有道OCR API识别试卷照片中的题目坐标,并利用PIL库进行精准裁剪,将杂乱的试卷图片自动分割为独立的题目图像。教程详细涵盖了环境搭建、图像预处理、API调用、坐标解析与批量处理全流程,帮助教育工作者和技术爱好者高效处理大量试卷,实现工作流程自动化。

grpc6streamer的博客 1172

图解四种 IO 模型

最近越来越认为,在讲解技术相关问题时,大白话固然很重要,通俗易懂,让人有想读下去的欲望。但几乎所有的事,都有两面性,在看到其带来好处时,不妨想想是否也引入了不好的地方。 例如在博客中,过于大白话的语言的确会让你阅读起来更加顺畅,也更容易理解。但这都是其他人理解,已经咀嚼过了的,人家是已经完全理解了,你从这些信息中大概可能会观察不到全貌。所以,适当的白话是很好的,但这个度得控制一下。 接下来切入正文。 相信大家经常看到这个问题: BIO、NIO 和 AIO 有什么区别? 看到这个问题,可能你脑海

qigeminghao的博客 867

niushop靶场漏洞查找-文件上传漏洞等(超详细)

发现报错,而且这个报错十分熟悉,与我们所学的sqli报错注入特别像。这里查询到后面的url有且仅有一个,目测估计是后台。上传的图片是包含一句话木马的图片。发现获取到了webshell。实战漏洞-niushop。

qq_59020256的博客 1726

四种 I/O控制方式

https://www.jianshu.com/p/eb5b9c539c3e I/O控制方式 设备管理的主要任务之一是控制设备和内存或处理机之间的数据传送,外围设备和内存之间的输入/输出控制方式有四种,下面分别介绍。 1 程序直接控制方式 在早期的计算机中,由于无中断机构,处理机对I/O设备的控制采用程序直接控制方式,或称为忙-等待方式。 如图(a)所示,计算机从外部设备读取数据到存储器,每次读一个字的数据。对读入的每个字,CPU需要对外设状态进行循环检查,直到确定该字已经在I/O控制器的..

qq_34548229的博客 2万+

Linux 桌面虚拟化技术 KVM

Linux 桌面虚拟化技术 KVM

高飞的博客 36万+

cellchat安装

cellchat

m0_65188455的博客 5442

java高并发之NIO与NIO主力框架

NIO NIO是jdk1.4出现的新的流。 BIO-Blocking IO - 同步式阻塞式IO流----UDP/TCP NIO - New IO - 同步式非阻塞式IO流 AIO - AsynchronousIO - 异步式非阻塞式IO流 - jdk1.8 BIO的缺点 1.会产生阻塞行为:receive/accept/connect/read/write 2.一对一的连接:每连接一个客户端,再服务器端就要开启一个线程去处理请求,在客户端较多的情况下,服务端就会产生大量的线程,耗费内存。 3.连接建立之后

不满是向上的车轮 712

STM32双ADC同步采样实战:FFT测量相位差的5个关键细节

本文深入探讨了利用STM32双ADC同步采样结合FFT算法精确测量信号相位差的实战技巧。文章聚焦五个关键细节:确保ADC时钟同源、优化DMA缓冲区设计、信号调理与窗函数选择、精确的相位提取与解缠绕,以及系统误差校准与验证。这些细节是提升相位差测量精度、确保系统稳定性的核心,尤其强调了STM32配置中易被忽视的时钟同步问题。

oauth7security的博客 592

高并发编程系列之IO模型(二)--------NIO教程

NIO和NIO的区别 BIO NIO 面向的流的操作 面向缓冲区 阻塞IO 非阻塞IO(能立即返回) 无 选择器 NIO的三个重要核心 1、Channel(通道) Channel通道,可以使用它实现数据的读取和写入,通道是双向的,可以双向同时读写(流是单项的,BIO中要输入流、输出流),这充分的利用了操作系统的全双工的支持,从而实现更高效率的传输数据。 Channel的...

SUPERCHAT8的博客 326

车载 ECU 中的 Safety Linux 详解

车载 ECU 中的 Safety Linux 详解

天赐好车的博客 307

C#实现图片裁剪 (附完整源码)

C#实现图片裁剪 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 504

BIO、NIO、AIO理解

一些对BIO、NIO、AIO通信模型的总结

qq_56919740的博客 8815

RT-Thread littefs控制GD32F4xx片内Flash

GD32F4xx RT-Thread下使用littefs 控制片内flash 调试记录

madao1234的博客 995

java架构之路-(netty专题)初步认识BIO、NIO、AIO

  本次我们主要来说一下我们的IO阻塞模型,只是不多,但是一定要理解,对于后面理解netty很重要的 IO模型精讲   IO模型就是说用什么样的通道进行数据的发送和接收,Java共支持3种网络编程IO模式:BIO,NIO,AIO。 BIO   BIO(Blocking IO) 同步阻塞模型,一个客户端连接对应一个处理线程。也是我们熟悉的同步阻塞模型,先别管那个同步的概念,我们先来看一下什...

山有山的高度,海有海的胸怀。 320

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NIO面试题

摘自【https://mp.weixin.qq.com/s/YIcXaH7AWLJbPjnTUwnlyQ】 首先我们分别画图来看看,BIO、NIO、AIO,分别是什么? BIO:传统的网络通讯模型,就是BIO,同步阻塞IO 它其实就是服务端创建一个ServerSocket, 然后就是客户端用一个Socket去连接服务端的那个ServerSocket, ServerSocket接收到了一个的连接请求就创建一个Socket和一个线程去跟那个Socket进行通讯。 接着客户端和服务端就进...

红目香薰 1499

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

一文说清楚NIO和AIO+图文解说+Java代码演示

NIO是New I/O的简称,与旧式的基于流的I/O方法相对,从名字看,它表示新的一套Java I/O标准。NIO是基于块(Block)的,它以块为基本单位处理数据为所有的原始类型提供(Buffer)缓存支持增加通道(Channel)对象,作为新的原始 I/O 抽象支持锁和内存映射文件的文件访问接口提供了基于Selector的异步网络I/O。

怀揣梦想,一颗执着于技术的心从未磨灭,内心住着一颗顽强的小强时刻提醒自己层层突破自我,同时也成就他人 1903

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

简单理解NIO、BIO、AIO模型

保证你轻松看懂BIO、NIO、AIO

weixin_45875621的博客 1387

浅谈BIO、NIO、AIO

Java共支持3种网络编程模型/IO模式:BIO、NIO、AIO。 Java BIO :同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。 Java NIO :同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连...

weixin_44777693的博客 356

BIO、NIO、AIO通信机制理解

阻塞、非阻塞(相对数据而言): 概念:程序等待调用结果时的状态。进程访问数据的时候,数据是否就绪的一种处理状态。 解释:涉及到CPU线程调度;所谓阻塞,就是调用结果返回之前,该执行线程会被挂起,不释放CPU执行权,线程不能做其它事情,只能等待,只有等到调用结果返回了,才能接着往下执行;所谓非阻塞,就是在没有获取调用结果时,不是一直等待。 同步、异步: 概念:消息的通知机制 解释:涉及到IO...

JinXYan的博客 803

BIO、NIO、AIO的简单理解

BIO、NIO、AIO的简单理解

于小浩的博客 668

BIO、NIO、AIO三种IO模型的理解

本文将对三种IO模型做简单的介绍和总结。 1、BIO模型 我们都知道,在做Java网络编程时,服务端的accept方法和read是阻塞的,直到有新连接进来或有数据可以读取,在阻塞期间线程不能干别的事情,这就是传统的BIO(blocking-io,同步阻塞IO)模型,显而易见,BIO模型在高并发场景下会面临服务端线程数过多浪费系统资源和频繁上下文切换问题。 BIO模型图如下: 2、NIO NIO,no blocking-io,或new io,是同步非阻塞IO。 这里介绍一下什么是同步,什么是阻塞: 同步指

学无止境! 2624

NIO深入剖析

第四章 JAVA NIO深入剖析 在讲解利用NIO实现通信架构之前,我们需要先来了解一下NIO的基本特点和使用。 4.1 Java NIO 基本介绍 Java NIO(New IO)也有人称之为 java non-blocking IO是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。NIO可以理解为非阻塞IO,传

weixin_46633487的博客 1646

8分钟深入浅出搞懂BIO、NIO、AIO

传统的IO流都是阻塞式的。JavaNIO是非阻塞式的。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。因为Channel是全双工的,所以它比流更好地映射底层操作系统的API,特别是在UNIX网络编程中,底层操作系统的通道都是全双工的,同时支持读和写。在弄清楚上面的几个问题之前,我们首先得明白什么是同步,异步,阻塞,非阻塞,只有这几个单个概念理解清楚了,然后在组合理解起来,就相对比较容易了。

the shy 1759

BIO、NIO 和 AIO 这三者的区别?

BIO、NIO 和 AIO 这三者的区别?

liuruiaaa的博客 1966

从理论到实践:深度解读BIO、NIO、AIO的优缺点及使用场景

BIO适合连接数目较少且固定的架构,NIO适合连接数目多,但是并发读写操作相对较少的场景,AIO则适合连接数目多,且并发读写操作也多的场景。可以发现,AIO和NIO的使用方式基本一致,数据都是从Channel读入Buffer,或者从Buffer写入Channel中,不同的是AIO是实现了异步非阻塞。), 通过上面代码和运行结果可以发现,在服务端和客户端进行通信时,我们并没有新建线程类进行通信,这也是NIO和BIO最大的区别之一。NIO适合一些复杂的、高频的、长连接的通信场景,例如聊天室、网络游戏等。

weixin_45131680的博客 1752

BIO、NIO 和 AIO 的区别?

BIO:简单、直观,适用于小规模并发应用。NIO:通过多路复用提高并发能力,适用于中等规模并发的网络应用。AIO:完全异步,适用于高性能、高吞吐量的分布式系统,但需要较高的编程复杂度和对操作系统的支持。

宋发元 1594
上一篇: 为什么大家都用Spring Cloud ,作为一套微服务治理的框架它凭什么这么牛?
下一篇: 通过 Java Timer/TimerTask 源码原理解析告诉你如何实现定时任务
Java架构师小森
博客等级 码龄5年 23粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值