Linux-Linux零拷贝原理

Unity URP热扭曲效果实战:如何让半透明物体也‘动’起来(附完整Shader代码) 本文深入解析Unity URP管线中热扭曲效果无法影响半透明物体的核心原因,并提供一套完整的实战解决方案。通过编写自定义Shader,并巧妙利用URP的Render Objects渲染器功能,成功让指定半透明物体(如粒子特效)也能被扭曲效果影响,从而制作出火焰、热浪等更具视觉冲击力的特效。文末附有完整的Shader代码与进阶优化技巧。 阅读详情

这是译文 源文请参考源文。

到目前为止,几乎所有人都听说过Linux下所谓的零拷贝功能,但我经常遇到对这个主题没有完全了解的人。 正因为如此,我决定写几篇文章,深入探讨这个问题,希望能解开这个有用的特性。在这篇文章中,我们从一个用户的角度看零拷贝,血淋淋的内核级细节被有意省略。

什么是零拷贝?

为了更好地理解问题的解决方案,我们首先需要了解问题本身。让我们来看看网络服务器处理的简单过程中所涉及到的内容,它将存储在文件中的数据存储到网络上的客户端中。这里有一些示例代码:

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

看起来很简单;你会认为只有这两个系统调用不会有太多的开销. 事实上,这与事实并无太大的距离。在这两个调用的后面,数据至少被复制了4次,并且几乎已经执行了许多用户/内核上下文切换(实际上这个过程要复杂得多,但我想让它保持简单)。 为了更好地了解所涉及的过程,请看图1。顶部显示了上下文切换,而底部显示了复制操作。

图1。在两个示例系统调用中复制

步骤一:读系统调用会导致从用户模式到内核模式的上下文切换。第一个复制由DMA引擎执行,它读取磁盘中的文件内容并将其存储到内核地址空间缓冲区中。

第二步:将数据从内核缓冲区复制到用户缓冲区,read系统调用返回。调用的返回导致了从内核返回到用户模式的上下文切换,现在,数据存储在用户地址空间缓冲区中,它可以再次开始向下移动。

第三步:write系统调用导致从用户模式到内核模式的上下文切换,执行第三个复制,将数据再次放入内核地址空间缓冲区中。但是这一次,数据被放入一个不同的缓冲区,这个缓冲区是与套接字相关联的。

第四步:写系统调用返回,创建第四个上下文切换。DMA引擎将数据从内核缓冲区传递到协议engin时,第四个复制发生了独立和异步的情况。你可能会问自己,“你说的独立和异步是什么意思?”在调用返回之前,数据不是传输的吗?”  实际上,调用返回并不能保证传输;它甚至不能保证传输的开始。它只是意味着以太网驱动程序在其队列中有空闲的描述符并接受了我们的传输数据 ,在我们的之前可能会有很多的数据包在排队。除非驱动/硬件实现了优先级环或队列,否则数据将以先入先出的方式传输。(图1中派生的DMA copy表明了最后一个复制可以被延迟的事实)。

正如您所看到的,大量的数据复制并不是真正需要的。可以消除一些重复,以减少开销并提高性能。 作为一名驱动开发人员,我使用的硬件具有一些非常高级的特性。一些硬件可以完全绕过主存,直接将数据传输到另一个设备上。 该特性消除了系统内存中的复制,这是一件很好的事情,但并不是所有的硬件都支持它。还有一个问题是,磁盘上的数据必须重新打包以供网络使用,这带来了一些复杂的问题。 为了消除开销,我们可以从消除内核和用户缓冲区之间的一些复制开始。

消除复制的一种方法是跳过调用read和调用mmap。例如:

tmp_buf = mmap(file, len);
write(socket, tmp_buf, len);

为了更好地了解过程,请查看图2。上下文切换保持不变。

图2。调用mmap

第一步:mmap系统调用将文件内容复制到DMA引擎的内核缓冲区中。然后在用户进程中共享缓冲区,而不需要在内核和用户内存空间之间执行任何复制。

第二步:write系统调用导致内核将数据从原始内核缓冲区复制到与套接字关联的内核缓冲区中。

第三步:当DMA引擎将数据从内核套接字缓冲区传递到协议引擎时,第三次复制发生。

通过使用mmap而不是读取,我们将内核必须复制的数据量减少了一半。当大量数据被传输时,这将产生相当好的结果。然而,这种改进并不是没有代价的;使用mmap+write方法时存在一些隐藏的缺陷。当您的内存映射一个文件,然后调用write,而另一个进程截断相同的文件时,您将陷入其中之一。 您的write系统调用将被总线错误信号SIGBUS中断,因为您执行了一个糟糕的内存访问。该信号的默认行为是杀死进程并转储内核——而不是网络服务器最理想的操作。有两种方法可以解决这个问题。

第一种方法是为SIGBUS信号安装一个信号处理程序,然后在处理程序中简单地调用return。通过这样做,write系统调用将返回它在被中断之前所写的字节数,以及errno设置为成功。我必须指出,这将是一个糟糕的解决方案,一个治疗症状,而不是病根的解决方案。因为SIGBUS信号表明这个过程出现了严重的问题,所以我不建议使用这个作为解决方案。

第二个解决方案涉及文件租赁(在Microsoft Windows中称为“机会锁定”)。这是解决这个问题的正确方法。通过使用文件描述符上的租赁,你将在内核上租赁获取一个特定的文件。通过在文件描述符上使用租赁,可以在特定文件上使用内核进行租约。然后可以从内核请求读/写租约。 当另一个进程试图截断正在传输的文件时,内核会向您发送一个实时信号,即RT_SIGNAL_LEASE信号。它告诉您内核正在破坏您在该文件上的写或读租约。在程序访问一个无效的地址并被SIGBUS信号杀死之前,您的write调用会被中断。write调用的返回值是在中断之前写入的字节数,而errno将被设置为成功。下面是一些演示如何从内核获得租约的示例代码:

if(fcntl(fd, F_SETSIG, RT_SIGNAL_LEASE) == -1) {
    perror("kernel lease set signal");
    return -1;
}
/* l_type can be F_RDLCK F_WRLCK */
if(fcntl(fd, F_SETLEASE, l_type)){
    perror("kernel lease set type");
    return -1;
}

你应该在mmaping文件之前得到你的租约,并且在你完成之后将租约撕毁。这是通过使用F_UNLCK的租约类型调用fcntl F_SETLEASE实现的。

 

Sendfile

在内核版本2.1中,引入了sendfile系统调用,以简化网络和两个本地文件之间的数据传输。sendfile的引入不仅减少了数据复制,还减少了上下文切换。使用它是这样的:

sendfile(socket, file, len);

为了更好地了解过程,请查看图3。

图3。用Sendfile替换读和写。

第一步:sendfile系统调用将把文件内容复制到DMA引擎的内核缓冲区中。然后将数据复制到与套接字相关联的内核缓冲区中。

步骤二:当DMA引擎将数据从内核套接字缓冲区传递到协议引擎时,第三次复制发生。

您可能想知道,如果另一个进程截断了我们用sendfile系统调用发送的文件,会发生什么。如果我们不注册任何信号处理程序,sendfile调用只需返回它在被中断之前传输的字节数,而errno将被设置为成功。

如果我们在调用sendfile之前从文件的内核获得一个租约,但是,行为和返回状态完全相同。在sendfile调用返回之前,我们还获得了RT_SIGNAL_LEASE信号。

到目前为止,我们已经能够避免内核生成几个复制,但是我们仍然只剩下一个复制。这个可以避免吗? 当然,在硬件的帮助下。为了消除内核所做的所有数据复制,我们需要一个支持收集操作的网络接口。  这仅仅意味着等待传输的数据不需要在连续的内存中它可以分散在不同的内存位置。在内核版本2.4中,修改了套接字缓冲区描述符以适应这些需求——在Linux下称为零拷贝。这种方法不仅减少了多个上下文切换,还消除了处理器的数据复制。对于用户级应用程序,没有任何更改,因此代码仍然是这样:

sendfile(socket, file, len);

为了更好地了解过程,请查看图4。

图4。支持集合的硬件可以从多个内存位置组装数据,从而消除另一个复制。

第一步:sendfile系统调用将把文件内容复制到DMA引擎的内核缓冲区中。

第二步:没有将数据复制到套接字缓冲区中。相反,只有带有关于数据的位置和长度的信息的描述符被追加到套接字缓冲区。DMA引擎直接将数据从内核缓冲区传递到协议引擎,从而消除剩余的最终复制。

因为数据实际上仍然是从磁盘复制到内存和从存储器到导线,有些人可能会认为这不是一个真正的零拷贝。但是,这是从操作系统的角度来看是零拷贝,因为数据不是在内核缓冲区之间复制的。当使用零拷贝时,除了复制避免之外,还可以使用其他性能优势,例如更少的上下文切换、更少的CPU数据缓存污染和没有CPU校验和计算。

SpringBoot整合JWT实战:从零构建无状态认证系统,详解Token生成、验证与安全最佳实践 JWT在SpringBoot中的实现与应用 摘要:本文介绍了JWT(JSON Web Token)的基本概念、与Session机制的对比,以及SpringBoot项目中JWT的整合实现。JWT由Header、Payload和Signature三部分组成,具有无状态、跨域支持等优势。文章详细展示了如何在SpringBoot项目中配置JWT环境,封装JWT工具类来实现Token的生成、解析和验证功能,包括密钥管理、自定义声明、签名验证等核心操作。通过对比表格和生活化比喻,帮助读者理解JWT与传统Session的 阅读详情

相关推荐

RK3588 MIPI屏幕调试避坑指南:双通道8Lane下DSC压缩屏的花屏、分层问题排查实录

本文详细解析了RK3588平台在双通道8Lane MIPI接口下调试DSC压缩屏时遇到的花屏、分层问题。通过硬件信号完整性检查、软件配置验证及帧数据分析,提供了一套系统化的排查方法,并深入探讨了初始化序列优化和双通道同步机制,帮助工程师高效解决高分辨率屏幕显示异常问题。

weixin_27015733的博客 282

Linux零拷贝解析

零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域(例:CPU拷贝数据从内核缓冲区到用户缓冲区),从而可以减少CPU上下文切换以及 CPU 的拷贝时间。

weixin_52383177的博客 2975

【AIGC】COT思维链:让AI学会拆解问题,像人一样思考

COT思维链的出现,为AI的发展开辟了一条新的道路。它让AI学会了像人类一样思考,将复杂问题分解成简单的步骤,并逐步推理出最终答案。希望我的引导会对你产生启发。

智兔唯新的博客 9003

Linux零拷贝

例如,可以使用零拷贝将数据从磁盘直接传输到查询结果的内存缓存中,减少数据的复制操作和提高查询性能。使用零拷贝的主要目的是提高数据传输的性能和效率。通过减少数据的拷贝次数和数据移动,可以降低CPU和内存的消耗,减少数据传输的延迟,并提高系统的整体吞吐量。1. TCP/IP协议栈:零拷贝技术被广泛应用于网络数据传输中,例如在发送数据时,可以使用零拷贝将数据直接从用户空间传输到网络设备,提高网络传输性能。需要注意的是,零拷贝技术的实现需要操作系统和硬件的支持,而且它并不适用于所有的场景。

summer_fish的专栏 1335

如何创建 SAP ABAP CDS View 的 Association

所以本文我们虽然学习了如何创建 SAP CDS View 的 association,知道了 association 是用来在 CDS View 里将两张数据库表关联起来,但根本不知道怎么使用这个 association. 而且从 association 的写法来看,似乎和本教程之前介绍 inner join,left join 这些数据库表的连接操作没什么区别,都是根据两张表的 carrid 和 connid 字段相同进行的连接。只看到了我们在 CDS View 源代码实现里,放出来的四个字段。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 906

【RKNN】RKNN(Rockchip Neural Network)​​ 的详解

RKNN 为 Rockchip 硬件提供了高效的 AI 推理解决方案,适合需要低功耗、实时响应的边缘场景

浩瀚之水的专栏 1689

linux dma拷贝数据到用户态,图解:零拷贝Zero-Copy技术大揭秘

1.前言像大白这种调包侠,深知不懂底层技术点就如同空中楼阁,再这样下去面阿里p10是没希望了。想到这里,我开始慌了,所以今天和大家一起学习个底层技术点-零拷贝Zero-Copy。Linux系统中一切皆文件,仔细想一下Linux系统的很多活动无外乎读操作和写操作,零拷贝就是为了提高读写性能而出现的。废话不多说,马上开大车,走起!2. 数据拷贝基础过程在Linux系统内部缓存和内存容量都是有限的,更多...

weixin_32452127的博客 1427

【GameFramework框架内置模块】2、数据节点(Data Node)

这一篇讲数据节点DataNode,基本开发程序都会有类似数据节点作用的东西,数据节点的作用其实就是保存游戏运行时的一些缓存数据,比如用户登录信息、用户名、任务节点等等。数据一般会有增删改查这四种操作,在运行时的数据一般是使用单例或者静态属性,将数据存储在内存中而数据节点也是将数据存储在内存中,但是不用序列化数据,比使用单例或者静态属性要容易维护的多,特别时它的树形结构可以让我们很好的组织我们的数据结构,方便做增删改查操作。数据节点DataNode模块的数据的存储方式是以树形结构存储。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 3187

聊聊消息队列高性能的秘密——零拷贝技术

前言 RocketMQ为什么这么快、Kafka为什么这么快?用了零拷贝技术?什么是零拷贝技术,它们二者的零拷贝技术有不同吗? 为什么需要零拷贝 在计算机产业中,I/O的速度相较CPU,总是太慢的。SSD硬盘的IOPS可以达到2W、4W,但是我们CPU的主频有2GHz以上,也就意味着每秒会有20亿次的操作。如果对于I/O操作,都是由CPU发出对应的指令,然后等待I/O设备完成操作之后返回,那CPU有大量的时间其实都是在等待I/O设备完成操作。但是,这个 CPU 的等待,在很多时候,其实并没有太多的实际意

wdj0311的博客 4900

【目标追踪】python背景模型减除法原理及其实现

python基于背景模型差法的视频目标追踪帧差法的问题:背景模型差法目标追踪原理1. 基本思路:2. 图例讲解:3. 存在的问题&如何解决:4. 最终效果预览第一步——调用摄像头:1. 使用opencv打开视频or摄像头:2. 读取逐帧图片:第二步——处理图片:1. 转换成灰度图:3. 累加权重重构背景:3. 计算像素差:3. 使用中值滤波和膨胀腐蚀去噪:3.1 中值滤波:3.2 图像腐蚀...

梁瑛平的博客 1948

YOLOv8多传感器融合技术——摄像头阵列融合技术详解

本文详细介绍了基于YOLOv8的摄像头阵列融合技术,该技术通过多摄像头协同工作实现360度无死角环境感知。文章阐述了系统原理,包括全方位视野覆盖、冗余设计和深度感知等优势,并提供了完整的Python实现代码。关键技术涵盖多摄像头检测、立体匹配、3D投影和目标融合等模块,支持时间域融合提升稳定性。该系统可显著提高自动驾驶的环境感知能力,减少检测盲区,增强系统可靠性,是L4-L5级自动驾驶的关键技术之一。文章还展示了城市驾驶场景的实际应用,验证了该技术对复杂交通环境的适应能力。

u010117029的博客 214

【linux】图文并茂|彻底搞懂零拷贝(Zero-Copy)技术

Linux系统中一切皆文件,仔细想一下Linux系统的很多活动无外乎读操作和写操作,零拷贝就是为了提高读写性能而出现的。2. 数据拷贝基础过程在Linux系统内部缓存和内存容量都是有限的,更多的数据都是存储在磁盘中。对于Web服务器来说,经常需要从磁盘中读取数据到内存,然后再通过网卡传输给用户:上述数据流转只是大框,接下来看看几种模式。2.1 仅CPU方式当应用程序需要读取磁盘数据时,调用read()从用户态陷入内核态,read()这个系统调用最终由CPU来完成;

木牛的博客 506

IgH EtherCAT 从入门到精通:第 19 章 主站状态机(FSM)深度解析

文章摘要:IgH EtherCAT主站采用多层次有限状态机(FSM)架构实现总线管理。核心是Master FSM,负责总线扫描、从站配置和邮箱通信,通过函数指针状态机模式实现异步非阻塞操作。系统包含多个嵌套FSM:Slave FSM管理单个从站请求,Slave Scan FSM处理拓扑变化扫描,Slave Config FSM配置从站状态转换,Change FSM执行AL状态切换。这种设计通过状态函数指针转换实现复杂协议交互,各FSM协同工作完成EtherCAT网络的初始化、配置和实时通信,支持热插拔和错误

从事嵌入式linux android驱动开发,拥有全栈能力 147

Linux零拷贝原理

转载 引言 传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。这样做最大的好处是可以减少磁盘 I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘 I/O 操作。但是数据传输过程中的数据拷贝操作却导致了极大的 CPU 开销,限制了操作系统有效进行数据传输操作的能力。 零拷贝( zero-copy )技术可以有效地改善数据传输的性能,在内

qq_41945905的博客 215

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

框架篇:小白也能秒懂的Linux零拷贝原理

大白话解释,零拷贝就是没有把数据从一个存储区域拷贝到另一个存储区域。但是没有数据的复制,怎么可能实现数据的传输呢?其实我们在java NIO、netty、kafka遇到的零拷贝,并不是不复制数据,而是减少不必要的数据拷贝次数,从而提升代码性能零拷贝的好处内核空间和用户空间缓冲区和虚拟内存传统的 I/Ommap+write 实现的零拷贝sendfile 实现的零拷贝带有DMA收集拷贝功能的sendfile实现的零拷贝java提供的零拷贝方式。

m0_50180963的博客 674

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深入剖析Linux IO原理和几种零拷贝机制的实现

前言 零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及 CPU 的拷贝时间。它的作用是在数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现 CPU 的零参与,彻底消除 CPU 在这方面的负载。实现零拷贝用到的最主要技术是 DMA 数据传输技术和内存区域映射技术。 ...

陌上轩客 1196

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

有必要了解一下Linux中零拷贝原理 | NIO零拷贝技术实践

来源:Java爱好者社区本文导读:什么是零拷贝传统 IO 数据拷贝原理什么是 DMAsendfile 数据零拷贝原理mmap 数据零拷贝原理Java 中 NIO 零拷贝实...

Java笔记虾 440

Linux IO原理和零拷贝机制

目录 1 概述 2Linux I/O读写方式 2.1I/O中断原理 2.2. DMA传输原理 2.3传统I/O方式 3零拷贝方式 3.1用户态直接I/O 3.2 mmap + write 3.2sendfile 3.4sendfile + DMA gather copy 3.5splice 3.6 写时复制 3.7Linux零拷贝对比 1 概述 ...

destiny的专栏 955

linux零拷贝原理

大白话解释,零拷贝就是没有把数据从一个存储区域拷贝到另一个存储区域。但是没有数据的复制,怎么可能实现数据的传输呢?其实我们在java NIO、netty、kafka遇到的零拷贝,并不是不复制数据,而是减少不必要的数据拷贝次数,从而提升代码性能 零拷贝的好处 内核空间和用户空间 缓冲区和虚拟内存 传统的 I/O mmap+write 实现的零拷贝 sendfile 实现的零拷贝 带有DMA收集拷贝功能的sendfile实现的零拷贝 java提供的零拷贝方式 零拷贝的好处 减少或避免不必要的CPU数据拷贝,从而

wangzhipeng47的博客 272

Linux 零拷贝技术:原理、实现与应用场景

Linux 零拷贝技术:原理、实现与应用场景

2401_85199775的博客 1657

面试官:linux零拷贝的原理是什么?

1.前言 像大白这种调包侠,深知不懂底层技术点就如同空中楼阁,再这样下去面阿里p10是没希望了。 想到这里,我开始慌了,所以今天和大家一起学习个底层技术点-零拷贝Zero-Copy。 Linux系统中一切皆文件,仔细想一下Linux系统的很多活动无外乎读操作和写操作,零拷贝就是为了提高读写性能而出现的。 废话不多说,马上开大车,走起! 数据拷贝基础过程 在Linux系统内部缓存和内存容量都是有限的,更多的数据都是存储在磁盘中。对于Web服务器来说,经常需要从磁盘中读取数据到内存,然后再通过网卡传输给用

CRMEB小程序商城的博客 3492

linux dma 拷贝内存数据_有必要了解一下Linux中零拷贝原理 | NIO零拷贝技术实践

来源:Java爱好者社区本文导读:什么是零拷贝传统 IO 数据拷贝原理什么是 DMAsendfile 数据零拷贝原理mmap 数据零拷贝原理Java 中 NIO 零拷贝实现JavaIO 与 NIO 实战案例分析什么是零拷贝关于零拷贝,WIKI 上给出的定义如下:「Zero-copy」 describes computer operations in which the CPU does...

weixin_39942037的博客 326
上一篇: 算法-trie树
下一篇: java-源码解读-jdk1.6-LinkedHashMap与HashMap
aBOUNTWINTER
博客等级 码龄16年 42粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值