首页 > 其他分享 >零拷贝

零拷贝

时间:2023-04-23 12:00:50浏览次数:23  
标签:socket 线程 内核 缓冲区 拷贝 内存

零拷贝主要关注两个核心点:线程上下文切换次数数据在内存中被拷贝的次数

因为线程上下文切换和在内存中拷贝数据,这两种操作都很耗CPU时间,所以要提升效率,就要尽量减少这两种操作。

一、原始阶段(上图左):

最符合直觉的方式。
整个过程公发生:2次内存数据拷贝,4次线程上下文切换。

二、MMAP + write阶段(上图右):

在用户态和内核态间开辟了一块共享内存,从磁盘传输到内核态的数据就放在这块共享缓冲区上,用户缓冲区也可以共享地访问,省去了内核缓冲区到用户缓冲区的拷贝过程。
最后用户线程再发起内核调用write,将共享缓冲区的数据拷贝到socket缓冲区,供网卡读取。
整个过程公发生:1次内存数据拷贝,4次线程上下文切换。

三、sendfile阶段(上图左):

用户线程发起sendfile系统调用,此过程将内存缓冲区到用户缓冲区的拷贝过程剔除;
直接将数据从内核缓冲区拷贝到socket缓冲区,然后线程再切回到用户态。

整个过程公发生:1次内存数据拷贝,2次线程上下文切换。

四、sendfile + DMA收集阶段(上图右):

与上一阶段类似,用户线程发起sendfile系统调用,此过程也将内存缓冲区到用户缓冲区的拷贝过程剔除;
但不直接将数据从内核缓冲区拷贝到socket缓冲区,而是将数据在内核缓冲区中的地址和数据长度拷贝到socket缓冲区;
网卡读到socket缓冲区中的地址,发现数据不在socket缓冲区中,就让DMA直接去内存缓冲区中读数据。
最后线程再切回到用户态。
整个过程公发生:0次内存数据拷贝,2次线程上下文切换。

标签:socket,线程,内核,缓冲区,拷贝,内存
From: https://www.cnblogs.com/JaxYoun/p/17346122.html

相关文章

  • 远程文件拷贝
    [远程文件拷贝|qxdn的乐园](https://qianxu.run/2021/11/02/remote-copy/)实验室分配了服务器,有必要了解以下远程数据的拷贝封面《月に寄りそう乙女の作法》前言向实验室申请了一个服务器准备炼丹,第一步暂时打算先上传数据集。对服务器上文件的远程拷贝只用过VNC和vsco......
  • 记录-实现深拷贝的四种方式
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助概念介绍深拷贝:在堆内存中重新开辟一个存储空间,完全克隆一个一模一样的对象浅拷贝:不在堆内存中重新开辟空间,只复制栈内存中的引用地址。本质上两个对象(数组)依然指向同一块存储空间第一种:递归方式(推荐,项目中最安......
  • js-深拷贝和浅拷贝
    浅拷贝:有两种方式,一种是把一个对象里面的所有的属性值和方法都复制给另一个对象,另一种是直接把一个对象赋给另一个对象,使得两个都指向同一个对象。深拷贝:把一个对象的属性和方法一个个找出来,在另一个对象中开辟对应的空间,一个个存储到另一个对象中。两者就在于,浅拷贝只是简单的......
  • 深拷贝和浅拷贝的区别
    浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。引用拷贝:就是......
  • js深度拷贝
    法一:有局限性//通过js的内置对象JSON来进行数组对象的深拷贝functiondeepClone(obj:any):any{const_obj=JSON.stringify(obj),constobjClone=JSON.parse(_obj);returnobjClone;}这种简单粗暴的方法有其局限性,当值为undefined、function、symbol会在转换过程......
  • C# 数组深拷贝浅拷贝
    1bool[]tmp1={true,true};2bool[]tmp2;34//tmp2=tmp1;//浅拷贝更改tmp2会影响tmp156tmp2=(bool[])tmp1.Clone();//克隆深拷贝更改tmp2不会影响tmp178tmp2[0]=false;9......
  • 对象的深拷贝
    CSDN:https://blog.csdn.net/cc18868876837/article/details/114918262掘金:https://juejin.cn/post/7207090090101866557#heading-16functiondeepClone(obj,cloneObj){varcloneObj=cloneObj||{};for(letiinobj){......
  • Java 深拷贝浅拷贝
    Arrays.copyOf()方法在底层是调用了System.arraycopy() 对于基本数据类型来说System.arraycopy()方法是深拷贝,对于引用数据类型来说System.arraycopy()方法是浅拷贝。总结:拷贝方式数值类型引用类型推荐使用for循环深拷贝浅拷贝 copyOf深拷贝浅拷贝推荐......
  • 手写一个深拷贝
    functiondeepClone(obj){if(typeofobj!='object')returnobject//1、建立新容器vartemp=array.isArray(obj)?[]:{}//2、通过遍历将原有数组的值循环出来放到新建立的容器上for(letkeyinobj){if(obj.hasOwnProper......
  • 第七篇 手写原理代码 - 对象 【 实现对象的深度拷贝、实现对象的深度对比 】
    在JavaScript中,对象拷贝可以分为浅拷贝和深拷贝两种方式1、浅拷贝浅拷贝只是复制了对象的引用地址,新对象的属性与原对象的属性指向同一块内存地址2、深拷贝深拷贝会完整地复制对象以及其内部所有嵌套对象使用JSON.parse(JSON.stringify())方法进行深拷贝......