BIO NIO AIO

一  高性能IO模型

      注意:这里所谓的BIO NIO AIO和JAVA中的BIO NIO AIO 不是一回事

         1. 同步IO、异步IO、阻塞IO、非阻塞IO

             通过IO模型介绍异步、同步、阻塞、非阻塞的IO看,本节参考文章:

             https://www.cnblogs.com/euphie/p/6376508.html

                    这里统一使用Linux下的系统调用recv作为例子,它用于从套接字上接收一个消息,因为是一个系统调用,所以

            调用时会从用户进程空间切换到内核空间运行一段时间再切换回来。默认情况下recv会等到网络数据到达并且复制到

            用户进程空间或者发生错误时返回,而第4个参数flags可以让它马上返回。

           (1)阻塞IO模型

                           使用recv的默认参数一直等数据直到拷贝到用户空间,这段时间内进程始终阻塞。A同学用杯子装水,打开

                    水龙头装满水然后离开。这一过程就可以看成是使用了阻塞IO模型,因为如果水龙头没有水,他也要等到有水

                    并装满杯子才能离开去做别的事情。很显然,这种IO模型是同步的。

                  

           (2)非阻塞IO模型

                           改变flags,让recv不管有没有获取到数据都返回,如果没有数据那么一段时间后再调用recv看看,如此循

                    环。B同学也用杯子装水,打开水龙头后发现没有水,它离开了,过一会他又拿着杯子来看看……在中间离开的

                    这些时间里,B同学离开了装水现场(回到用户进程空间),可以做他自己的事情。这就是非阻塞IO模型。但是它

                    只有是检查无数据的时候是非阻塞的,在数据到达的时候依然要等待复制数据到用户空间(等着水将水杯装满),

                    因此它还是同步IO。

                

           (3)IO复用模型

                           这里在调用recv前先调用select或者poll,这2个系统调用都可以在内核准备好数据(网络数据到达内核)时告

                    知用户进程,这个时候再调用recv一定是有数据的。因此这一过程中它是阻塞于select或poll,而没有阻塞于

                    recv,有人将非阻塞IO定义成在读写操作时没有阻塞于系统调用的IO操作(不包括数据从内核复制到用户空间时

                    的阻塞,因为这相对于网络IO来说确实很短暂),如果按这样理解,这种IO模型也能称之为非阻塞IO模型,但是

                    按POSIX来看,它也是同步IO,那么也和楼上一样称之为同步非阻塞IO吧。这种IO模型比较特别,分个段。因

                    为它能同时监听多个文件描述符(fd)。这个时候C同学来装水,发现有一排水龙头,舍管阿姨告诉他这些水龙头

                    都还没有水,等有水了告诉他。于是等啊等(select调用中),过了一会阿姨告诉他有水了,但不知道是哪个水龙

                    头有水,自己看吧。于是C同学一个个打开,往杯子里装水(recv)。这里再顺便说说鼎鼎大名的epoll(高性能的代

                    名词啊),epoll也属于IO复用模型,主要区别在于舍管阿姨会告诉C同学哪几个水龙头有水了,不需要一个个打

                    开看(当然还有其它区别)。

               

           (4)信号驱动IO模型

                           通过调用sigaction注册信号函数,等内核数据准备好的时候系统中断当前程序,执行信号函数(在这里面调

                    用recv)。D同学让舍管阿姨等有水的时候通知他(注册信号函数),没多久D同学得知有水了,跑去装水。是不是

                    很像异步IO?很遗憾,它还是同步IO(省不了装水的时间啊)。

                   

           (5)异步IO模型

                           调用aio_read,让内核等数据准备好,并且复制到用户进程空间后执行事先指定好的函数。E同学让舍管阿

                    姨将杯子装满水后通知他。整个过程E同学都可以做别的事情(没有recv),这才是真正的异步IO。

                 

         2. 常见的IO模型

           (1)同步阻塞IO(BIO)

                           同步阻塞IO模型是最简单的IO模型,用户线程在内核进行IO操作时被阻塞。

                      

                           如图所示,用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。内核等到数据包到达后,

                   然后将接收的数据拷贝到用户空间,完成read操作。

                   伪代码描述:

                   {
                     read(socket, buffer);
                     process(buffer);
                   }

                           即用户需要等待read将socket中的数据读取到buffer后,才继续处理接收的数据。整个IO请求的过程中,用

                   户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够。

            (2)同步非阻塞

                            同步非阻塞IO是在同步阻塞IO的基础上,将socket设置为NONBLOCK。这样做用户线程可以在发起IO请求

                     后可以立即返回。

                         

                            如图所示,由于socket是非阻塞的方式,因此用户线程发起IO请求时立即返回。但并未读取到任何数据,用

                     户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。用户线程使用同步非阻塞IO模

                     型的伪代码描述为:

                        {
while(read(socket, buffer) != SUCCESS)); process(buffer); }

                            即用户需要不断地调用read,尝试读取socket中的数据,直到读取成功后,才继续处理接收的数据。整个IO

                    请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请

                    求,消耗了大量的CPU的资源。一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。

             (3)IO多路复用

                             IO多路复用模型是建立在内核提供的多路分离函数select、poll、epoll(这个比较好)基础之上的,使用

                      select函数可以避免同步非阻塞IO模型中轮询等待的问题。

                           

                             

                             如图所示,用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数

                      据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。从流程上来看,

                      使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数

                      的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请

                      求。用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理

                      多个IO请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。

                       {
                         select(socket);
                         while(1) {
                            sockets = select();
                            for(socket in sockets) {
if(can_read(socket)) { read(socket, buffer); process(buffer); } } } }

                             其中while循环前将socket添加到select监视中,然后在while内一直调用select获取被激活的socket,一旦

                      socket可读,便调用read函数将socket中的数据读取出来。

                             然而,使用select函数的优点并不仅限于此。虽然上述方式允许单线程内处理多个IO请求,但是每个IO请

                     求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。如果用户线程只注册

                     自己感兴趣的socket或者IO请求,然后去做自己的事情,等到数据到来时再进行处理,则可以提高CPU的利用

                     率。

         3. Linux下的5种IO模型

             本节参考文章:https://blog.youkuaiyun.com/houjixin/article/details/27662489

           (1)阻塞IO模型

                           阻塞IO模型中,以数据接收为例,进程调用recvfrom系统调用向内核请求读取数据,其内部过程将如下图

                    所示

                    

                    由图可以看到用户进程从发起recvfrom系统调用开始后的两个阶段都被阻塞。

           (2)非阻塞IO模型

                           以读取数据为例,非阻塞模型中,进程需要先把socket设置为非阻塞模式,这样内核在准备数据时就不会

                   阻塞该系统调用,而是直接返回EWOULDBLOCK,在读取操作时,用户进程一样是调用recvfrom向内核请求数

                   据,其内部过程如下图所示:

                   

                   由上图可以看到非阻塞模式中,在数据准备阶段,系统调用不会被阻塞,但是在数据复制阶段也会被阻塞;因

                   此这里所说的阻塞是指数据准备阶段是否被阻塞,而不是数据拷贝阶段。

           (3)IO复用模型

                           IO复用模型中,进程可以让内核监控多个描述符的就绪状态,一般使用的接口函数为select或者poll,内核

                    通过select查询到所监控的描述符中有就绪(就绪是下图中的数据准备完成)的,则把就绪的描述符返回给调

                    用进程,进程再调用recvfrom实际读取数据,其内部过程大致如下图所示:

                   

                   由上图可以看出,在IO复用模型中,用户进程先调用select或者poll查看是否有数据就绪,如果有数据就绪再调

                   用recvfrom去读取数据,系统在阶段1和阶段2都将会被阻塞,但是阻塞于不同的系统调用(阶段1阻塞于select

                   或者poll,阶段2阻塞于recvfrom)。

           (4)信号驱动IO模型

                           信号驱动IO模型是让内核在描述符就绪时发送SIGIO信号通知用户进程。在使用信号驱动模型进行IO操作

                    时,首先要打开socket使用信号驱动IO的能力;然后调用sigaction系统调用设置信号SIGIO的处理函数,

                    sigaction系统调用不会被阻塞。这样就可以在信号处理函数中读取数据了,其处理过程如下图所示:

                   

                  由上图可以看出,信号驱动模型只要设置好信号处理函数后就可以进行其他操作了,当有数据到来时内核将会

                  通知进程进行处理;与非阻塞IO模型相比,信号驱动IO模型不需要在准备数据时轮询是否准备好。

           (4)异步IO模型

                           异步IO模型中,用户进程发起读取调用之后会立即返回,待内核接收到数据并将数据拷贝到用户进程空

                    间之后,再通知用户进程,其过程如下图所示:

                

            五种IO模型进行比较:

                   

转载于:https://www.cnblogs.com/jialanshun/p/10628371.html

相关推荐

ADS 使用教程(十八)Encrypting Designs using RFIP Encoder in ADS

在这一节,我们使用RFIP Encoder进行设计加密,这是一种保护知识产权和敏感设计数据的重要方法。RFIP Encoder提供了一种安全的方式来加密设计文件,确保只有授权人员能够访问和使用这些文件。

Dirge19的博客 1169

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

Opencv学习-仿射变换与透视变换(几何变换)1

• 一、定义 变换是指对图像进行拉伸、收缩、扭曲和旋转等几何操作。对于平面区域有两种方式的几何转换:一种是基于23矩阵进行的变换,被称为仿射变换;一种是基于33矩阵进行的变换,被称为透视变换。也可被称为平面变换和空间变换。因为仿射变换需要找到3个映射点,三点确定一个平面。而透视变换需要确定四个映射点,四点确定一个三维空间。 • 二、Opencv中的函数定义 由于Opencv中都已封装好函数,变换的...

勉強 583

BIO、NIO、AIO理解

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

qq_56919740的博客 8815

NXP S32K5 MCU如何赋能Zonal架构与软件定义汽车?

汽车电子架构正从分布式ECU向域集中、再向Zonal分区架构演进,核心驱动力在于线束简化、算力下沉与软件分层解耦。区域控制器作为物理区域的“调度员”,需要同时满足实时响应、功能安全、多网络协议转换和OTA升级等要求,这使MCU与SoC的选型成为系统工程的关键决策。MCU凭借确定性的微秒级启动、低功耗、丰富的IO控制以及成熟的ASIL-D认证路径,仍是区域控制器的主流选择。NXP S32K5正是面向这一场景发布的系列MCU:它集成多核锁步、CAN-XL、TSN以太网、硬件安全模块与双Bank Flash,补齐

weixin_28721917的博客 356

<202505高项>《【VIP合集】 软考高项(第四版)十大知识域、五大过程组、ITTO输入输出工具、项目绩效域》

软考高项(第四版)十大知识域、五大过程组、ITTO输入输出工具、项目绩效域

Else 的博客 1854

BIO与NIO、AIO的区别

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的...

IT界的一只菜鸟 1858

Openbmc系列之自动化测试框架1

Openbmc作为当下BMC固件领域最流行的开源软件,具备从需求计划、开发、调试、测试、版本管理等完整的体系。在测试领域,Openbmc基于python的robotframework框架,实现Openbmc的自动化测试,为高效发布Openbmc版本提供有力支持。本文作为测试系列文档一,介绍Openbmc自动化测试虚拟Openbmc的环境搭建。

qq_20341747的博客 2109

BIO、NIO、AIO详解

Java NIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可,这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。

song_myth的博客 1356

(南京观海微电子)——TCON介绍

TCON又称:逻辑板,控制板,在液晶电视里的作用和CRT中的视放板相当,但有本质的区别,逻辑板不是一个纯粹的信号放大器,它输入是LVDS格式信号,而不是RGB。逻辑板的作用是把数字板送来的LVDS或TTL图像数据信号,时钟信号进行处理移位寄存器存储将图像数据信号,时钟信号转换成屏能够识别的控制信号行列信号RSDS控制屏内的MOSFET管工作而控制液晶分子的扭曲度。目前国内主要的TCON板生产商有视显光电。传统TCON的布局主要分为以下两种:X+C分离式和X+C一体式。

m0_75095200的博客 3834

UNet改进(52):轴向+代理注意力让UNet既轻快又精准

本文提出了一种改进的UNet架构,通过引入轴向注意力代理模块增强医学图像分割性能。该模块将二维自注意力分解为行列两个一维注意力操作,结合可学习代理节点进行全局信息聚合,在保持计算效率的同时提升模型对长距离依赖的建模能力。实验表明,该方法在多个医学图像数据集上较传统UNet提升3.2%-5.7%的Dice系数,边界质量显著改善。该方案特别适用于具有方向性结构的医学图像分割任务,如血管、器官等,在计算复杂度和分割精度之间实现了良好平衡。

2501_91516851的博客 327

AIO,BIO,NIO详解

一、基本概念 IO:阻塞IO BIO:同步阻塞IO。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器需要启动一个线程进行处理,如果这个链接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 NIO:同步非阻塞IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。用户进程也需要时不时的询...

不务正业随手记 6737

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)

关于使用TileMap生成随机2D地图,其实之前已经有做过类似的,感兴趣可以看看 但是随着学习深入,发现之前做的比较粗糙和不够全面,最近又在外网看到

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2215

BIO,NIO,AIO区别

BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。 在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。 同步与异步 同步:同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。 异步:异步就是发起一个调用后,立刻得到被调..

Meiko记录 2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java面试常考的 BIO,NIO,AIO 总结

文章转载自:JavaGuide 目录: 1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 1.4 总结 2. NIO (New I/O) 2.1 NIO 简介 2.2 NIO的特性/NIO与IO区别 1)Non-block...

小树的博客 13万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

BIO、NIO、AIO 有什么区别?

BIO、NIO、AIO 有什么区别? BIO:线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成。 NIO:线程发起IO请求,立即返回;内核在做好IO操作的准备之后,通过调用注册的回调函数通知线程做IO操作,线程开始阻塞,直到操作完成。 AIO:线程发起IO请求,立即返回;内存做好IO操作的准备之后,做IO操作,直到操作完成或者失败,通过调用注册的回调...

ConstXiong 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

BIO,NIO,AIO的区别

BIO,NIO和AIO是Java网络编程的三种模型 BIO:同步并阻塞,服务实现模式为一个连接对应一个线程,即客户端发送一个连接,服务端要有一个线程来处理。如果连接多了,线程数量不够,就只能等待,即会发生阻塞。 NIO:同步非阻塞,服务实现模式是一个线程可以处理多个连接,即客户端发送的连接都会注册到多路复用器上,然后进行轮询连接,有I/O请求就处理 AIO:异步非阻塞,引入了异步通道,采用的是proactor模式,特点是:有效的请求才启动线程,先有操作系统完成在通知服务端 应用场景: BIO:

qxy_1218的博客 1万+

BIO、NIO、AIO的区别

NIO(New I/O 或 Non-blocking I/O):使用非阻塞 I/O 模型,线程在等待 I/O 时可执行其他任务,通过 Selector 监控多个 Channel 上的事件,提高性能和可伸缩性,适用于高并发场景。异步非阻塞 I/O 模型:这种模式下,我们的工作模式是先来到厨房,开始烧水,我们不一直坐在水壶前面等,也不隔一段时间去看一下,而是在客厅看电视,水壶上面有个开关,水烧开之后他会通知我。IO,常写作 I/O,是 Input/Output 的简称,即输入/输出。最后,关闭文件通道。

wswpomos的博客 3735

详解Java中的BIO、NIO、AIO

IO流是Java中比较难理解的一个知识点,但是IO流在实际的开发场景中经常会使用到,比如Dubbo底层就是NIO进行通讯

Java鱼仔的博客 4274

bio nio aio区别_8分钟深入浅出搞懂BIO、NIO、AIO

在高性能的IO体系设计中,BIO、NIO、AIO的概念,常常会让我们感到困惑不解。在Java面试中,我们也经常会被问到这个问题。譬如:BIO、NIO、AIO 的概念同步/异步、阻塞/非阻塞的区别NIO 如何实现多路复用功能AIO、BIO、NIO的适用场景NIO的核心概念、应用和框架等等这块内容本身比较复杂,很难用三言两语说明白,而书上的定义不太容易理解。本篇内容按照我的理解,以尽可能简单、易懂的语...

weixin_34501666的博客 8264

NIO BIO AIO

三种IO的区别BIO(Blocking I/O) :同步阻塞I/O模式 一个人只去厨房烧水且坐等烧水成功NIO(New I/O):同步非阻塞模式 一个人只去厨房烧水且不定期来查看(轮询)AIO (Asynchronous I/O):异步非阻塞 I/O 模型 一个人只去厨房烧水且去看电视且烧水成功之后有提醒// 使用 BIO 写入文件try {​bufferedWriter.write("学编程就上技术派");​System.out.println("写入完成");

xjd444的博客 1463

BIO、NIO与AIO

I/O 模型:就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收,很大程度上决定了程序通信的性能,Java 共支持 3 种网络编程的/IO 模型:**BIO、NIO、AIO** 1 每当接收到一个Socket连接就会创建一个新的线程,线程的竞争以及上下文切换会影响性能;2 每个线程都会占用栈空间和CPU资源;3 并不是每个socket都进行IO操作,无意义的线程处理(即使客户端没有消息,服务端的线程也会阻塞等待);

weixin_42828342的博客 1718

BIO和NIO、AIO的区别

特点BIO(阻塞 I/O)NIO(非阻塞 I/O)AIO(异步 I/O)操作方式同步阻塞同步非阻塞异步非阻塞线程模型每连接一个线程少量线程处理大量连接极少量线程处理大量连接编程难度简单中等高系统资源消耗高适中低适用场景小规模并发场景高并发场景极高并发和长连接场景优点简单易用非阻塞、高并发真正异步、性能高缺点线程数目多,性能差编程复杂实现复杂,跨平台支持不一。

Flying_Fish_roe的博客 1221

还不懂BIO,NIO,AIO吗

Channel(通道)、Buffer (缓存区)、Selector(选择器) Channel 类似于流,但是它是一个双向的流,他是连接服务端和客户端的通道,不管是客户端还是服务端,都可以使用通道进行读写数据。在NIO模型中,服务端可以开启一个线程处理多个连接,它是非阻塞的,客户端发送的数据都会注册到多路复用器selector上面,当selector (selector的select方法是阻塞的)轮询到有读、写或者连接请求时,才会转发到后端程序进行处理,没有数据的时候,业务程序并不需要阻塞等待。

qq_62097431的博客 1545
上一篇: 亿级流量网站架构核心技术笔记
下一篇: TPS QPS
anshuo7139
博客等级 码龄10年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值