05-Java NIO 编程 零拷贝 与 AIO

零拷贝是网络编程中的关键技术,许多性能优化都离不开它。在java程序中,常用的零拷贝技术包括mmap(内存映射)和sendfile。那么,这些技术在操作系统中的设计是怎样的呢?我们将分析mmap和sendfile这两种零拷贝技术,并探讨nio中如何使用零拷贝来优化传统io的数据读写。

05-Java NIO 编程 零拷贝 与 AIO传统IO模型05-Java NIO 编程 零拷贝 与 AIODMA : direct memory access 直接内存拷贝( 不使用CPU )

mmap优化通过内存映射,mmap将文件映射到内核缓冲区,同时用户空间可以共享内核空间的数据。这样,在进行网络传输时,就可以减少内核空间到用户空间的拷贝次数,如下图所示:

05-Java NIO 编程 零拷贝 与 AIOmmap示意图

sendFile优化在Linux 2.1版本中引入了sendFile函数,其基本原理如下:数据根本不经过用户态,直接从内核缓冲区进入到Socket Buffer。由于与用户态完全无关,这就减少了一次上下文切换。示意图和小结如下:

立即进入“豆包AI人工智官网入口”;

立即学习“豆包AI人工智能在线问答入口”;

05-Java NIO 编程 零拷贝 与 AIOsendFile示意图

提示:零拷贝从操作系统的角度来看,是没有CPU拷贝的。在Linux 2.4版本中,进行了修改,避免了从内核缓冲区拷贝到SocketBuffer的操作,直接拷贝到协议栈,从而再次减少了数据拷贝,如下图和小结所示:

05-Java NIO 编程 零拷贝 与 AIOsendFile优化后的示意图

这里其实有一次CPU拷贝(Kernel buffer -> socket buffer),但拷贝的信息很少,比如length和offset信息,可以忽略。

零拷贝的再次理解我们所说的零拷贝,是从操作系统的角度来说的,因为内核缓冲区之间没有数据是重复的(只有kernel buffer有一份数据)。零拷贝不仅带来了更少的数据复制,还能带来其他的性能优势,例如更少的上下文切换,更少的CPU缓存伪共享以及无CPU校验和计算。

mmap和sendFile的区别如下:

mmap适合小数据量读写,sendFile适合大文件传输。mmap需要4次上下文切换,3次数据拷贝;sendFile需要3次上下文切换,最少2次数据拷贝。sendFile可以利用DMA方式减少CPU拷贝,而mmap则不能(必须从内核拷贝到Socket缓冲区)。

零拷贝案例需求:使用传统IO方法传递一个大文件,使用NIO零拷贝方式(transferTo)传递一个大文件,并比较两种传递方式的耗时。

以下是服务器端的代码:

package com.dance.netty.nio.demo.zerocopy;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;public class ZeroCopyServer {    public static void main(String[] args) throws Exception {        InetSocketAddress inetSocketAddress = new InetSocketAddress(7001);        ServerSocketChannel open = ServerSocketChannel.open();        open.socket().bind(inetSocketAddress);        for (;;){            SocketChannel accept = open.accept();            int countSize = 0;            ByteBuffer allocate = ByteBuffer.allocate(4096);            while (-1 != countSize){                countSize  = accept.read(allocate);                allocate.rewind(); // 倒置 position=0 Mark 作废            }        }    }}

以下是客户端的代码:

package com.dance.netty.nio.demo.zerocopy;import java.io.File;import java.io.FileInputStream;import java.net.InetSocketAddress;import java.nio.channels.FileChannel;import java.nio.channels.SocketChannel;import java.time.Duration;import java.time.Instant;public class ZeroCopyClient {    public static void main(String[] args) throws Exception {        SocketChannel open = SocketChannel.open();        boolean connect = open.connect(new InetSocketAddress(7001));        // 获取文件Channel        File file = new File("src/main/resources/01.jpeg");        FileChannel channel = new FileInputStream(file).getChannel();        Instant startTime = Instant.now();        /*          * 在Linux下,一个transferTo方法就可以传输完成         * 在Windows下,调用一次transferTo 只能传输8M,就需要分段传输文件,而且要记录传输时的位置         * transferTo 底层使用零拷贝         */        long l = channel.transferTo(0, channel.size(), open);        System.out.println(l);        Instant endTime = Instant.now();        System.out.println("用时:" + Duration.between(startTime,endTime).toMillis() + "ms");        channel.close();    }}

执行结果如下:

6806用时:3ms

零拷贝博客链接:https://www.php.cn/link/5b4e256d43c2e28b425581832a4e0a09

我认为这篇博客写的非常不错。

AIO基本介绍:JDK7引入了Asynchronous I/O,即AIO。在进行IO编程时,常用到两种模式:Reactor和Proactor。Java的NIO就是Reactor模式,当有事件触发时,服务器端得到通知进行相应的处理。AIO,即NIO2.0,称为异步非阻塞IO,AIO引入了异步通道的概念,采用了Proactor模式,简化了程序编写,有效的请求才启动线程。其特点是,先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多,且连接时间较长的应用。目前AIO还没有广泛应用,Netty也是基于NIO,而不是AIO,因此就不在这里详细讲解AIO了。有兴趣的可以参考以下链接:

BIO、NIO和AIO对比图:

05-Java NIO 编程 零拷贝 与 AIO

举例说明:

同步阻塞:到理发店理发,就一直等着,直到轮到自己理发。同步非阻塞:到理发店理发,发现前面有其他人,给理发师说一下先干其他事情,一会过来看是否轮到自己。异步非阻塞:给理发师打电话,让理发师上门服务,自己干其他事情,理发师上门通知,来你家给你理发。

NIO完结撒花花。

以上就是05-Java NIO 编程 零拷贝 与 AIO的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/31479.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何使用Composer管理WordPress Bedrock项目?
上一篇 2026年10月4日 05:57:35
c++如何实现一个迭代器模式_c++行为型设计模式Iterator【STL原理】
下一篇 2025年12月19日 11:51:09

相关推荐

  • 蚂蚁集团与浙商银行达成深化战略合作:共创金融科技新生态

    蚂蚁集团与浙商银行达成深化战略合作:共创金融科技新生态蚂蚁集团与浙商银行达成深化战略合作:共创金融科技新生态蚂蚁集团与浙商银行达成深化战略合作:共创金融科技新生态蚂蚁集团与浙商银行达成深化战略合作:共创金融科技新生态

    9月12日,蚂蚁集团与浙商银行正式签署深化战略合作协议。双方将在金融科技、基础技术、公司金融、零售金融、金融市场及普惠金融等多个领域进一步拓展合作,以ai为核心驱动力,共同探索金融行业发展的新路径,致力于为社会创造更广泛的价值。 自2022年起,浙商银行便将数字化转型列为全行核心战略之一,持续推进改…

    2026年10月4日 • 用户投稿
    200
  • 建设进度不及预期,博敏电子拟将高端PCB募投项目延期至明年底建成

    建设进度不及预期,博敏电子拟将高端PCB募投项目延期至明年底建成建设进度不及预期,博敏电子拟将高端PCB募投项目延期至明年底建成建设进度不及预期,博敏电子拟将高端PCB募投项目延期至明年底建成建设进度不及预期,博敏电子拟将高端PCB募投项目延期至明年底建成

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 6月13日,博敏电子发布公告表示,公司计划将原定于2025年7月完成的“博敏电子新一代电子信息产业投资扩建项目(一期)”延期至2026年12月31日。 据披露,“博敏电子新一代电子信息产业投资扩…

    2026年10月4日 • 用户投稿
    000
  • edge的朗读功能怎么使用_edge浏览器“大声朗读”网页内容功能教程

    edge的朗读功能怎么使用_edge浏览器“大声朗读”网页内容功能教程edge的朗读功能怎么使用_edge浏览器“大声朗读”网页内容功能教程edge的朗读功能怎么使用_edge浏览器“大声朗读”网页内容功能教程edge的朗读功能怎么使用_edge浏览器“大声朗读”网页内容功能教程

    Microsoft Edge 浏览器内置“大声朗读”功能,可将网页文字实时朗读并支持语速、语音调节。1、通过菜单或右键选择“大声朗读”启动全文或选中内容播放;2、使用控制栏调整语音、语速并高亮当前句子;3、支持暂停、继续和停止操作,便于控制阅读节奏。 如果您希望在浏览网页时通过语音播放内容,以减轻视…

    2026年10月4日 • 用户投稿
    000
  • 如何在Linux上配置高可用的数据库代理

    如何在linux上配置高可用的数据库代理 摘要:在现代的互联网应用程序中,数据库是承载数据的重要组件之一。为了确保数据库的高可用性和可靠性,配置一个高可用的数据库代理是至关重要的。本文将介绍如何在linux上配置高可用的数据库代理,并提供一些代码示例。 引言:随着互联网应用程序的发展,数据库成为了存…

    2026年10月4日
    000
  • 如何用Java开发直播推流服务赚钱 Java音视频基础模块接入方案

    如何用Java开发直播推流服务赚钱 Java音视频基础模块接入方案如何用Java开发直播推流服务赚钱 Java音视频基础模块接入方案如何用Java开发直播推流服务赚钱 Java音视频基础模块接入方案如何用Java开发直播推流服务赚钱 Java音视频基础模块接入方案

    java在直播推流服务中核心角色是协议解析、业务逻辑处理、服务调度与第三方集成,1. 使用netty解析rtmp/srt协议并转发流数据;2. 通过spring boot构建用户管理、礼物打赏、聊天等微服务实现变现功能;3. 调用ffmpeg进行转码适配多端播放;4. 集成支付、cdn、广告系统支撑…

    2026年10月4日 • 用户投稿
    100
  • 带你走入 Flink 的世界

    带你走入 Flink 的世界带你走入 Flink 的世界带你走入 Flink 的世界带你走入 Flink 的世界

    1. 学习 flink 的原因 早在 18 年时,我便听说了 Flink 这个流式计算引擎,当时阿里选择它作为新一代大数据计算框架,这一消息给我留下了深刻印象。 由于我平时主要从事业务开发,尚未系统学习 Flink ,但今年随着数据量的快速增长,我们的架构师提出了通过数据加工和分析,获取更多指标性结…

    2026年10月4日 • 用户投稿
    100
  • linux的实时性怎么样

    linux的实时性怎么样linux的实时性怎么样linux的实时性怎么样linux的实时性怎么样

    Linux在实时性方面具有很好的特性,并且可以通过特定的内核配置和实时扩展来进一步提高实时性能,其优势有:1、预测性,Linux内核为实时任务提供了可预测的调度机制;2、低延迟,Linux实时内核针对降低系统延迟进行了优化;3、实时扩展,提供了更强大的实时性能和更低的延迟,适用于对实时性要求更高的应…

    2026年10月4日 • 用户投稿
    000
  • 微软承认Win10开始菜单的错误并承诺本月修复

    微软承认Win10开始菜单的错误并承诺本月修复微软承认Win10开始菜单的错误并承诺本月修复微软承认Win10开始菜单的错误并承诺本月修复微软承认Win10开始菜单的错误并承诺本月修复

    上个月,微软承认有部分用户在升级到windows 10最新版本后,遇到了开始菜单和windows搜索功能无法正常使用的情况。尽管本月的“补丁星期二”活动日已经过去,但这些问题依旧没有得到解决。然而,让人意外的是,微软随后将这些问题标注为“已修复”。 在9月19日的Windows健康仪表板上提到:“截…

    2026年10月4日 • 用户投稿
    000
  • composer install –no-scripts有什么作用_说明composer install –no-scripts命令的用途

    composer install –no-scripts有什么作用_说明composer install –no-scripts命令的用途composer install –no-scripts有什么作用_说明composer install –no-scripts命令的用途composer install –no-scripts有什么作用_说明composer install –no-scripts命令的用途composer install –no-scripts有什么作用_说明composer install –no-scripts命令的用途

    执行 composer install –no-scripts 仅安装依赖并生成自动加载文件,跳过 composer.json 中定义的 post-install-cmd 等脚本,适用于调试、CI/CD 分步控制及避免自动执行耗时命令,实现更精细的流程管理。 执行 composer in…

    2026年10月4日 • 用户投稿
    000
  • 搜有红包福利领取入口 搜有红包专属优惠通道2025

    搜有红包福利领取入口 搜有红包专属优惠通道2025搜有红包福利领取入口 搜有红包专属优惠通道2025搜有红包福利领取入口 搜有红包专属优惠通道2025搜有红包福利领取入口 搜有红包专属优惠通道2025

    搜有红包福利领取入口可通过点击活动链接或在百度APP搜索“搜有红包”进入,参与签到、浏览、邀请等任务获红包,达标后可提现。 搜有红包福利领取入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来搜有红包专属优惠通道2025,感兴趣的网友一起随小编来瞧瞧吧! https://m.baidu.c…

    2026年10月4日 • 用户投稿
    200
  • linux中hosts文件格式错误怎么解决

    linux中hosts文件格式错误怎么解决linux中hosts文件格式错误怎么解决linux中hosts文件格式错误怎么解决linux中hosts文件格式错误怎么解决

    linux中hosts文件格式错误的解决方法是:1、以管理员身份打开终端或使用sudo命令;2、打开hosts文件,命令为“sudo vi /etc/hosts”;3、检查和修复格式错误,确保每个条目都占用一行,并用空格或制表符分隔字段;4、保存文件并退出编辑器;5、测试修改是否生效。 本教程操作系…

    2026年10月4日 • 用户投稿
    100
  • 数字化转型提效!海尔智家主导行业数字化仿真标准发布

    数字化转型提效!海尔智家主导行业数字化仿真标准发布数字化转型提效!海尔智家主导行业数字化仿真标准发布数字化转型提效!海尔智家主导行业数字化仿真标准发布数字化转型提效!海尔智家主导行业数字化仿真标准发布

    现代制造业正加速迈向以数字模型为核心的研发新阶段,数字化转型与效率革新已成为企业构建核心竞争力的关键路径。近日,由海尔智家牵头制定的国家标准gb/t45990.1-2025《家用和类似用途电器数字化仿真试验第1部分:通用要求》(简称“标准”)正式发布,并将于2026年2月1日起实施。这是我国首个面向…

    2026年10月4日 • 用户投稿
    100
  • 在数组中检查特定元素顺序的有效方法

    在数组中检查特定元素顺序的有效方法在数组中检查特定元素顺序的有效方法在数组中检查特定元素顺序的有效方法在数组中检查特定元素顺序的有效方法

    在数组中高效地检查特定元素(如数字2)是否出现在另一个特定元素(如数字4)之前。文章将深入分析常见的逻辑错误,特别是循环中不恰当的 break 语句如何导致判断失误。通过引入状态标志位和单次遍历策略,我们将展示一种健壮且高效的解决方案,并提供详细的代码示例和最佳实践,帮助开发者避免陷阱,确保逻辑的准…

    2026年10月4日 • 用户投稿
    000
  • linux系统用什么编译器

    linux系统用什么编译器linux系统用什么编译器linux系统用什么编译器linux系统用什么编译器

    linux系统可以根据具体需求,选择适合自己项目和平台的编译器,如:1、GCC,Linux系统中最常见和广泛使用的编译器,支持多种编程语言并具有强大的优化能力和广泛的平台支持;2、Clang,一个开源的C/C++/Objective-C编译器前端,具有良好的代码分析能力和错误报告;3、LLVM,一套…

    2026年10月4日 • 用户投稿
    000
  • Win11安卓子系统WSA将不限制CPU型号都可安装

    Win11安卓子系统WSA将不限制CPU型号都可安装Win11安卓子系统WSA将不限制CPU型号都可安装Win11安卓子系统WSA将不限制CPU型号都可安装Win11安卓子系统WSA将不限制CPU型号都可安装

    在最新版本的windows 11安卓子系统(wsa)中,微软移除了对cpu性能的限制,不再将低端处理器排除在外。此前,wsa要求用户使用英特尔第8代i3及以上、amd ryzen 3000及以上或高通骁龙8c及以上的处理器才能运行。然而,在目前的2307.40000.2.0版本中,该子系统着重加强了…

    2026年10月4日 • 用户投稿
    000
  • linux中使用sftp无法获取目录怎么解决

    linux中使用sftp无法获取目录怎么解决linux中使用sftp无法获取目录怎么解决linux中使用sftp无法获取目录怎么解决linux中使用sftp无法获取目录怎么解决

    linux使用sftp无法获取目录的解决方法是:1、检查用户权限,确保使用SFTP登录的用户具有访问所需目录的权限;2、检查路径,确认所提供的路径是正确的;3、检查防火墙设置,确保已经正确配置,允许SFTP流量通过特定的端口;4、检查SFTP服务器配置,确认是否允许SFTP功能并设置了正确的根目录等…

    2026年10月4日 • 用户投稿
    100
  • 笔尖AI智能体组合如何串联工作流?标题生成+文案优化联动

    笔尖AI智能体组合如何串联工作流?标题生成+文案优化联动笔尖AI智能体组合如何串联工作流?标题生成+文案优化联动笔尖AI智能体组合如何串联工作流?标题生成+文案优化联动笔尖AI智能体组合如何串联工作流?标题生成+文案优化联动

    笔尖ai智能体组合通过模块化设计实现标题生成与文案优化的联动,提升内容创作效率。1. 标题生成阶段使用“标题生成”智能体输入关键词、主题等信息生成多个候选标题;2. 文案初稿阶段基于选定标题和产品描述等内容生成初步文案;3. 文案优化阶段对语言流畅度、信息准确性、seo及情感色彩等方面进行润色;4.…

    2026年10月4日 • 用户投稿
    000
  • composer global require怎么用

    composer global require怎么用composer global require怎么用composer global require怎么用composer global require怎么用

    使用composer global require可在全局安装PHP工具,如Laravel安装器,命令为composer global require vendor/package-name,安装后需将~/.composer/vendor/bin(macOS/Linux)或对应Windows路径加入…

    2026年10月4日 • 用户投稿
    000
  • linux如何查看脚本进程是否存在

    linux如何查看脚本进程是否存在linux如何查看脚本进程是否存在linux如何查看脚本进程是否存在linux如何查看脚本进程是否存在

    linux查看脚本进程是否存在的方法有:1、使用ps命令,列出当前运行的进程,通过grep命令过滤出与脚本相关的进程,并检查是否存在;2、使用pgrep命令,通过进程的名称查找其进程ID;3、使用pidof命令,通过进程的名称直接查找进程ID。 本教程操作系统:Linux5.18.14系统、Dell…

    2026年10月4日 • 用户投稿
    200
  • Win10系统蓝屏代码NTOSKRNL.exe BSOD怎么解决?

    Win10系统蓝屏代码NTOSKRNL.exe BSOD怎么解决?Win10系统蓝屏代码NTOSKRNL.exe BSOD怎么解决?Win10系统蓝屏代码NTOSKRNL.exe BSOD怎么解决?Win10系统蓝屏代码NTOSKRNL.exe BSOD怎么解决?

    win10系统出现蓝屏代码ntoskrnl.exe bsod怎么办?最近有不少用户在使用电脑时遇到了蓝屏代码ntoskrnl.exe bsod的情况,导致电脑无法正常使用,这是什么原因呢?又该如何解决呢?下面给大家详细说明一下。 解决步骤: 根本原因: ntoskrnl.exe是“ Windows …

    2026年10月4日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信