零拷贝技术面试题

news2024/11/25 23:36:02

文章目录

  • 1 零拷贝的介绍
  • 2 传统的IO的执行流程
  • 3 零拷贝涉及的技术点
    • 3.1 内核空间和用户空间
    • 3.2 用户态和内核态
    • 3.3 DMA技术
  • 4 零拷贝实现的几种方式
    • 4.1 mmap+write
    • 4.2 sendfile
    • 4.3 sendfile+DMA scatter/gather实现的零拷贝
  • 5 java提供的零拷贝方式
    • 5.1 Java NIO对mmap的支持
    • 5.2 Java NIO对sendfile的支持

1 零拷贝的介绍

零拷贝是指计算机执行IO操作时,CPU不需要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及CPU的拷贝时间。它是一种I/O操作优化技术。

2 传统的IO的执行流程

传统的IO流程包括read和write的过程
read:把数据从磁盘读到内核缓冲区,再拷贝到用户缓冲区
write:先把数据写到socket缓冲区,再写入到网卡设备
在这里插入图片描述
用户应用进程调用read函数,向操作系统发起IO调用, 上下文从用户态转为内核态(切换1)

DMA控制器把数据从磁盘中,读取到内核缓冲区。

CPU把内核缓冲区数据,拷贝到用户应用缓冲区, 上下文从内核态转为用户态(切换2),read函数返回

用户应用进程通过write函数,发起IO调用, 上下文从用户态转为内核态(切换3)

CPU将用户缓冲区中的数据,拷贝到socket缓冲区

DMA控制器把数据从socket缓冲区,拷贝到网卡设备, 上下文从内核态切换回用户态(切换4),write函数返回

从流程图可以看出,传统IO的读写流程,包括了4次上下文切换(4次用户态和内核态的切换),4次数据拷贝(两次CPU拷贝以及两次的DMA拷贝),什么是DMA拷贝呢?我们一起来回顾下,零拷贝涉及的操作系统知识点哈。

3 零拷贝涉及的技术点

3.1 内核空间和用户空间

内核空间:主要提供进程调度、内存分配、连接硬件资源等功能

用户空间:提供给各个程序进程的空间,它不具有访问内核空间资源的权限,如果应用程序需要使用到内核空间的资源,则需要通过系统调用来完成。进程从用户空间切换到内核空间,完成相关操作后,再从内核空间切换回用户空间。

3.2 用户态和内核态

如果进程运行于内核空间,被称为进程的内核态

如果进程运行于用户空间,被称为进程的用户态。

3.3 DMA技术

DMA,英文全称是Direct Memory Access,即直接内存访问。DMA本质上是一块主板上独立的芯片,允许外设设备和内存存储器之间直接进行IO数据传输,其过程不需要CPU的参与。
在这里插入图片描述
用户应用进程调用read函数,向操作系统发起IO调用,进入阻塞状态,等待数据返回。

CPU收到指令后,对DMA控制器发起指令调度。

DMA收到IO请求后,将请求发送给磁盘;

磁盘将数据放入磁盘控制缓冲区,并通知DMA

DMA将数据从磁盘控制器缓冲区拷贝到内核缓冲区。

DMA向CPU发出数据读完的信号,把工作交换给CPU,由CPU负责将数据从内核缓冲区拷贝到用户缓冲区。

用户应用进程由内核态切换回用户态,解除阻塞状态

4 零拷贝实现的几种方式

零拷贝并不是没有拷贝数据,而是减少用户态/内核态的切换次数以及CPU拷贝的次数。零拷贝实现有多种方式,分别是

mmap+write

sendfile

带有DMA收集拷贝功能的sendfile

4.1 mmap+write

addr:指定映射的虚拟内存地址

length:映射的长度

prot:映射内存的保护模式

flags:指定映射的类型

fd:进行映射的文件句柄

offset:文件偏移量
在这里插入图片描述
用户进程通过 mmap方法向操作系统内核发起IO调用, 上下文从用户态切换为内核态。

CPU利用DMA控制器,把数据从硬盘中拷贝到内核缓冲区。

上下文从内核态切换回用户态,mmap方法返回。

用户进程通过 write方法向操作系统内核发起IO调用, 上下文从用户态切换为内核态。

CPU将内核缓冲区的数据拷贝到的socket缓冲区。

CPU利用DMA控制器,把数据从socket缓冲区拷贝到网卡, 上下文从内核态切换回用户态,write调用返回。

可以发现,mmap+write实现的零拷贝,I/O发生了4次用户空间与内核空间的上下文切换,以及3次数据拷贝。其中3次数据拷贝中,包括了2次DMA拷贝和1次CPU拷贝。
mmap是将读缓冲区的地址和用户缓冲区的地址进行映射,内核缓冲区和应用缓冲区共享,所以节省了一次CPU拷贝‘’并且用户进程内存是虚拟的,只是映射到内核的读缓冲区,可以节省一半的内存空间。

4.2 sendfile

out_fd:为待写入内容的文件描述符,一个socket描述符。,

in_fd:为待读出内容的文件描述符,必须是真实的文件,不能是socket和管道。

offset:指定从读入文件的哪个位置开始读,如果为NULL,表示文件的默认起始位置。

count:指定在fdout和fdin之间传输的字节数。
sendfile表示在两个文件描述符之间传输数据,它是在操作系统内核中操作的,避免了数据从内核缓冲区和用户缓冲区之间的拷贝操作,因此可以使用它来实现零拷贝。
在这里插入图片描述
用户进程发起sendfile系统调用, 上下文(切换1)从用户态转向内核态

DMA控制器,把数据从硬盘中拷贝到内核缓冲区。

CPU将读缓冲区中数据拷贝到socket缓冲区

DMA控制器,异步把数据从socket缓冲区拷贝到网卡,

上下文(切换2)从内核态切换回用户态,sendfile调用返回。
可以发现,sendfile实现的零拷贝,I/O发生了2次用户空间与内核空间的上下文切换,以及3次数据拷贝。其中3次数据拷贝中,包括了2次DMA拷贝和1次CPU拷贝。那能不能把CPU拷贝的次数减少到0次呢?有的,即带有DMA收集拷贝功能的sendfile!

4.3 sendfile+DMA scatter/gather实现的零拷贝

linux 2.4版本之后,对sendfile做了优化升级,引入SG-DMA技术,其实就是对DMA拷贝加入了scatter/gather操作,它可以直接从内核空间缓冲区中将数据读取到网卡。使用这个特点搞零拷贝,即还可以多省去一次CPU拷贝。

在这里插入图片描述
用户进程发起sendfile系统调用, 上下文(切换1)从用户态转向内核态

DMA控制器,把数据从硬盘中拷贝到内核缓冲区。

CPU把内核缓冲区中的 文件描述符信息(包括内核缓冲区的内存地址和偏移量)发送到socket缓冲区

DMA控制器根据文件描述符信息,直接把数据从内核缓冲区拷贝到网卡

上下文(切换2)从内核态切换回用户态,sendfile调用返回。

可以发现,sendfile+DMA scatter/gather实现的零拷贝,I/O发生了2次用户空间与内核空间的上下文切换,以及2次数据拷贝。其中2次数据拷贝都是包DMA拷贝。这就是真正的 零拷贝(Zero-copy) 技术,全程都没有通过CPU来搬运数据,所有的数据都是通过DMA来进行传输的。

5 java提供的零拷贝方式

5.1 Java NIO对mmap的支持

public class MmapTest {
 
    public static void main(String[] args) {
        try {
            FileChannel readChannel = FileChannel.open(Paths.get("./jay.txt"), StandardOpenOption.READ);
            MappedByteBuffer data = readChannel.map(FileChannel.MapMode.READ_ONLY, 0, 1024 * 1024 * 40);
            FileChannel writeChannel = FileChannel.open(Paths.get("./siting.txt"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
            //数据传输
            writeChannel.write(data);
            readChannel.close();
            writeChannel.close();
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

5.2 Java NIO对sendfile的支持

FileChannel的transferTo()/transferFrom(),底层就是sendfile() 系统调用函数。Kafka 这个开源项目就用到它,平时面试的时候,回答面试官为什么这么快,就可以提到零拷贝sendfile这个点。

@Override
public long transferFrom(FileChannel fileChannel, long position, long count) throws IOException {
   return fileChannel.transferTo(position, count, socketChannel);
}

public class SendFileTest {
    public static void main(String[] args) {
        try {
            FileChannel readChannel = FileChannel.open(Paths.get("./jay.txt"), StandardOpenOption.READ);
            long len = readChannel.size();
            long position = readChannel.position();
            
            FileChannel writeChannel = FileChannel.open(Paths.get("./siting.txt"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
            //数据传输
            readChannel.transferTo(position, len, writeChannel);
            readChannel.close();
            writeChannel.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

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

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

相关文章

抖音快手如何轻松接入虚拟人直播

在上一篇文章零基础开启元宇宙——创建虚拟形象中,我们实现了创建虚拟形象,接下来我们可以利用虚拟形象“为所欲为”。今天我们利用虚拟形象在短视频平台如快手、抖音中直播,对于不希望露脸的主播们这是可是一大利器呀!话不多说&a…

【Unity项目实战】手把手教学:飞翔的小鸟(5)背景滚动

承接上一篇:【Unity项目实战】手把手教学:飞翔的小鸟(4)文本添加,我们已经使得主角小鸟接触到地面后跳转到Game Over状态,接下来我们将继续往下,讲解得分机制。 一、重新进入游戏 根据上篇最后…

网络流量回溯分析助力企业实现高效率运维(一)

背景 汽车配件电子图册系统是某汽车集团的重要业务系统。业务部门反映,汽车配件电子图册调用图纸时,出现访问慢现象。 某汽车总部已部署NetInside流量分析系统,使用流量分析系统提供实时和历史原始流量。本次分析重点针对汽车配件电子图册系…

[附源码]Node.js计算机毕业设计二手书交易软件设计与实现Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

数据技术之数据挖掘

第7章 数据挖掘 1.什么是数据挖掘 数据挖掘(Data Mining)就是从大量的数据中,提取隐藏在其中的,事先不知道的、但潜在有用的信息的过程。数据挖掘的目标是建立一个决策模型,根据过去的行动数据来预测未来的行为。 2.阿里数据挖掘平台 阿里…

Java-1213

JVM历程 Sun Classic VM 1996年发布,世界上第一款商用Java虚拟机,JDK1.4时被淘汰,现在hotspot内置了此虚拟机 这款虚拟机只提供了解释器(现在主流的虚拟机还会提供即时编译器JIT)解释器和JIT两者用一个就可以让程序执…

分享一种 ConstraintLayout 让TextView 自适应的同时,还不超出限制范围的方式

分享一种 ConstraintLayout 让TextView 自适应的同时,还不超出限制范围的方式 不知道大家有没有遇到这种布局需求: 上图布局很简单,ImageView 中间的TextView View ImageView,需求是中间的 TextView 宽度需要根据内容来展示&…

OpenMLDB 实时引擎性能测试报告

OpenMLDB 提供了一个线上线下一致性的特征平台。其中,为了支持低延迟高并发的在线实时特征计算,OpenMLDB 设计实现了一个高性能的实时 SQL 引擎。本报告覆盖了 OpenMLDB 实时 SQL 引擎的性能测试,包含了在较为复杂的负载、典型配置下的各种性…

多线程知识笔记(四)-----volatile、wait方法、notify方法

文章目录1、volatile关键字2、volatile和synchronized对比3、wait和notify方法1、volatile关键字 先看例子: class Counter {public int flag 0; }public class Test4{public static void main(String[] args) {Counter counter new Counter();Thread t1 new Th…

如何使用Footrace 钱包监控功能和设置自定义的交易警报

2022-06-12 本文将介绍如何使用 Footrace 监控 CEX 的钱包地址并设置自定义警报。 什么是 Footrace? Footrace (Foot Trace) 是一个多链的钱包追踪监控平台,可以监控CEX、DEX、鲸鱼、聪明钱、或任何你想关注的地址的钱包。 Footrace 帮助投资者保护他…

有了这几个软件安全测试工具,编写安全测试报告再也不愁

软件的安全是开发人员、测试人员、企业以及用户共同关心的话题,尤其是软件产品的使用者,因为系统中承载着用户的个人信息、人际互动、管理权限等各类隐私海量关键数据。软件安全测试工作不仅是为了用户,更牵扯到许多的利益共同体。因此软件安…

2854-40-2,环二肽cyclo(Pro-Val)

Component of coffee flavor 咖啡香精成分 在烘焙咖啡中检测到Cyclo(Pro-Val)和其他含pro的二酮哌嗪类化合物。这些化合物的含量随着烘焙强度的增加而增加,它们增加了苦味。这种味道苦涩的环二肽也在可可、巧克力、牛肉和奶酪等其他食品中被检测到。Cyclo(Pro-Val)显…

Linux物理内存管理——会议室管理员如何分配会议室

之前学习了站在内存的角度去看内存,看到的都是虚拟内存,这些虚拟内存总是要映射到物理页面的,这一篇文章来学习物理内存是如何管理的。 物理内存的组织方式 之前学习虚拟内存的时候,当涉及物理内存的映射的时候,总是…

不会还有人不知道如何搭建【关键字驱动自动化测试框架】吧 ?

前言 这篇文章我们将了解关键字驱动测试又是如何驱动自动化测试完成整个测试过程的。关键字驱动框架是一种功能自动化测试框架,它也被称为表格驱动测试或者基于动作字的测试。关键字驱动的框架的基本工作是将测试用例分成四个不同的部分。首先是测试步骤&#xff0…

MobileNet网络模型(V1,V2,V3)

MobileNet网络中的亮点:DW卷积,增加了两个超参数,控制卷积层卷积核个数的α,控制输入图像大小的β,这两个超参数是我们人为设定的,并不是学习到的。BN batch normal批规范化,为了加快训练收敛速…

大数据MapReduce学习案例:数据去重

文章目录一,案例分析(一)数据去重介绍(二)案例需求二,案例实施(一)准备数据文件(1)启动hadoop服务(2)在虚拟机上创建文本文件&#xf…

大数据MapReduce学习案例:TopN

文章目录一,案例分析(一)TopN分析法介绍(二)案例需求二,案例实施(一)准备数据文件(1)启动hadoop服务(2)在虚拟机上创建文本文件&#…

linux把乱码文件(非文件内容)删除(Xshell中使用rz命令上传文件出现乱码,删除乱码文件)的步骤讲解

我的场景是:首先安装lrzsz:yum install lrzsz,然后后使用rz -be上传文件出现乱码问题,想要把乱码文件删除 圆圈圈出来的就是乱码文件,横线划线出来的是使用rm命令删除但是无效 解决方法是:ls | grep -v ‘…

人人都是数据分析师

一.耳熟能详的数据你真的了解吗? 1.数据的类型 根据数据的存储形式,可以将数据分为结构化数据和非结构化数据两种类型 存储在数据库中的结构化数据能够很方便地进行检索、分析以及展示分析结果。结构化数据是进 行数据分析的基本类型,大多数…

【1697. 检查边长度限制的路径是否存在】

来源:力扣(LeetCode) 描述: 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] [ui, vi, disi] 表示点 ui 和点 vi 之间有一条长度为 disi 的边。请注意,两个点之间可能有 超过一条边 。 给…