也谈零拷贝(一) 抛砖篇

八股已死、场景当立(网关篇) 本文系统梳理了微服务网关的核心知识点,主要内容包括:1)网关的核心价值,如统一管控、协议转换、流量治理等;2)Netty异步非阻塞模型的性能优势;3)动态路由、JWT鉴权、熔断限流等高可用方案;4)灰度发布、文件上传优化等实践技巧;5)高可用集群设计、安全防护等关键问题。文章通过对比分析Servlet/Netty、Sentinel/Hystrix等技术方案,结合代码示例,为开发者提供了全面的网关架构设计指南。 阅读详情

首先,如果读者之前不熟悉什么是零拷贝,请参考下面的链接:      

Linux中的零拷贝技术,第1部分               

http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/index.html

Linux中的零拷贝技术,第2部分

http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy2/index.html

通过零拷贝实现有效数据传输

http://www.ibm.com/developerworks/cn/java/j-zerocopy/

    链接里给出的文章已经很好的说明了零拷贝的概念和作用(即更有效地实现数据传输),以及如何实现零拷贝。下面我们一步步地来看看普通情况下数据的发送和接收流程和使用零拷贝技术情况下数据的发送和接收流程到底有何区别,从而进一步理解零拷贝的含义及其优点。

 

一、数据传输:传统方法

考虑一下从一个磁盘文件中读出数据并将数据传输到网络上另一程序的场景(这个场景表述出了很多服务器应用程序的行为,包括提供静态内容的 Web应用程序、FTP服务器、邮件服务器等)。

             

                                   图  1

数据传输从读磁盘文件开始到数据到达网卡为止,整个过程描述如下:

 

             

                                图  2

Step1: read()调用引发了第一次从用户模式到内核模式的上下文切换。在内部,发出 sys_read()(或等效内容)从文件中读取数据。DMA引擎执行了第一次拷贝/复制,它从磁盘中读取文件内容,然后将它们存储到一个内核地址空间缓存区中。

 

Step2:所需的数据被从读取缓冲区拷贝到用户缓冲区,read()调用返回。该调用的返回引发了内核模式到用户模式的第二次上下文切换。这同时产生了第二次拷贝/复制,现在数据被储存在用户地址空间缓冲区。

 

Step3: send()套接字(或者write()调用)引发了从用户模式到内核模式的第三次上下文切换。数据被第三次拷贝/复制,并被再次放置在内核地址空间缓冲区。但是这一次放置的缓冲区不同,该缓冲区与目标套接字相关联。

 

Step4: send()调用返回,结果导致了第四次的上下文切换。DMA 引擎将数据从内核缓冲区传到协议引擎,第四次拷贝/复制独立地、异步地发生。

                

                                   图 3

   我们可以很清楚的看到,数据在磁盘、中间内核缓冲区和用户缓冲区中被拷贝了多次,并且经过了多次上下文切换。显然,这样的数据传输效率是很低下的。

    而零拷贝正是通过消除这些冗余的数据拷贝从而提高了性能,下面我们就循序渐进地看看使用零拷贝传输数据的情况是什么样的:

 

二、数据传输:零拷贝方法

   从文章开始的地方给出的链接中,简要介绍了零拷贝的几种实现方式,我们这里针对其中的mmap实现方式进行进一步的分析。当我们仔细看传统情况下的数据传输,就会注意到有些拷贝操作是可以不用做的。应用程序只是起到缓存数据并将其传回到套接字的作用而已,别无他用。我们完全可以采用下图所示的方式进行数据传输:

 

             

                                       图  4

   注意图4与图1的区别,图4中使用mmap代替了图1中的read。这会导致什么不同呢,我们又该如何实现以上的想法呢?另外,使用中间内核缓冲区,即图2中的Read buffer或图4中的页缓存,而不是直接将数据传输到用户缓冲区,看起来可能有点效率低下。但是之所以引入中间内核缓冲区的目的是想提高性能。在读取方面使用中间内核缓冲区,可以允许内核缓冲区在应用程序不需要内核缓冲区内的全部数据时,充当 “预读高速缓存(readahead cache)”的角色。这在所需数据量小于内核缓冲区大小时极大地提高了性能。在写入方面的中间缓冲区则可以让写入过程异步完成。不幸的是,如果所需数据量远大于内核缓冲区大小的话,这个方法本身可能成为一个性能瓶颈。

HMC7044调试指南与FPGA开发 最后,我们介绍了在FPGA开发中使用HMC7044的几个常见应用场景,包括时钟分配、时钟同步、高精度时钟生成和时钟域交叉。根据您的应用需求,您可以选择不同的时钟分配方案,例如使用PLL生成特定频率的时钟信号,或者通过分频器生成较低频率的时钟信号。HMC7044可以提供精确的时钟同步功能,确保各个FPGA板之间的时钟信号保持一致,从而实现可靠的数据传输和协同操作。HMC7044可以实现时钟域之间的交叉,通过生成和分配不同频率的时钟信号,使得不同时钟域的模块能够协同工作。FPGA开发中的HMC7044应用。 阅读详情

相关推荐

麒麟桌面操作系统QT开发环境搭建

麒麟操作系统安装Qt

因为热爱,所以坚持,记录工作中的乐趣 9275

零拷贝(Zero Copy)

零拷贝技术指的是在计算机执行操作时,CPU不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文以及CPU的拷贝时间。他的作用是在数据报从网络设备到用户程序空间传递的过程,减少数据拷贝的次数,减少系统调用,实现CPU的零参与,彻底消除CPU在这方面的负载,实现零拷贝的最主要的技术就是DMA数据传输技术和内存区域映射技术。零拷贝就是可以减少数据在用户缓冲区和内核缓冲区之间的反复的I/O拷贝操作。零拷贝机制可以减少用户进程地址空间和内核地址空间之间因为上下文切换带来的CPU开销。

m0_62645012的博客 8290

GCJ02坐标系转WGS84坐标系(已实地测试基本无偏差)

坐标系转化,GCJ02坐标系,WGS84坐标系

Xiao_XianYu_的博客 1859

什么是零拷贝

零”:表示次数是0,它表示拷贝数据的次数是0“拷贝”:指数据从一个存储区域转移到另一个存储区域合起来,那零拷贝就是不需要将数据从一个存储区域复制到另一个存储区域。零拷贝是指计算机执行IO操作时,CPU不需要将数据从一个存储区域复制到另一个存储区域,进而减少上下文切换以及CPU的拷贝时间。它是一种IO操作优化技术。什么是上下文CPU 寄存器,是CPU内置的容量小、但速度极快的内存。而程序计数器,则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。

qq_34237977的博客 4258

AOSP14 Launcher3——手势上滑关键类AbsSwipeHandler解析

通过精密的事件监听、状态管理和对系统动画 API 及 Launcher 内部组件的协调,实现了复杂而流畅的手势导航体验。它的抽象设计允许子类(如。是 Quickstep (Launcher3 的手势导航实现) 中处理。的核心逻辑抽象基类。这个非常核心且复杂的类。)定制特定的回家动画逻辑。好的,我们来深入分析。

Micheal_Yang's Blog 1521

uniapp - 详细解决 H5 网页报错 Uncaught Error: Async component timed out after ? ms.(移动端h5页面白屏或加载缓慢失败,超时报错处理)

uni-app,vue3,网页,h5,移动端,手机H5页面,浏览器,报错,uniapp报错,Asynccomponenttimedoutafter,如何解决这个问题,vue3Asynccomponenttimedoutafter,异步组件超时了怎么办,async,详细解决方案,AsyncComponents异步组件,导致页面打不开了,白屏什么也不显示,网页载入非常慢卡顿,vue3网站报错,超时,nuxt3,详细解决方案,浏览器控制台报错,爆红并且页面卡住了,依旧报错,找不到异步组件的报错

🏆 前端领域优质创作者 3782

一文搞懂什么是零拷贝

其名字中的”直接”二字用于区分使用 page cache 机制的缓存 I/O,其他所有技术中,数据至少需要在内核空间存储一份,但是在 Direct I/O 技术中,数据直接存储在用户空间中,绕过了内核。sendfile() 是一种特殊的系统调用,它允许在内核空间和用户空间之间直接传输数据,避免了数据在内核和用户空间之间的额外拷贝。splice() 的主要优势在于减少了数据拷贝的次数和数据在用户空间和内核空间之间的来回传输,从而显著提高了数据传输的效率。splice() 是一种在管道传输中实现零拷贝的方式。

AmazDreamer的博客 2593

手把手教你学Simulink--基于Simulink的风力发电系统用双馈电机控制仿真建模

特点高效节能:在广泛的风速范围内保持高效的能量转换。独立控制有功和无功功率:通过控制转子电流实现对有功和无功功率的独立调节。较低的成本:相比直接驱动或全功率变流器方案,成本较低。挑战控制复杂度较高:需要复杂的控制算法来实现有功和无功功率的解耦控制。对电网波动敏感:需要良好的稳定性控制策略以应对电网电压波动。利用Simscape Electrical中的模块构建DFIG的物理模型,配置参数如电阻、电感、极对数等。matlab深色版本% 添加DFIG电机模块。

MHD0815的博客 350

零拷贝原理详解

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

Dream_it_possible!的博客 1万+

BMS硬件设计要点:从STM32主控到BQ76920监控芯片的工程实践

电池管理系统(BMS)是锂电安全与寿命保障的核心,其硬件设计涉及微控制器选型、专用监控芯片接口、电源完整性、信号完整性及PCB布局等多维度协同。基于STM32与BQ76920的典型双层架构,需深入理解功能安全解耦原理——关键保护由ASIC硬件实现,算法决策交由MCU完成,契合ASIL-B等级要求。技术价值体现在毫秒级硬件保护响应、±10mV电压采样精度及抗EMI鲁棒性设计;广泛应用于电动工具、储能系统与轻型电动车等中高功率场景。本文聚焦BMS控制板硬件实现中的高频时钟EMC、I²C总线信号完整性、被动均衡可

weixin_30591519的博客 92

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

零拷贝详解

一篇文章轻松搞懂什么是零拷贝、传统IO执行流程、实现零拷贝的几种方式以及Java如何实现零拷贝。

weixin_54232666的博客 3225

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

linux 零拷贝goodlen,Linux 零拷贝技术

目录[TOC]简介零拷贝(zero-copy)技术可以减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道、实现高速服务器和路由器的关键技术之一。数据拷贝受制于传统的操作系统或通信协议,限制了通信性能。采用零拷贝技术,通过减少数据拷贝次数,简化协议处理的层次,在应用和网络间提供更快的数据通路,可以有效地降低通信延迟,增加网络吞吐率。...

weixin_29608135的博客 154

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Linux 零拷贝技术

零拷贝(zero-copy)技术可以减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道、实现高速服务器和路由器的关键技术之一。数据拷贝受制于传统的操作系统或通信协议,限制了通信性能。采用零拷贝技术,通过减少数据拷贝次数,简化协议处理的层次,在应用和网络间提供更快的数据通路,可以有效地降低通信延迟,增加网络吞吐率。

编程点滴 1618

IO零拷贝_Linux

目录目录 简介 抛砖引玉 mmap sendfile 支持聚集操作的硬件 在Java中的应用 参考 简介零拷贝(zero-copy)技术可以减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道、实现高速服务器和路由器的关键技术之一。数据拷贝受制于传统的操作系统或通信协议,限制了通信性能。采用零拷贝技术,通过减少数据拷贝次数,简化协议处

qq_22795009的博客 680

.NET高性能编程 - C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。

作为.net程序员,使用过指针,写过不安全代码吗?为什么要使用指针,什么时候需要使用它,以及如何安全、高效地使用它?如果能很好地回答这几个问题,那么就能很好地理解今天了主题了。C#构建了一个托管世界,在这个世界里,只要不写不安全代码,不操作指针,那么就能获得.Net至关重要的安全保障,即什么都不用担心;那如果我们需要操作的数据不在托管内存中,而是来自于非托管内存,比如位于本机内存或者堆栈上,该如何编写代码支持来自任意区域的内存呢?这个时候就需要写不安全代码,使用指针了;而。

YVb27x5Ry的博客 903

C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。

作为.net程序员,使用过指针,写过不安全代码吗?为什么要使用指针,什么时候需要使用它,以及如何安全、高效地使用它?如果能很好地回答这几个问题,那么就能很好地理解今天了主题了。C#构建了一个托管世界,在这个世界里,只要不写不安全代码,不操作指针,那么就能获得.Net至关重要的安全保障,即什么都不用担心;那如果我们需要操作的数据不在托管内存中,而是来自于非托管内存,比如位于本机内存或者堆栈上,该如何编写代码支持来自任意区域的内存呢?这个时候就需要写不安全代码,使用指针了;而。

KSu4l50A5的博客 163

Kafka的高性能原理

本文来说下Kafka的高性能设计 文章目录概述 概述

wh柒八九的博客 1846

NET高性能编程 - C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。

上面的动画非常清楚了吧,旧span整合它的引用和偏移成新的span的引用,整个过程并没有复制内存,也没有返回相对位置上存在的副本,而是直接返回实际存储位置的引用,因此性能非常高,因为新span获得并更新了引用,所以垃圾回收器(GC)知道如何处理新的span,从而获得了.Net至关重要的安全保障,并且内部还会自动执行边界检查确保内存安全,而这些都是span内部默默完成的,开发人员根本不用担心,非托管世界依然美好。// 这里不关心操作的内存类型,即不用为一种类型写一个重载方法,就好比上面的设计一样。

oEw6qRLQ9的博客 151

【独立开发】一次 AI 原生React组件库的开源尝试:Proton UI (求指正 / 求 Star)

它会拦截流式数据,实时检测并补全缺失的闭合标签,尽量保证在内容生成过程中,DOM 结构和布局的稳定性,减少用户的视觉干扰。作为一名科研AI项目的前端开发者,在日常构建 Agent 和数据平台的项目时,我发现通用组件库虽然功能强大,但在面对 LLM 流式输出(Streaming)、GB 级大文件处理 以及 高频状态更新 等特定场景时,往往需要进行大量的定制化封装。在做 AI 应用的过程中,我尝试解决流式渲染、大文件传输等特定场景下的性能问题,并探索了一种融合赛博朋克与像素风的视觉风格。

2301_81854050的博客 285

互联网大厂必问面试合集,助你跳槽拿高薪--Java篇

前言 作为程序员,免不了要经历面试这关,虽然平时工作勤勤恳恳,但是面试上面未必能展示的出来,比如平时都是做增删改查的业务系统,面试官非要问你如何处理高并发大数据,本来是写java代码,非要问你大型网站架构,这些问题防不胜防,本文就自己的面试经验来总结一下,抛砖引玉。 第一步先自我介绍? 介绍自己的项目经验和个人的擅长点,面试官主要考察你的表达能力和语言精简能力。 第二步:项目中做了什么...

weixin_44174165的博客 344
上一篇: 浅谈Linux中断处理(一)
下一篇: 也谈大端模式(big endian)和小端模式(little endian) (二) 理论与实例一
linuxdrivers
博客等级 码龄16年 147粉丝 14原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值