零拷贝原理

news2024/11/24 7:44:21
        在实际应用中,如果我们需要把磁盘中的某个文件内容发送到远程服务器上,那么它必
须要经过几个拷贝的过程。从磁盘中读取目标文件内容拷贝到内核缓冲区,CPU 控制器再把内核缓冲区的数据赋值到用户空间的缓冲区中, 接着在应用程序中,调用 write() 方法,把用户空间缓冲区中的数据拷贝到内核下的 Socket Buffer 中。最后,把在内核模式下的 SocketBuffer 中的数据赋值到网卡缓冲区(NIC Buffer)网卡缓冲区再把数据传输到目标服务器上。

在这个过程中我们可以发现,数据从磁盘到最终发送出去,要经历 4 次拷贝,而在这
四次拷贝过程中,有两次拷贝是浪费的,分别是:
  • 从内核空间赋值到用户空间
  • 从用户空间再次复制到内核空间
        除此之外,由于用户空间和内核空间的切换会带来 CPU 的上线文切换,对于 CPU 性能
也会造成性能影响。而零拷贝,就是把这两次多于的拷贝省略掉,应用程序可以直接把
磁盘中的数据从内核中直接传输给 Socket,而不需要再经过应用程序所在的用户空间
(如图)。

        零拷贝通过 DMA(Direct Memory Access)技术把文件内容复制到内核空间中的
Read Buffer, 接着把包含数据位置和长度信息的文件描述符加载到 Socket Buffer 中,DMA 引擎
直接可以把数据从内核空间中传递给网卡设备。 在这个流程中,数据只经历了两次拷贝就发送到了网卡中,并且减少了 2 次 cpu 的上下文切换,对于效率有非常大的提高

所以,所谓零拷贝,并不是完全没有数据复制,只是相对于用户空间来说,不再需要进
行数据拷贝。对于前面说的整个流程来说,零拷贝只是减少了不必要的拷贝次数而已。
在程序中如何实现零拷贝呢?
  • 在 Linux 中,零拷贝技术依赖于底层的 sendfile()方法实现。
  • 在 Java 中,FileChannal.transferTo()方法的底层实现就是 sendfile()方法。
  • 除此之外,还有一个 mmap 的文件映射机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arrays类概述,Lambda表达式

数组操作工具类,专门用于操作数组元素 2:常用API Lambda概述 Lambda表达式是JDK开始后的一种新语法形式作用:简化匿名内部类的代码写法 格式: 注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式。 什么是…

JAVA-编程基础-07-面向对象思想

Lison <dreamlison163.com>, v1.0.0, 2023.03.26 JAVA-编程基础-07-面向对象思想 文章目录 JAVA-编程基础-07-面向对象思想一、三大特性封装继承多态 二、类图泛化关系 (Generalization)实现关系 (Realization)聚合关系 (Aggregation)组合关系 (Composition)关联关系 (A…

使用vim编辑器,进行保存时报错:E382: Cannot write, ‘buftype‘ option is set

目录 一、背景 1.1使用vim 进行:wq保存时&#xff0c;报错&#xff1a;E382: Cannot write, buftype option is set 1.2 产生原因 二、解决 2.1 解决办法 2.2 还原 一、背景 1.1使用vim 进行:wq保存时&#xff0c;报错&#xff1a;E382: Cannot write, buftype option i…

【UnityDOTS 二】Entity的理解

Entity的理解 Entity作为一种对CPU的Cache友好的编码方式&#xff0c;是DOTS中重要的编码流程与思想。需要程序员由OOP的思想转为DOD的思想&#xff0c;即&#xff1a;面向数据的编码方式。 Unity的ECS&#xff1a; Entity&#xff1a;只是一个代表&#xff0c;用于快速查找数…

前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息

前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13310 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- leftTitle:左边标题 name&…

哈工大计算机网络课程网络层协议详解之:路由算法概述与链路状态路由算法

哈工大计算机网络课程网络层协议详解之&#xff1a;路由算法概述与链路状态路由算法 在前面的小节中&#xff0c;我们介绍了网络中路由器的路由与转发等功能。我们说作为网络层&#xff0c;从功能上来说&#xff0c;核心功能就是要实现路由和转发。 对于转发来说&#xff0c;实…

PyTorch开放神经网络交换(Open Neural Network Exchange)ONNX通用格式模型的熟悉

我们在深度学习中可以发现有很多不同格式的模型文件&#xff0c;比如不同的框架就有各自的文件格式&#xff1a;.model、.h5、.pb、.pkl、.pt、.pth等等&#xff0c;各自有标准就带来互通的不便&#xff0c;所以微软、Meta和亚马逊在内的合作伙伴社区一起搞一个ONNX(Open Neura…

Redis - 优惠券秒杀、库存超卖、分布式锁、Redisson

文章目录 一、优惠券秒杀1.1 全局唯一ID概述1.2 Redis实现全局唯一ID1.3 添加优惠券1.3.1 entity1.3.2 Controller1.3.3 Service层1.3.4 测试 1.4 优惠券秒杀下单1.4.1 entity1.4.2 Controller1.4.3 Service1.4.3 测试 1.5 库存超卖问题1.5.1 库存超卖原因1.5.2 介绍乐观锁1.5.…

【博学谷学习记录】超强总结,用心分享 | 架构师 Jenkins学习总结

文章目录 Jenkins介绍背景应用场景主从集群 Jenkins使用访问Jenkins获取管理员密码进入jenkins主页修改管理员密码 安装插件插件安装 全局工具配置 企业实战pipeline(重点)创建PipelinePipeline语法语法示例 Jenkins介绍 背景 ​ Jenkins&#xff0c;之前叫做Hudson&#xff…

php开发人员信息搜索查询系统 名单查询系统后台 php增删改查功能

php实现人员信息搜索的功能的方法&#xff1a;1、创建conn.php文件连接人员信息数据库&#xff1b;2、创建index.php文件&#xff1b;3、通过“ if(isset($_POST[“flag”])){…}”等语句实现人员搜索功能即可。 1、首次登录需要输入访问的密码 <?php /*** 登录 **/ $mo…

git的基础总结

写在前面&#xff1a; 前天搞了个面试&#xff0c;发现好多都是会使用&#xff0c;但是要我说&#xff0c;难得说出来&#xff0c;现在对基础进行巩固总结。其实我感觉要求背出来一样的没必要吧&#xff0c;ide基本上可视化了会用就行吧。 文章目录 介绍git的状态 使用/安装/…

php使用PhpSpreadsheet导出Excel表格详解

本文会介绍php使用PhpSpreadsheet操作Excel&#xff0c;供大家参考&#xff0c;具体内容如下&#xff1a; PhpSpreadsheet介绍 1、简介 PhpSpreadsheet 是一个用纯PHP编写的库&#xff0c;提供了一组类&#xff0c;使您可以读取和写入不同的电子表格文件格式 PhpSpreadsheet …

Jetson查CPU/GPU等的占用情况——jtop的安装和使用

Jtop的安装 (1) 安装JTOP查看可查CPU等的占用情况 sudo apt-get updatesudo apt-get full-upgradesudo apt install curlsudo apt install nanocurl https://bootstrap.pypa.io/get-pip.py -o get-pip.py #下载安装脚本sudo python3 get-pip.py # 运行安装脚本sudo pip3 insta…

0401锁详解-MySQL-数据库

1 概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的问题&#x…

解决QtCreator安卓平台原生C++代码无法输出日志问题

1.需求,因原生C++调用std::cout ,std::cerr,及C函数prinf输出要显示在控制台, 问题: 在QtCreator中只看到qDebug输的日志,并没有看到 cout,cerr,printf的输出日志 2.最终已解决如下 在QtCreator中显示了C++原生日志 在Android Studio 的Logcat中显示了C++原生日志 模拟器 …

c++11 标准模板(STL)(std::basic_ostream)(三)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

印刷企业WMS仓储管理系统解决方案

在数字化转型的浪潮中&#xff0c;印刷企业也积极寻求适合自身发展的解决方案。作为印刷业的重要环节&#xff0c;仓储管理对于提高效率、降低成本至关重要。而印刷企业WMS仓储管理系统的应用&#xff0c;为印刷企业带来了全新的解决方案。 印刷WMS仓储管理系统是一种基于信息技…

简单认识Tomcat的部署和优化

文章目录 一、简单认识Tomcat1、简介2、构成3、Tomcat 功能组件结构4、Tomcat 请求过程&#xff1a; 二、Tomcat部署1.关闭防火墙&#xff0c;将安装 Tomcat 所需软件包传到/opt目录下2.安装JDK3.设置JDK环境变量4.测试java环境5.安装Tomcat6.启动和关闭Tomcat7.优化 tomcat 启…

synchronized锁升级以后会再降级吗?

Java对象头Markword的结构 其中&#xff0c;最低2位是10代表重量级锁&#xff0c;00代表轻量级锁&#xff0c;001代表无锁&#xff0c;101代表偏向锁。 synchronized锁在1.6的时候做了优化&#xff0c;当仅有一个线程竞争锁的时候&#xff0c;锁处于偏向锁的状态&#xff0c;当…

bim技术的发展趋势是哪些方向?

BIM在现阶段已经取得了较高的发展水平。尽管BIM在许多方面取得了显著进展&#xff0c;但仍有继续改进和发展的空间。未来&#xff0c;BIM在数字化转型、智能化应用和全生命周期管理方面的进一步推进将成为发展重点。简单聊聊BIM技术的发展趋势包括以下几个方向&#xff1a; BIM…