上一篇文章 主要分析了 Linux 原生 AIO 的原理和使用,而这篇要介绍的是 Linux 原生 AIO 的实现过程。...所以,我们可以通过分析这三个函数的实现来理解 Linux 原生 AIO 的实现。 Linux 原生 AIO 实现在源码文件 /fs/aio.c 中。...创建异步 IO 上下文 要使用 Linux 原生 AIO,首先需要创建一个异步 IO 上下文,在内核中,异步 IO 上下文使用 kioctx 结构表示,定义如下: struct kioctx {...总结 本文主要分析了 Linux 原生 AIO 的实现,但为了不陷入太多的实现细节中,本文并没有涉及到磁盘 IO 相关的知识点。...然而磁盘 IO 也是 AIO 实现中不可或缺的一部分,所以有兴趣的朋友可以继续通过阅读 Linux 的源码来分析其实现原理。
所以本文也附带介绍了Linux 2.6及以后版本新增的AIO特性(因为这跟Java AIO是对应关系)。...JDK7中的java aio新增的类和接口主要有: AsynchronousServerSocketChannel ,对应于bio中的ServerSocket和nio中的ServerSocketChannel...除了CompletionHandler这种回调方式,aio中还支持返回Future对象,使用Future来设定回调操作。...Linux AIO 1Linux AIO 简介 Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。...2Linux 的 I/O 模型 在深入介绍 AIO API 之前,让我们先来探索一下 Linux 上可以使用的不同 I/O 模型。
Linux 原生 AIO 原理 Linux Native AIO 是 Linux 支持的原生 AIO,为什么要加原生这个词呢?...本文主要介绍 Linux 原生 AIO 的原理和使用,所以不会对其他第三方的异步 IO 库进行分析,下面我们先来介绍 Linux 原生 AIO 的原理。 如 图2 所示: ?...Linux 原生 AIO 处理流程: 当应用程序调用 io_submit 系统调用发起一个异步 IO 操作后,会向内核的 IO 任务队列中添加一个 IO 任务,并且返回成功。...内核会在后台处理 IO 任务队列中的 IO 任务,然后把处理结果存储在 IO 任务中。...总结 本文主要介绍了 Linux 原生 AIO 的原理和使用,Linux 原生 AIO 的使用比较简单,但其内部实现比较复杂,在下篇文章中将会介绍 Linux 原生 AIO 的实现。
之所以不叫Cached IO,是因为早年Linux的磁盘iOS设计中在Page Cache 里还有一个内部的”内核buffer“。在Linux 2.6之后,这个设计被统一到了只使用Page。...正如第一篇文章所说,在Linux中,磁盘IO不支持NON_BLOCKING模式。但是Linux提供了磁盘的异步IO接口(Asynchronous IO,AIO)。...所以,对于POSIX AIO大家看看就好。Linux下实际使用比较多的是Linux AIO。...Linux AIO Linux中的另外一套AIO接口被称为Linux AIO,是Linux在内核实现的一套AIO接口。这套是"真・AIO"。接口的详细用法可以参考这里。...Linux提供了eventfd解决这个问题。 使用eventfd协调epoll和Linux AIO 如果在Linux下编写一个高性能文件服务器,就需要同时用到epoll和Linux AIO。
Linus:啥玩意儿,不是已经有 aio 了么,为啥又来一套,你咋不去好好修 aio 的问题。aio 还有 balabala 问题没有修呢。...…… 背景 Linus 和 Jens 在讨论的,就是 Linux Kernel 即将在 5.1 版本加入一个重大 feature:io_uring。...SQ 和 CQ 中每个节点保存的都是 SQEs 数组的偏移量,而不是实际的请求,实际的请求只保存在 SQEs 数组中。这样在提交请求时,就可以批量提交一组 SQEs 上不连续的请求。...当然,不可否认,aio 也在与时俱进。自从 kernel 2.5 进入 upstream 以来,aio 一直都没有实现完整。...参考 lore.kernel.org/linux-b lwn.net/ml/linux-fsdeve git.kernel.dk/cgit/fio/ lore.kernel.org/linux-b lwn.net
Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。...在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。 同步与异步 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。...举个生活中简单的例子,你妈妈让你烧水,小时候你比较笨啊,在那里傻等着水开(同步阻塞)。等你稍微再长大一点,你知道每次烧水的空隙可以去干点其他事,然后只需要时不时来看看水开了没有(同步非阻塞)。...在 Java 虚拟机中,线程是宝贵的资源,线程的创建和销毁成本很高,除此之外,线程的切换成本也是很高的。...尤其在 Linux 这样的操作系统中,线程本质上就是一个进程,创建和销毁线程都是重量级的系统函数。
以上的两组概念可以两两组合,就组合了我们熟悉的BIO、NIO、AIO。 3....BIO方式适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,并发局限于应用中,在jdk1.4以前是唯一的io现在,但程序直观简单易理解。 4....NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,jdk1,4开始支持。...Buffer中的数据被读取后不会消失(区别于Stream)。 5....AIO:我在厕所外做别的事,等有人来通知我了我再去占坑。
16.BIO、NIO、AIO 有什么区别? BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。...AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
在Java编程中,IO操作是非常常见和重要的一部分。...在处理IO时,我们通常会涉及到三种不同的模式:BIO(Blocking IO,阻塞IO)、NIO(Non-blocking IO,非阻塞IO)和AIO(Asynchronous IO,异步IO)。...AIO(Asynchronous IO) AIO是Java在NIO的基础上进一步发展的一种IO模式,也称为异步IO。在AIO模式下,当一个IO操作被调用时,程序会立即返回,并在后台进行处理。...相比于BIO和NIO,AIO更适用于需要处理大量并发连接且每个连接的IO操作时间较长的场景,如高性能的网络通信。综上所述,BIO、NIO和AIO各自适用于不同的场景。...在开发中,我们需要根据实际需求进行选择,并充分利用Java提供的API来实现高效的IO操作。其中NIO基于select模型实现,AIO基于epoll模型实现(windows下是基于iocp)
Java中的IO体系主要分为BIO(BlockingIO,阻塞IO)、NIO(Non-blockingIO,非阻塞IO)和AIO(AsynchronousIO,异步IO)。...底层使用操作系统epoll(Linux)、kqueue(BSD)或select(Windows)实现。工作流程:服务器创建ServerSocketChannel,设置为非阻塞,注册到Selector。...底层依赖OS异步IO(如Linux的io_uring或AIO系统调用)。真正异步:用户线程完全不阻塞,IO由内核线程池处理。特点异步非阻塞:发起请求后立即返回,回调处理结果。...实际使用:生产环境推荐NIO框架如Netty(封装NIO,易用高效),AIO原生支持弱,少用。性能测试:高并发下,NIO/AIO吞吐量远超BIO(线程数从数千降到数十)。...实际开发中,文件常用字符流+缓冲;网络转向NIO/Netty。
1. linux AIO — libaio 实现的异步 IO POSIX AIO 是在用户控件模拟异步 IO 的功能,不需要内核支持,而 linux AIO 则是 linux 内核原声支持的异步 IO...关于 linux IO 模型及 AIO、POSIX AIO 的简介,请参看上一篇文章 libaio 实现的异步 IO 主要包含以下接口: libaio 实现的异步 IO 函数 功能 原型 io_setup...等于 aio_ring_info 中的 user_id unsigned nr; // 等于 aio_ring_info 中的 nr unsigned head; //...与 POSIX AIO 区别 从上图中的流程就可以看出,linux 版本的 AIO 与 POSIX 版本的 AIO 最大的不同在于 linux 版本的 AIO 实际上利用了 CPU 和 IO 设备异步工作的特性...POSIX AIO 支持非 direct-io,而且实现非常灵活,可配置性很高,可以利用内核提供的page cache来提高效率,而 linux 内核实现的 AIO 就只支持 direct-io,cache
Linux认为: 对于第一种情况,算作block,因为Linux无法知道网络上对方是否会发数据。如果没数据发过来,对于调用read的程序来说,就只能“等”。...在有些文档中写的是会返回EWOULDBLOCK。...多个数据流共享同一个TCP连接的场景的确是有,比如Http2 Multiplexing就是指Http2通讯中中多个逻辑的数据流共享同一个TCP连接。但这与IO多路复用是完全不同的问题。...因为大部分情况下我会用Linux做服务器,所以下文以Linux epoll为例子来解释多路复用是怎么工作的。 用epoll实现的IO多路复用 epoll是Linux下的IO多路复用的实现。...但是网络IO处理仅仅是整个数据处理中的一部分。如果你留意到上文例子中的“处理事件”代码,就会发现这里可能是有问题的。
而AIO,在windows上是通过IOCP实现的,在linux上还是通过epoll来实现的。...这里强调一点:AIO,这是I/O处理模式,而epoll等都是实现AIO的一种编程模型;换句话说,AIO是一种接口标准,各家操作系统可以实现也可以不实现。...Linux上还没有真正实现网络方式的AIO。...在linux上,AIO的实现是通过epoll来完成的,看JDK源码,可以发现,实现源码是: UnixAsynchronousSocketChannelImpl 看实现接口: implements Port.PollableChannel...这是与windows最大的区别,poll的实现,在linux2.6后,默认使用epoll。
---- IO 概述 IO 的操作方式通常分为几种:同步阻塞 BIO、同步非阻塞 NIO、异步非阻塞 AIO。 (1)在 JDK1.4 之前,我们建立网络连接的时候采用的是 BIO 模式。...(3)AIO 也就是 NIO 2,在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO 模型。...Channel 和 IO 中的 Stream(流)是差不 多一个等级的。...异步非阻塞 IO(AIO) (1)AIO 也就是 NIO 2,在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞 的 IO 模型。...(2)Java 的 AIO API 其实就是 Proactor 模式的应用,和 Reactor 模式类似。
AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
---- 下面分析下 阻塞I/O、NIO、AIO的数据处理流程 阻塞I/O 数据处理流程 ?...然后从channel中读取数据做响应的处理。这样一个线程就可以处理多个请求,程序只需要处理已经就行的channel就ok了。 3.AIO 数据处理流程 ?...AIO 实现原理 程序调用AIO的accept方法并传入Completionhandler,该方法是非阻塞方法。 等数据准备完成后回调Completionhandler处理响应操作。...程序只需要把具体的操作告知AIO就可以了,具体操作AIO来帮助你来操作。 NIO 和 AIO 性能上对比 AIO在性能上相对于NIO没有本质的提升。...AIO只是帮助你从内核中将数据复制到用户空间中,并调用你传入的回调方法。 NIO 是需要程序自己从内核中将数据复制到用户空间中,并需要程序自己调用相应的处理逻辑。 ----
这也就引来一个很大的问题,当请求越多,服务器端的启用线程也要越多,我们都知道linux(window)的文件句柄数有是限的,默认是1024,当然可以修改,上限好像是65536 (一个柄也相当于一个socket...也相当于一个thread,linux查看文件句柄Unlimit -a)。...通道分两类,一:网络读写(selectableChannel),另一类是文件操作(FileChannel),我们常用的是上面例子中的网络读写!...所以出现AIO。 如果你理解了Java NIO ,下面讲的netty也是水到渠成的事,只想说,深水区已过了! 差点忘记还要补下AIO的,这个比NIO先进的技术,最终实现了netty。...、AIO适用场景
在 Java AIO 中: 所有 IO 操作都是异步的 调用 read() 后立即返回,不阻塞 数据准备好后,通过 回调函数 或 Future 通知你 // AIO 服务器示例(基于回调) AsynchronousServerSocketChannel...优点: 真正的异步非阻塞,性能极致 程序无需轮询,资源利用率最高 ❌ AIO 缺点: Windows 支持好,Linux 通过 epoll 模拟,性能提升有限 API 复杂,使用较少 目前主流框架(如...,理论上性能最好,但 Linux 支持弱,实际用得少。...Q4: Netty 用的是 NIO 还是 AIO? 答: Netty 默认使用 NIO(基于 NioEventLoopGroup),因为 NIO 在 Linux 上性能稳定,且 API 成熟。...✅ 总结:一张表搞懂核心要点 问题 答案 BIO 问题 线程爆炸,不适合高并发 NIO 核心 Channel + Buffer + Selector(多路复用) AIO 特点 异步回调,Linux 支持弱
当然了,这样定义AIO只是为了方便我们理解,实际中对异步IO的定义可能更抽象一点。 5、 AIO示例引发思考1:“执行completed()方法的线程是谁创建、什么时候创建?”...只运行AIO服务端程序,客户端不运行,打印一下线程栈(备注:程序在Linux平台上运行,其他平台略有差异)。如下图所示。...提到epoll,我们印象中,Java NIO在Linux平台底层就是用epoll来实现的,难道Java AIO也是用epoll来实现么? 为了证实这个结论,我们从下一个问题来展开讨论。...8.2Java AIO的其它真相 Java AIO跟NIO一样:在各个平台的底层实现方式也不同,在Linux是用epoll、Windows是IOCP、Mac OS是KQueue。...Linux虽然也有一套原生的AIO实现(类似Windows上的IOCP),但Java AIO在Linux并没有采用,而是用epoll来实现。 Java AIO不支持UDP。