当前位置: 首页 > news >正文

Linux笔记之使用系统调用sendfile高速拷贝文件

Linux笔记之使用系统调用sendfile高速拷贝文件

code review!

文章目录

  • Linux笔记之使用系统调用sendfile高速拷贝文件
    • `sendfile` 性能优势
    • `sendfile` 系统调用
      • 优点:
      • 缺点:
    • `cp` 命令
      • 优点:
      • 缺点:
    • 实际测试:拷贝5.8个G的文件,cp使用25s,sendfile只用7.49s,快了四倍

sendfile 系统调用是 Linux 特有的函数,用于在两个文件描述符之间直接传输数据。这可以减少用户态和内核态之间的数据拷贝,从而提高文件拷贝的性能。sendfile 通常比使用普通的 readwrite 系统调用更快,尤其是在处理大文件时。

sendfile 性能优势

  1. 减少数据拷贝sendfile 在内核内直接把数据从一个文件描述符传输到另一个文件描述符,而不需要将数据从内核态拷贝到用户态再拷贝回内核态。
  2. 减少系统调用的开销:对于大文件拷贝,sendfile 只需要一次系统调用,而传统方法可能需要多次 readwrite 调用。
  3. 更少的上下文切换:由于减少了系统调用次数,sendfile 也减少了用户态和内核态之间的上下文切换。

sendfile 系统调用

sendfile 它主要用于网络传输,但也可以用于文件复制。sendfile 的设计目的是减少数据复制的次数,从而提高性能。

优点:

  1. 减少上下文切换: sendfile 可以直接在内核空间处理数据传输,避免了用户空间和内核空间之间的上下文切换。
  2. 高效: 它可以减少内存拷贝的次数,因为数据不需要从内核空间拷贝到用户空间再回到内核空间。
  3. 适合大文件传输: 对于大文件传输,sendfile 可以显著减少 CPU 占用和提高传输速度。

缺点:

  1. 灵活性较低: sendfile 主要用于文件描述符之间的传输,不如一些用户空间的工具灵活。
  2. 依赖于内核版本: sendfile 的性能和功能可能会受到内核版本的影响。

cp 命令

cp 是一个用户空间工具,用于复制文件和目录。它使用标准的文件 I/O 操作来实现文件复制。

优点:

  1. 易用性: cp 命令简单易用,支持各种选项,可以处理复杂的文件复制需求。
  2. 广泛支持: 几乎所有的 Unix/Linux 系统都支持 cp 命令,且不依赖于特定的内核版本。
  3. 灵活: cp 命令支持递归复制、保留文件属性等多种操作。

缺点:

  1. 性能较低: 由于 cp 命令在用户空间运行,涉及多次上下文切换和内存拷贝,性能可能不如 sendfile
  2. 高 CPU 使用率: 对于大文件复制,cp 命令可能会占用较高的 CPU 资源。

实际测试:拷贝5.8个G的文件,cp使用25s,sendfile只用7.49s,快了四倍

在这里插入图片描述

代码

#include <sys/sendfile.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <chrono>
#include <sys/stat.h>bool copyFileSendfile(const std::string& src, const std::string& dest) {int source = open(src.c_str(), O_RDONLY);int destination = open(dest.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644);if (source < 0 || destination < 0) {std::cerr << "Error opening files!" << std::endl;return false;}struct stat stat_buf;fstat(source, &stat_buf);off_t offset = 0;auto start = std::chrono::high_resolution_clock::now();if (sendfile(destination, source, &offset, stat_buf.st_size) == -1) {std::cerr << "Error using sendfile!" << std::endl;close(source);close(destination);return false;}auto end = std::chrono::high_resolution_clock::now();close(source);close(destination);std::chrono::duration<double> duration = end - start;std::cout << "Sendfile copy took " << duration.count() << " seconds" << std::endl;return true;
}int main(int argc, char* argv[]) {if (argc != 3) {std::cerr << "Usage: " << argv[0] << " <source_file> <destination_file>" << std::endl;return 1;}std::string sourceFile = argv[1];std::string destinationFile = argv[2];if (copyFileSendfile(sourceFile, destinationFile)) {std::cout << "File copied successfully!" << std::endl;} else {std::cerr << "File copy failed!" << std::endl;return 1;}return 0;
}

编译

g++ main.cpp -o main

相关文章:

Linux笔记之使用系统调用sendfile高速拷贝文件

Linux笔记之使用系统调用sendfile高速拷贝文件 code review! 文章目录 Linux笔记之使用系统调用sendfile高速拷贝文件sendfile 性能优势sendfile 系统调用优点&#xff1a;缺点&#xff1a; cp 命令优点&#xff1a;缺点&#xff1a; 实际测试&#xff1a;拷贝5.8个G的文件&a…...

OpenCV和PIL进行前景提取

摘要 在图像处理和分析中&#xff0c;前景提取是一项关键技术&#xff0c;尤其是在计算机视觉和模式识别领域。本文介绍了一种结合OpenCV和PIL库的方法&#xff0c;实现在批量处理图像时有效提取前景并保留原始图像的EXIF数据。具体步骤包括从指定文件夹中读取图像&#xff0c…...

Linux虚拟化大师:使用 KVM 和 QEMU 进行高级虚拟化管理

Linux 虚拟化大师&#xff1a;使用 KVM 和 QEMU 进行高级虚拟化管理 虚拟化技术是现代数据中心的核心技术之一&#xff0c;它可以将一台物理服务器分割成多个虚拟机&#xff0c;从而提高资源利用率&#xff0c;降低成本&#xff0c;并增强系统的灵活性和可扩展性。KVM&#xf…...

CentOS-6的iso下载地址镜像yum源

CentOS6下载地址镜像yum源 从 CentOS官网 Vault Mirror 过期镜像库下载 下载iso光盘镜像,使用其提供的yum源 vault:保险库,墓穴 , Vault Mirror 是官方对过期镜像库的取名 CentOS官网 Vault Mirror 过期镜像库 可下载CentOS2,3,4,5,6,7,8 CentOS-Vault.repo对应的是发行该镜…...

【python】PyQt5可视化开发,鼠标键盘实现联动界面交互逻辑与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

Raw Socket(一)实现TCP三次握手

实验环境&#xff1a; Windows物理机&#xff1a;192.168.1.4 WSL Ubuntu 20.04.6 LTS&#xff1a;172.19.32.196 Windows下的一个http服务器&#xff1a;HFS&#xff0c;大概长这个样子&#xff1a; 客户端就是Ubuntu&#xff0c;服务端就是这个…...

考研数学开始的晚?别慌,超全复习规划拿去抄

实话实说&#xff0c;从七月中旬考研数一复习完真的有点悬&#xff0c;需要超级高效快速... 数二的时间也有点紧张...&#x1f97a; 中间基本没有试错的时间&#xff0c;让你换老师换习题尝试&#xff0c;必须从头到尾规划好 而且相信你也不止自己&#xff0c;有很多考研党都是…...

创建React 项目的几种方式

①.react自带脚手架 使用步骤&#xff1a; 1、下载 npm i create-react-app -g 2、创建项目命令&#xff1a; create-react-app 项目名称 ②.Vite构建工具创建react步骤&#xff1a;&#xff08;推荐&#xff09; 方法一&#xff1a; 1、yarn create vite 2、后续根据提示步…...

探索Kotlin:从K1到K2

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 嘿&#xff0c;小伙伴们&#xff01;今天我们来聊聊Kotlin&#xff0c;这个在安卓开发圈里越来越火的编程语言。…...

Python爬虫速成之路(1):获取网页源代码

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…...

OpenGL笔记七之顶点数据绘制命令和绘制模式

OpenGL笔记七之顶点数据绘制命令和绘制模式 —— 2024-07-07 杭州 下午 总结自bilibili赵新政老师的教程 code review! 文章目录 OpenGL笔记七之顶点数据绘制命令和绘制模式1.OpenGL版本号更改和编译更改2.GL_TRIANGLES模式绘制一个三角形、支持NFC坐标随窗口缩放2.1.三个点…...

力扣题解( 最长湍流子数组)

978. 最长湍流子数组 已解答 给定一个整数数组 arr &#xff0c;返回 arr 的 最大湍流子数组的长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转&#xff0c;则该子数组是 湍流子数组 。 更正式地来说&#xff0c;当 arr 的子数组 A[i], A[i1], ..., A[j] 满足仅满…...

pytorch-RNN存在的问题

这里写目录标题 1. RNN存在哪些问题呢&#xff1f;1.1 梯度弥散和梯度爆炸1.2 RNN为什么会出现梯度弥散和梯度爆炸呢&#xff1f; 2. 解决梯度爆炸方法3. Gradient Clipping的实现4. 解决梯度弥散的方法 1. RNN存在哪些问题呢&#xff1f; 1.1 梯度弥散和梯度爆炸 梯度弥散是…...

Leetcode 17:电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 public List<String> letterCombinations(String digits) {if (digits null || digits.length() 0) {return result;}int index0; //记录遍历digits的角标//初始…...

jmeter-beanshell学习4-beanshell截取字符串

再写个简单点的东西&#xff0c;截取字符串&#xff0c;参数化文件统一用csv&#xff0c;然后还要用excel打开&#xff0c;如果是数字很容易格式就乱了。有同事是用双引号把数字引起来&#xff0c;报文里就不用加引号了&#xff0c;但是这样beanshell处理起来&#xff0c;好像容…...

QScrollArea 设置最大的高度值

在 Qt 中&#xff0c;QScrollArea 是一个提供滚动视图的控件&#xff0c;允许用户查看大于当前视口尺寸的内容。如果你想要为 QScrollArea 设置一个最大的高度值&#xff0c;这通常不是直接通过 QScrollArea 的属性来设置的&#xff0c;而是需要调整其内容部件&#xff08;widg…...

CentOS6禁止锁屏

在电源中设置后还是会锁屏, 原因是有屏幕保护程序 电源管理都 “从不” 一些AI的回答 在CentOS 6系统中&#xff0c;如果你想要禁用锁屏功能&#xff0c;可以编辑/etc/kbd/config文件。这个文件通常包含了键盘相关的设置&#xff0c;包括密码策略和屏幕锁定选项。 首先打开终…...

MapReduce底层原理详解:大案例解析(第32天)

系列文章目录 一、MapReduce概述 二、MapReduce工作机制 三、Map&#xff0c;Shuffle&#xff0c;reduce阶段详解 四、大案例解析 文章目录 系列文章目录前言一、MapReduce概述二、MapReduce工作机制1. 角色与组件2. 作业提交与执行流程1. 作业提交&#xff1a;2. Map阶段&…...

【JVM基础篇】Java垃圾回收器介绍

垃圾回收器&#xff08;垃圾回收算法实现&#xff09; 垃圾回收器是垃圾回收算法的具体实现。由于垃圾回收器分为年轻代和老年代&#xff0c;除了G1&#xff08;既能管控新生代&#xff0c;也可以管控老年代&#xff09;之外&#xff0c;新生代、老年代的垃圾回收器必须按照ho…...

java通过poi-tl导出word实战详细步骤

文章目录 与其他模版引擎对比1.引入maven依赖包2.新建Word文档exportWprd.docx模版3.编写导出word接口代码4.导出成果 poi-tl是一个基于Apache POI的Word模板引擎&#xff0c;也是一个免费开源的Java类库&#xff0c;你可以非常方便的加入到你的项目中&#xff0c;并且拥有着让…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...