首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当boost::aio的实现是基于epoll(同步)时,为什么它是异步的?

当boost::aio的实现是基于epoll(同步)时,它之所以被称为异步,是因为它采用了异步的编程模型和机制。

在传统的同步I/O模型中,当应用程序发起一个I/O操作时,它会被阻塞,直到操作完成才能继续执行后续的代码。这种同步模型在处理大量并发的I/O请求时效率较低,因为每个I/O操作都需要等待操作完成才能进行下一个操作。

而在异步I/O模型中,应用程序发起一个I/O操作后,不需要等待操作完成,而是继续执行后续的代码。当操作完成后,操作系统会通知应用程序,应用程序再去处理已完成的操作结果。这种异步模型可以提高系统的并发性能和响应速度。

boost::aio是基于epoll的实现,它利用了epoll的事件驱动机制和回调函数来实现异步I/O。当应用程序发起一个I/O操作时,boost::aio会注册一个事件监听器,并指定一个回调函数。当操作完成时,epoll会通知boost::aio,boost::aio再调用相应的回调函数来处理已完成的操作结果。

通过这种方式,boost::aio实现了异步的I/O操作。它可以同时处理多个I/O请求,而不需要等待每个操作的完成。这样可以提高系统的并发性能和响应速度。

推荐的腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

整天背诵五种IO模型epoll区别,换个马甲确不认识了!

厉害呀 问题1:什么是AI0 一片空白 我 同步异步 阻赛和非阻赛 5个模型,没听说过呢! 我回答:reactor模型。...到了第二幅,第三图 对epoll同步异步定义模糊。...应用上区别 第二关 区别: 可以看出 Proactor 和 Reactor 区别: 1)Reactor 是在事件发生就通知事先注册事件(读写在应用程序线程中处理完成); 2)Proactor 是在事件发生基于异步...网络编程模式,区别在于 Reactor 模式是基于「待完成」 I/O 事件,而 Proactor 模式则是基于「已完成」 I/O 事件。.../ Chapter 63: Alternative I/O models 从源码剖析Go语言基于信号抢占式调度 【没看懂】 How do you use AIO and epoll together in

1.2K11

到底什么是Java AIO为什么Netty会移除AOI?一文搞懂AIO本质!

2)Java AIO又称为NIO 2.0,难道它也是基于NIO来实现? 3)Netty为什么会舍去了AIO支持?(点此查看); 4)AIO看起来貌似只是解决了有无,实际是发布了个寂寞?...Java IO也是一样,需要有个参考系,才能定义它是同步还是异步。...按上述定义: 1)显然BIO只能是同步,调用in.read()当前线程阻塞,有数据返回时候,接收到数据还是原来线程; 2)而NIO也称之为同步,原因也是如此,调用channel.read(),线程虽然不会阻塞...2)紧接着Thread-5又发起了clientChannel.read调用,也添加了个CompletionHandler监听回调,收到数据,是Thread-1执行了readcompleted回调方法...函数返回,会唤醒阻塞线程,执行所谓回调函数。 对于这个结论理解,要先引入几个概念。 7.2系统调用与函数调用 函数调用:找到某个函数,并执行函数里相关命令。

33720
  • Java IO: BIO, NIO, AIO

    NIO基于Selector,socket有流可读或可写入socket,操作系统会相应通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。...与NIO不同,进行读写操作,只须直接调用APIread或write方法即可。...这两种方法均为异步,对于读操作而言,有流可读取,操作系统会将可读流传入read方法缓冲区,并通知应用程序;对于写操作而言,操作系统将write方法传递流写入完毕,操作系统主动通知应用程序...而AIO,在windows上是通过IOCP实现,在linux上还是通过epoll来实现。...在linux上,AIO现是通过epoll来完成,看JDK源码,可以发现,实现源码是: UnixAsynchronousSocketChannelImpl 看实现接口: implements Port.PollableChannel

    67040

    Netty支持哪些IO模式?

    1 经典I/O模式 BIO (阻塞I/O) JDK1.4前 NIO (非阻塞 I/O) JDK1.4 (2002 年,java.nio 包) AIO异步 I/O) JDK1.7 (2011 年)...阻塞 没有数据传过来时,读会阻塞直到有数据;缓冲区满,写操作也会阻塞 非阻塞 直接返回 同步异步 数据就绪后,数据操作谁完成?...需要自己去读是同步 数据就绪直接读好再回调给程序是异步 2 Netty 对三种 IO 支持变迁 划线已不再支持了哦! ? 为什么废除阻塞I/0 (BIO/OIO) ?...连接数高情况下:阻塞 -> 耗资源、效率低。 阻塞意味着等待,等待就会一直占用该线程,连接数高,大多线程又在等待,就会耗尽系统线程资源。 为什么删掉已经做好AIO支持?...通用NIO实现(Common)在Linux下也是epoll,但Netty依旧选择自己实现,因为更好: Netty提供更多可控参数: JDKNIO默认实现是水平触发 Netty 是边缘触发(默认)和水平触发

    55620

    番外:同步异步阻塞非阻塞,了解一下?(十三节)

    也就是说select\poll\epoll也是同步,而在Linux下只有AIO(PHP中扩展叫做EIO)是异步。...真是见了鬼了,Nginx事件是基于epoll实现,但是大家一直对TA印象就是[ 异步非阻塞 ];Swoole事件也是基于epoll实现,也称[ 异步非阻塞 ],结果到这里你跟我说[ IO复用 ]是同步...既然在Linux下Nginx事件是基于epoll实现,然而上面又说了epoll这样IO复用属于同步,那这里为什么会说[ 异步 ]非阻塞?...因为它形容是Nginx整体事件处理流程,而不单单是说对epoll调用,明白了吧。或者可以这么理解,Nginx对请求上层逻辑流程是异步,底层现是同步。 那么真正意义上异步是什么?...但实际上截止到目前为止,由于老李见识比较短浅,至今未发现Linux平台下基于AIO做出比较重量级应用,而且数量比较少见,更多还是基于IO复用。

    69031

    Netty支持三种IO模式

    1 经典I/O模式 BIO (阻塞I/O) JDK1.4前 NIO (非阻塞 I/O) JDK1.4 (2002 年,java.nio 包) AIO异步 I/O) JDK1.7 (2011 年) 1.2...阻塞:没有数据传过来时,读会阻塞直到有数据;缓冲区满,写操作也会阻塞 非阻塞:直接返回 同步异步 数据就绪后,数据操作谁完成?...需要自己去读是同步 数据就绪直接读好再回调给程序是异步 2 Netty 对三种 IO 支持变迁 划线已不再支持了哦! ? 为什么废除阻塞I/0 (BIO/OIO) ?...连接数高情况下:阻塞 -> 耗资源、效率低。 阻塞意味着等待,等待就会一直占用该线程,连接数高,大多线程又在等待,就会耗尽系统线程资源。 为什么删掉已经做好AIO支持?...通用NIO实现(Common)在Linux下也是epoll,但Netty依旧选择自己实现,因为更好: Netty提供更多可控参数: JDKNIO默认实现是水平触发 Netty 是边缘触发(默认)和水平触发

    67310

    透过现象看Java AIO本质 | 得物技术

    在了解AIO,有注意到以下几个现象: 1、 2011年Java 7发布,里面增加了AIO称之为异步IO编程模型,但已经过去了近12年,平时使用开发框架中间件,还是以NIO为主,例如网络框架Netty...2、 Java AIO又称为NIO 2.0,难道它也是基于NIO来实现? 3、 Netty舍去了AIO支持。...Java IO也是一样,需要有个参考系,才能定义它是同步异步,既然我们讨论是IO是哪一种模式,那就是要针对IO读写操作这件事来理解,而其他启动另外一个线程去处理数据,已经是脱离IO读写范围了,不应该把他们扯进来...而NIO也称之为同步,原因也是如此,调用channel.read(),线程虽然不会阻塞,但读到数据还是当前线程。...函数返回,会唤醒阻塞线程,执行所谓回调函数。

    60030

    透过现象看Java AIO本质 | 得物技术

    在了解AIO,有注意到以下几个现象: 1、 2011年Java 7发布,里面增加了AIO称之为异步IO编程模型,但已经过去了近12年,平时使用开发框架中间件,还是以NIO为主,例如网络框架Netty...2、 Java AIO又称为NIO 2.0,难道它也是基于NIO来实现? 3、 Netty舍去了AIO支持。...Java IO也是一样,需要有个参考系,才能定义它是同步异步,既然我们讨论是IO是哪一种模式,那就是要针对IO读写操作这件事来理解,而其他启动另外一个线程去处理数据,已经是脱离IO读写范围了,不应该把他们扯进来...而NIO也称之为同步,原因也是如此,调用channel.read(),线程虽然不会阻塞,但读到数据还是当前线程。...函数返回,会唤醒阻塞线程,执行所谓回调函数。

    36420

    IO模型

    select和poll原理基本相同: 注册待侦听fd(这里fd创建最好使用非阻塞) 每次调用都去检查这些fd状态,有一个或者多个fd就绪时候返回 返回结果中包括已就绪和未就绪fd 相比select...但当你每次都去询问,老板会把所有你点饭菜都轮询一遍再告诉你情况,大量饭菜很长时间都不能准备好情况下是很低效。于是,老板有些不耐烦了,就让厨师每做好一个菜就通知他。...epoll出现,解决了select、poll缺点: 基于事件驱动方式,避免了每次都要把所有fd都扫描一遍。 epoll_wait只返回就绪fd。...使用aio_read或者aio_write发起异步IO操作,使用aio_error检查正在运行IO操作状态。但是其实先没有通过内核而是使用了多线程阻塞。...fd对应设备状态, 但是它没有最大连接数限制,原因是它是基于链表来存储.而select是基于set数据结构。

    56220

    一文说清BIO、NIO、AIO不同IO模型演进之路

    (3)多路复用IO Linux主要提供了select、poll以及epoll等多路复用I/O实现方式,为什么会有三个实现呢?...因为它是一种基于IO多路复用IO模型,而不是简单同步非阻塞IO模型。所谓IO多路复用指就是用同一个线程处理大量连接,多路指就是大量连接,复用指就是使用一个线程来进行处理。...(这里以epoll机制来进行说明) Java NIO基于通道和缓冲区形式来处理流数据,借助于Linux操作系统epoll机制,多路复用器selector就会不断进行轮询,某个channel...AIO 所谓AIO(Asynchronous IO)就是NIO第二代,它是在Java 7中引入,是一种异步IO模型。...异步IO模型是基于事件和回调机制实现,当应用发起调用请求之后会直接返回不会阻塞在那里,后台进行数据处理完成后,操作系统便会通知对应线程来进行后续数据处理。

    54230

    一口气说出 5 种 IO 模型,蒙圈了!

    本质与select相同,函数时间复杂度也为O(n)。 epoll基于事件驱动,如果某个流准备好了,会以事件通知,知道具体是哪个流,因此不需要遍历,函数时间复杂度为O(1)。...1.2 同步&异步 同步异步是针对应用程序和内核交互而言,也可理解为被被调用者(操作系统)角度来说。...BIO,NIO,AIO涉及相关操代码已收录至我github,欢迎star~ 7.1 BIO--同步阻塞编程方式 JDK1.4之前常用编程方式。...7.2 NIO--同步非阻塞编程方式 7.2.1 NIO简介 NIO 本身是基于事件驱动思想来完成 socket 有流可读或可写入时,操作系统会相应地通知应用程序进行处理,应用再将流读取到缓冲区或写入操作系统...客户端发送连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求才启动一个线程进行处理 7.3 AIO--异步非阻塞编程方式 进行读写操作,只须直接调用apiread或write方法即可

    79820

    一口气说出 5 种 IO 模型,懵逼了

    本质与select相同,函数时间复杂度也为O(n)。 epoll基于事件驱动,如果某个流准备好了,会以事件通知,知道具体是哪个流,因此不需要遍历,函数时间复杂度为O(1)。...BIO,NIO,AIO涉及相关操代码已收录至我github,欢迎star~ 7.1 BIO--同步阻塞编程方式 JDK1.4之前常用编程方式。...7.2 NIO--同步非阻塞编程方式 7.2.1 NIO简介 NIO 本身是基于事件驱动思想来完成 socket 有流可读或可写入时,操作系统会相应地通知应用程序进行处理,应用再将流读取到缓冲区或写入操作系统...在读取数据它是直接读到缓冲区中;在写入数据,也是写入到缓冲区中。任何时候访问NIO中数据,都是通过缓冲区进行操作。...客户端发送连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求才启动一个线程进行处理 7.3 AIO--异步非阻塞编程方式 进行读写操作,只须直接调用apiread或write方法即可

    72330

    深入Hotspot源码与Linux内核理解NIO与Epoll

    2 IO模型 IO模型其实简单理解就是使用不同通道进行接收和发送数据 ,目前JAVA总共支持三种IO模型,分别是BIO、NIO、AIO 3 IO概念区分 同步异步概念 同步:同步就是发起一个请求后...白话文理解:还是公交车例子,不过这次换成了驾驶员,驾驶员没到点之前不会发送公交车,但是驾驶员可以在到点之前做些其他事情,例如来一把紧张刺激王者荣耀等 同步阻塞和非同步阻塞以及异步阻塞和异步非阻塞概念...这种IO模型是对上一个模型优化,一个新连接被接收之后,会获取到当前连接socket,然后交给一个新线程去处理,而主线程还是会继续接收新连接,这样就能够解决同一间只能处理一个新连接问题,...最后来一张BIO、 NIO、 AIO 图对比: ? 为什么Netty使用NIO而不是AIO?...在Linux系统上,AIO底层实现仍使用Epoll,没有很好实现AIO,因此在性能上没有明显优势,而且被JDK封装了一层不容易深度优化,Linux上AIO还不够成熟。

    1.2K10

    彻底搞懂Java网络IO

    在Java7中,NIO有了进一步改进,也就是NIO2,引入了异步非阻塞IO方式,也被称为AIO(Asynchronous IO),异步IO操作基于事件和回调机制。...基本概念 在学习JavaIO流之前,需要了解同步异步、阻塞非阻塞基本概念。 同步异步 同步异步是针对应用程序和内核交互而言。...在银行里办业务,领取一张小票,之后我们可以玩手机,或与别人聊聊天,轮到我们,银行喇叭会通知,这时候我们就可以去办业务了。 注意,这里办业务时候,还是需要我们也参与其中。...NIO 基于事件驱动思想,采用reactor(反应器)模式。发起IO请求,应用程序是非阻塞SOCKET有流可读或写时候,由操作系统通知应用程序,应用程序再将流读取到缓冲区或者写入系统。...是proactor模型, 混合在一起会非常混乱,把AIO也改造成reactor模型看起来是把epoll绕个弯又绕回来 AIO有个重要缺点是接收数据需要预先分配缓存,而NIO只需要在接收才分配缓存,

    2.1K50

    JAVA高性能IO设计模式

    Java中IO方式 主要分为3种:BIO(同步阻塞)、NIO(同步非阻塞)和AIO异步非阻塞)。 ? BIO 同步阻塞模式。...IO中几个概念 以银行取款为例:  同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO,Java自己处理IO读写); 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO,Java将...调用会马上返回,IO事件分发器会通知可读写再继续进行读写,不断循环直到读写完成)  系统I/O 可分为阻塞型, 非阻塞同步型以及非阻塞异步型。...涉及到事件分享器两种模式称为:Reactor and Proactor 。 Reactor模式是基于同步I/O,而Proactor模式是和异步I/O相关。...Boost库中asio就使用了Proactor模式,其底层异步I/O由操作系统提供,而异步事件分发还是由epoll/kequeue/select等实现。

    88720

    Java NIO、BIO、 AIO同步、阻塞、非阻塞、异步IO 简析

    所谓 同步/异步/阻塞/非阻塞 IO ,是指操作系统中对 IO 处理不同方法,而 Java 对这些不同操作方法做了一些包装,由此有了 BIO / NIO / AIO 几种操作接口。...当然,要注意,我们有时候也叫 Eventloop 这种实现是异步,但是和我们整篇文章讲同步异步并不是在一个区域,我们讲的是系统级连接 IO 操作。...epoll AIO 是 java.nio.channels.Asynchronou* 下面的包调用 AIO异步实现,底层方面,在 Linux 使用 JDK 自建线程池,在 Windows 下面使用...为什么差我们也可以做一个猜测,就是 Netty 有一个 Eventloop 线程池 ,和操作系统 AIO 线程池没有很好兼容,反而增多更多性能损耗。...(比如读取数据库,一般使用同步方式,如 JDBC 是典型同步应用),而等待时间是要占着当前线程,导致同时处理任务量过大,Tomcat 性能非常差。

    35630

    看一遍就理解:IO模型详解

    什么是同步异步IO?什么是IO多路复用?select/epoll跟IO模型有什么关系?有几种经典IO模型呢?BIO、NIO、AIO到底有什么区别的?...程序打开一个现有文件或者创建一个新文件,内核向进程返回一个文件描述符。...一旦基于某个fd就绪,内核会采用回调机制,迅速激活这个fd,进程调用epoll_wait()便得到通知。...阻塞、非阻塞、同步异步IO划分 IO模型 阻塞I/O模型 同步阻塞 非阻塞I/O模型 同步非阻塞 I/O多路复用模型 同步阻塞 信号驱动I/O模型 同步非阻塞 异步IO(AIO)模型 异步非阻塞...一个通俗例子读懂BIO、NIO、AIO 同步阻塞(blocking-IO)简称BIO 同步非阻塞(non-blocking-IO)简称NIO 异步非阻塞(asynchronous-non-blocking-IO

    1.2K21

    Java流

    AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 改进版 NIO 2,它是异步非阻塞 IO 模型。...异步 IO 是基于事件和回调机制实现,也就是应用操作之后会直接返回,不会堵塞在那里,后台处理完成,操作系统会通知相应线程进行后续操作。...AIO异步 IO 缩写,虽然 NIO 在网络操作中,提供了非阻塞方法,但是 NIO IO 行为还是同步。...对于一个套接字上输入操作,第一步通常涉及等待数据从网络中到达。所有等待分组到达,它被复制到内核中某个缓冲区。第二步就是把数据从内核缓冲区复制到应用程序缓冲区。...非阻塞式I/O:以下这句话很重要:进程把一个套接字设置成非阻塞是在通知内核,所请求I/O操作非得把本进程投入睡眠才能完成,不要把进程投入睡眠,而是返回一个错误。

    88510

    再聊服务化基石:也有IO事儿

    系统内核将处理数据操作准备完毕后,需要等待内核将数据复制到用户进程后再进行处理,称为同步IO;而用户进程无须关心实际IO操作过程,只需由内核在IO完成后通知既可,由内核进程来执行最终IO操作,这种方式称为异步...总结一下,同步IO与异步IO本质区别是,内核数据复制到用户空间是否进行等待。...我们看到,在Linux系统上,Java实际并未真正使用异步IO,而是非阻塞IO。AIO虽然封装效果更好,模拟成为了异步IO样子,但其本质仍然是poll或epoll这样同步IO。...但由于 Future get方法是同步并阻塞,与完全同步编程模式无异,导致异步操作仅作为摆设,因此并不推荐使用这种方法。 回调式是 AIO 推荐使用首选方式。...Netty 基于Java NIO,在 AIO 出现后,Netty也进行了尝试,但由于AIO性能并未有本质提升,因此Netty在其4.0其中一个版本中将AIO移除。 ?

    47050
    领券