首页 > 其他分享 >零拷贝

零拷贝

时间:2023-07-17 14:12:28浏览次数:24  
标签:buffer 内核 IO 缓冲区 拷贝 copy

 

所谓零拷贝并不是不需要拷贝,而是减少不必要的拷贝次数。通常是说在IO读写过程中。

目前市面上大部分的高性能软件,比如Nginx、Kafka等等,都有零拷贝的身影。

我们通过一个传统IO读取文件,然后通过网络发送的例子来入手,详情看下图:

 

由上图可知,在一个简单的文件读取发送的过程中,会经历四次文件拷贝:

* 第一次:将磁盘文件,读取到操作系统内核缓冲区
* 第二次:将内核缓冲区的数据,copy到application应用程序的buffer
* 第三步:将application应用程序buffer中的数据,copy到socket网络发送缓冲区(属于操作系统内核的缓冲区)
* 第四次:将socket buffer的数据,copy到网络协议栈,由网卡进行网络传输

除此之外,实际的IO读写,需要进行IO中断,需要CPU响应中断(内核态到用户态转换),尽管引入DMA(Direct Memory
Access,直接存储器访问)来接管CPU的中断请求,但四次copy的过程中,第二个和第三个数据副本的拷贝是不需要的。数据可以直接从读缓冲区传输到套接字缓冲区。

所以,所谓的零拷贝,就是磁盘文件通过网络发送。磁盘数据通过DMA(Direct Memory
Access,直接存储器访问)拷贝到内核态Buffer。之后不经过用户态,而是直接从内核态将数据拷贝到NIO Buffer(socket buffer)。

零拷贝是需要底层的操作系统支持的,我们以Linux为例,Linux **2.4+** 内核通过`sendfile`
系统调用,提供了零拷贝。除了减少数据拷贝外,Linux整个读文件 ==> 网络发送由一个`sendfile`调用完成,整个过程只有两次上下文切换,因此大大提高了性能。

Java NIO对`sendfile`的支持就是`FileChannel.transferTo()/transferFrom()。

 

标签:buffer,内核,IO,缓冲区,拷贝,copy
From: https://www.cnblogs.com/xiez98/p/17559928.html

相关文章

  • 2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?
    2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?答案2023-07-16:什么是零拷贝?零拷贝(英语:Zero-copy)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。➢零拷贝技术可以减少数据......
  • 2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?
    2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?答案2023-07-16:什么是零拷贝?零拷贝(英语:Zero-copy)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。➢零拷贝技术可以减少数据拷贝和......
  • 拷贝文件到docker里面
    拷贝文件到Docker容器中在使用Docker时,我们常常需要将本地文件拷贝到正在运行的Docker容器中。这个过程可能涉及到从宿主机到容器的文件传输,以及在目标容器中进行文件操作。本文将为您介绍如何使用不同方法将文件拷贝到Docker容器中,并提供相关代码示例。1.使用dockercp命令Doc......
  • Java复制(拷贝)数组的4种方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRange
    http://c.biancheng.net/view/924.html所谓复制数组,是指将一个数组中的元素在另一个数组中进行复制。本文主要介绍关于 Java 里面的数组复制(拷贝)的几种方式和用法。在Java中实现数组复制分别有以下4种方法:Arrays类的copyOf()方法Arrays类的copyOfRange()方法Syst......
  • 深拷贝方法
    //使用递归的方式实现数组、对象的深拷贝exportfunctiondeepClone(obj){letobjClone=Array.isArray(obj)?[]:{};if(obj&&typeofobj==="object"){for(varkeyinobj){if(obj.hasOwnProperty(key)){//判断ojb子元素是否为对象,如果是,递归复制if(obj[ke......
  • 使用一行脚本将视频关键帧数量小于10的视频拷贝到文件夹
    假设文件夹input中有很多视频,视频的后缀为mpeg,将视频关键帧数量小于10的视频拷贝到文件夹ouput中foriininput/*.mpeg;doffprobe-select_streamsv-show_frames-vquiet-print_formatjson=compact=1$i|grep'"key_frame":1'|wc-l|(readcount&&[$count-lt......
  • C++ 惯用法之 Copy-Swap 拷贝交换
    C++惯用法之Copy-Swap拷贝交换这是“C++惯用法”合集的第3篇,前面2篇分别介绍了RAII和PIMPL两种惯用法:RAII:ResouceAcquistionIsInitializationPIMPL:PointerToImplemetation正式介绍Copy-Swap之前,先看下《剑指Offer》里的第☝️题:如下为类型CMyString......
  • 将PYTHON包环境从一个电脑拷贝到另外一个电脑
    将PYTHON包环境从一个电脑拷贝到另外一个电脑1、在当前电脑复制D:\ProgramFiles\Python\Python311\Lib中的所有文件生成myrequirement.txt文件pipfreeze>myrequirement.txtmyrequirement.txt文件如下:colorama==0.4.6constantly==15.1.0cpca==0.5.5cryptography=......
  • 16.深拷贝/浅拷贝
    1.浅拷贝:默认在改变新的数组的时候,也改变了原数组。letobj={name:"张三",age:28};letqian=obj;qian.name="李四";console.log(obj.name);//李四console.log(qian.name);//李四 2.深拷贝:方式一:使用JSON.stringify()以及JSON.parse():letobj={name......
  • Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
    https://blog.csdn.net/qq_21438461/article/details/130764349Linux系统编程C/C++以及Qt中的零拷贝技术:从底层原理到高级应用一、零拷贝技术的概念与价值(Zero-CopyConceptandValue)1.1什么是零拷贝(WhatisZero-Copy)1.2为什么我们需要零拷贝(WhyWeNeedZero-C......