Linux 零拷贝技术

news2025/4/21 19:54:18

一、传统做法,经历“四次拷贝”

数据 1.读取到内核缓冲区 2.拷贝到用户缓冲区 3.写入到内核缓冲区 4.拷贝到网卡
传统数据传输“四次拷贝”

使用 DMA,减少2次拷贝,还剩2次拷贝

DMA 负责硬盘到内核缓冲区和内核到网卡的传输。
CPU 仍需处理内核和用户缓冲区之间的数据传输。
DMA减少2次拷贝

二、Linux 四种零拷贝技术

需硬件支持 DMA (Direct Memory Access,直接内存访问) 一种让数据在硬盘和内存之间直接传输的技术,不需要 CPU 逐字节参与

方法描述CPU 参与度适用场景
sendfile直接发送文件数据到套接字,无需拷贝到用户空间极少,数据直接传输文件服务器、视频流传输等大文件场景
splice在内核空间内高效地在文件描述符之间传输数据。极少,完全在内核内文件、管道与 socket 之间的复杂传输场景
mmap + write映射文件到内存,用 write 发送数据,灵活处理数据中等,需要映射和写入数据需要处理或修改的场景,如压缩加密
tee将管道中的数据复制到另一个管道,无需消耗原始数据。极少,内核中数据复制日志处理、实时数据监控等多目标场景

Linux 零拷贝技术

2.1 sendfile 文件式零拷贝

sendfile 最早引入,专为高效传输大文件的情况。例如文件服务器流媒体传输备份系统等。
sendfile零拷贝

int input_fd = open("input.txt", O_RDONLY);
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
bind(server_fd, (struct sockaddr *)&address, sizeof(address));
listen(server_fd, 3);
int client_fd = accept(server_fd, NULL, NULL);
//
sendfile(client_fd, input_fd, NULL, 1024);
//
close(input_fd);
close(client_fd);
close(server_fd);

2.2 splice 管道式零拷贝

在不同类型文件描述符之间高效直接移动数据。实现复杂数据流向控制。
例如从文件到网络 socket 的传输,或在文件、管道和 socket 之间传递数据
在这里插入图片描述

int input_fd = open("input.txt", O_RDONLY);
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
bind(server_fd, (struct sockaddr *)&address, sizeof(address));
listen(server_fd, 3);
int client_fd = accept(server_fd, NULL, NULL);
//
splice(input_fd, NULL, client_fd, NULL, 1024, SPLICE_F_MORE);
//
close(input_fd);
close(client_fd);
close(server_fd);

2.3 mmap + write:映射式零拷贝

提供了更大的灵活性,允许在用户态访问数据内容。
适用于发送数据前对文件进行预处理的场景(如压缩、加密或者数据转换等)
使用 mmap 将文件数据映射到进程的虚拟地址空间,避免显式的数据拷贝。
通过 write 直接将映射的内存区域数据发送到目标文件描述符(如网络 socket)

在这里插入图片描述

int input_fd = open("input.txt", O_RDONLY);
struct stat file_stat;
fstat(input_fd, &file_stat);
// 映射
char *mapped = mmap(NULL, file_stat.st_size, PROT_READ, MAP_PRIVATE, input_fd, 0);

int server_fd = socket(AF_INET, SOCK_STREAM, 0);
bind(server_fd, (struct sockaddr *)&address, sizeof(address));
listen(server_fd, 3);
int client_fd = accept(server_fd, NULL, NULL);
write(client_fd, mapped, file_stat.st_size);
//
munmap(mapped, file_stat.st_size);
close(input_fd);
close(client_fd);
close(server_fd);

2.4 tee: 复制式零拷贝

把一个管道中数据复制到另一管道,同时保留原管道中数据。这意味着数据可以同时被发送到多个目标,且不影响原来的数据流,
非常适合日志记录实时数据分析等需要把同样的数据送往不同地方的场景

int pipe_fd[2];
pipe(pipe_fd);

int server_fd = socket(AF_INET, SOCK_STREAM, 0);
bind(server_fd, (struct sockaddr *)&address, sizeof(address));
listen(server_fd, 3);
int client_fd = accept(server_fd, NULL, NULL);
// 使用 tee 复制数据
tee(pipe_fd[0], pipe_fd[1], 1024, 0); //复制管道中的数据
splice(pipe_fd[0], NULL, client_fd, NULL, 1024, SPLICE_F_MORE); //发送到socket

close(pipe_fd[0]);
close(pipe_fd[1]);
close(client_fd);
close(server_fd);

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

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

相关文章

【完整版】DeepSeek-R1大模型学习笔记(架构、训练、Infra)

文章目录 0 DeepSeek系列总览1 模型架构设计基本参数专家混合模型(MoE)[DeepSeek-V2提出, DeepSeek-V3改良]多头潜在注意力(MLA)[DeepSeek-V2提出]多token预测(MTP)[DeepSeek-V3提出] 2 DeepSeek-R1-Zero及…

数据结构(1)——算法时间复杂度与空间复杂度

目录 前言 一、算法 1.1算法是什么? 1.2算法的特性 1.有穷性 2.确定性 3.可行性 4.输入 5.输出 二、算法效率 2.1衡量算法效率 1、事后统计方法 2、事前分析估计方法 2.2算法的复杂度 2.3时间复杂度 2.3.1定义 2.3.2大O渐进表示法 2.3.3常见时间复…

uniapp小程序自定义中间凸起样式底部tabbar

我自己写的自定义的tabbar效果图 废话少说咱们直接上代码,一步一步来 第一步: 找到根目录下的 pages.json 文件,在 tabBar 中把 custom 设置为 true,默认值是 false。list 中设置自定义的相关信息, pagePath&#x…

C++编程语言:抽象机制:模板(Bjarne Stroustrup)

目录 23.1 引言和概观(Introduction and Overview) 23.2 一个简单的字符串模板(A Simple String Template) 23.2.1 模板的定义(Defining a Template) 23.2.2 模板实例化(Template Instantiation) 23.3 类型检查(Type Checking) 23.3.1 类型等价(Type Equivalence) …

DeepSeek-VL2论文解读:用于高级多模态理解的专家混合视觉语言模型

github:https://github.com/deepseek-ai/DeepSeek-VL2 paper: https://github.com/deepseek-ai/DeepSeek-VL2/blob/main/DeepSeek_VL2_paper.pdf 大型视觉语言模型(VLMs)已经成为人工智能领域的变革性力量,将大型语言模型(LLMs&…

第二个Qt开发实例:在Qt中利用GPIO子系统和sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口(效果为LED2灯的灭和亮)

引言 本文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145420998 里的代码,在那里面代码的基础上添加上利用sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口的代码,进而实现LED2灯的灭和亮。 最终的效果是点击下面的LED按钮实现LED…

Day37-【13003】短文,串的基本概念,匹配算法,算法时间复杂度,真题训练

文章目录 第二节 串串的基本概念串的模式匹配朴素的模式匹配算法(BF算法)算法最坏时间复杂度O(n x m) 改进的模式匹配算法(KMP算法)特征向量next,来确定k值特征向量next的算法实现 算法最坏时间复杂度O(n)进一步改进next值的计算,简化步骤 第四章真题真题…

陷入闭包:理解 React 状态管理中的怪癖

TLDR 闭包就像函数随身携带的背包,包含它们创建时的数据React 组件使用闭包来记住它们的状态和属性过时的闭包可能导致状态更新不如预期时的错误函数式更新提供了一个可靠的方式来处理最新状态 简介 你是否曾经疑惑过,为什么有时你的 React 状态更新不…

【SRC排名】安全应急响应中心SRC上榜记录

2023年 新氧第三 https://security.soyoung.com/top 合合第四 https://security.intsig.com/index.php?m&chall&aindex 2024年 好未来第一 https://src.100tal.com/index.php?m&chall&aindex(官网是总榜,年榜只有海报)…

Linux——基础命令1

$:普通用户 #:超级用户 cd 切换目录 cd 目录 (进入目录) cd ../ (返回上一级目录) cd ~ (切换到当前用户的家目录) cd - (返回上次目录) pwd 输出当前目录…

OSPF基础(1):工作过程、状态机、更新

OSPF基础 1、技术背景(与RIP密不可分,因为RIP中存在的问题) RIP中存在最大跳数为15的限制,不能适应大规模组网周期性发送全部路由信息,占用大量的带宽资源以路由收敛速度慢以跳数作为度量值存在路由环路可能性每隔30秒…

【目标检测】模型验证:K-Fold 交叉验证

K-Fold 交叉验证 1、引言1.1 K 折交叉验证概述 2、配置2.1 数据集2.2 安装包 3、 实战3.1 生成物体检测数据集的特征向量3.2 K 折数据集拆分3.3 保存记录3.4 使用 K 折数据分割训练YOLO 4、总结 1、引言 我们将利用YOLO 检测格式和关键的Python 库(如 sklearn、pan…

Unity 2D实战小游戏开发跳跳鸟 - 计分逻辑开发

上文对障碍物的碰撞逻辑进行了开发,接下来就是进行跳跳鸟成功穿越过障碍物进行计分的逻辑开发,同时将对应的分数以UI的形式显示告诉玩家。 计分逻辑 在跳跳鸟通过障碍物的一瞬间就进行一次计分,计分后会同步更新分数的UI显示来告知玩家当前获得的分数。 首先我们创建一个用…

京准:NTP卫星时钟服务器对于DeepSeek安全的重要性

京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 在网络安全领域,分布式拒绝服务(DDoS)攻击一直是企业和网络服务商面临的重大威胁之一。随着攻击技术的不断演化…

Android学习20 -- 手搓App2(Gradle)

1 前言 昨天写了一个完全手搓的:Android学习19 -- 手搓App-CSDN博客 后面谷歌说不要用aapt,d8这些来搞。其实不想弄Gradle的,不过想着既然开始了,就多看一些。之前写过一篇Gradle,不过是最简单的编译,不涉…

车型检测7种YOLOV8

车型检测7种YOLOV8,采用YOLOV8NANO训练,得到PT模型,转换成ONNX,然后OPENCV的DNN调用,支持C,python,android开发 车型检测7种YOLOV8

IDEA 中集成 Maven,配置环境、创建以及导入项目

目录 在 IntelliJ IDEA 中集成 Maven 并配置环境 1. 打开 IDEA 设置 2. 定位 Maven 配置选项 3. 配置 Maven 路径 4. 应用配置 创建 Maven 项目 1. 新建项目 2. 选择项目类型 3. 配置项目信息 4. 确认 Maven 设置 5. 完成项目创建 导入 Maven 项目 1. 打开导入窗口…

react关于手搓antd pro面包屑的经验(写的不好请见谅)

我们先上代码,代码里面都有注释,我是单独写了一个组件,方便使用,在其他页面引入就行了 还使用了官方的Breadcrumb组件 import React, { useEffect, useState } from react; import { Breadcrumb, Button } from antd; import { …

[含文档+PPT+源码等]精品大数据项目-Django基于大数据实现的心血管疾病分析系统

大数据项目-Django基于大数据实现的心血管疾病分析系统背景可以从以下几个方面进行阐述: 一、项目背景与意义 1. 心血管疾病现状 心血管疾病是当前全球面临的主要健康挑战之一,其高发病率、高致残率和高死亡率严重威胁着人类的生命健康。根据权威机构…

【Rust自学】19.5. 高级类型

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 19.5.1.使用newtype模式实现类型安全和抽象 在 19.2. 高级trait 中(具体来说是…