首页 > 其他分享 >面试官:说一下零拷贝技术的实现原理?

面试官:说一下零拷贝技术的实现原理?

时间:2024-01-29 10:46:44浏览次数:29  
标签:面试官 操作系统 MMap 内核 IO 原理 拷贝 CPU

零拷贝(Zero-copy)技术是一种计算机操作系统中用于提高数据传输效率的优化策略。在传统的数据传输过程中,需要将数据从一个缓冲区拷贝到另一个缓冲区,然后再传输给目标。这涉及到多次的 CPU 和内存之间的数据拷贝操作,会消耗 CPU 的时间和内存带宽。而零拷贝技术通过直接共享数据的内存地址,避免了中间的拷贝过程,从而提高了数据传输的效率。

1.传统 IO 执行流程

要搞明白零拷贝技术就要先搞清楚传统 IO 的执行流程,传统的 IO 的执行流程如下:

1.1 用户态和内核态

操作系统有用户态和内核态之分,这是因为计算机体系结构中的操作系统设计了两个不同的执行环境,以提供不同的功能和特权级别。

  • 用户态(User Mode)是指应用程序运行时的执行环境。在用户态下,应用程序只能访问受限资源,如应用程序自身的内存空间、CPU 寄存器等,并且不能直接访问操作系统的底层资源和硬件设备。
  • 内核态(Kernel Mode)是指操作系统内核运行时的执行环境。在内核态下,操作系统具有更高的权限,可以直接访问系统的硬件和底层资源,如 CPU、内存、设备驱动程序等。

1.2 DMA

DMA(Direct Memory Access,直接内存访问)技术,绕过 CPU,直接在内存和外设之间进行数据传输。这样可以减少 CPU 的参与,提高数据传输的效率。

2.零拷贝技术的实现

零拷贝技术可以利用 Linux 下的 MMap、sendFile 等手段来实现,使得数据能够直接从磁盘映射到内核缓冲区,然后通过 DMA 传输到网卡缓存,整个过程中 CPU 只负责管理和调度,而无需执行实际的数据复制指令。

2.1 MMap

MMap(Memory Map)是 Linux 操作系统中提供的一种将文件映射到进程地址空间的一种机制,通过 MMap 进程可以像访问内存一样访问文件,而无需显式的复制操作。

使用 MMap 可以把 IO 执行流程优化成以下执行步骤:

传统的 IO 需要四次拷贝和四次上下文(用户态和内核态)切换,而 MMap 只需要三次拷贝和四次上下文切换,从而能够提升程序整体的执行效率,并且节省了程序的内存空间。

2.2 senFile 方法

在 Linux 操作系统中 sendFile() 是一个系统调用函数,用于高效地将文件数据从内核空间直接传输到网络套接字(Socket)上,从而实现零拷贝技术。这个函数的主要目的是减少 CPU 上下文切换以及内存复制操作,提高文件传输性能。

使用 sendFile() 可以把 IO 执行流程优化成以下执行步骤:

3.哪些地方用到了零拷贝技术?

在 Java 中,以下几个地方使用了零拷贝技术:

  1. NIO(New I/O)通道:java.nio.channels.FileChannel 提供了 transferTo() 和 transferFrom() 方法,可以直接将数据从一个通道传输到另一个通道,例如从文件通道直接传输到 Socket 通道,整个过程无需将数据复制到用户空间缓冲区,从而实现了零拷贝。
  2. Socket Direct Buffer:在 JDK 1.4 及更高版本中,Java NIO 支持使用直接缓冲区(DirectBuffer),这类缓冲区是在系统堆外分配的,可以直接由网卡硬件进行 DMA 操作,减少数据在用户态与内核态之间复制次数 ,提高网络数据发送效率。
  3. Apache Kafka 或者 Netty 等高性能框架:这些框架在底层实现上通常会利用 Java NIO 的上述特性来优化数据传输,如 Kafka 生产者和消费者在传输消息时会用到零拷贝技术以提升性能。

小结

使用零拷贝技术可以减少 CPU 拷贝,及减少了上下文的切换带来的性能开销,提高了程序的整体执行效率,它们的区别对比如下表格所示:

CPU 拷贝(次数) DMA 拷贝(次数) 上下文切换(次数)
传统 IO 2 2 4
MMap 1 2 4
sendFile() 1 2 2

课后思考

无论是传统 IO,还是零拷贝,其中两次 DMA 拷贝都不能省略,这是为什么?零拷贝技术除了 MMap 和 sendFile() 之外,还有没有其他的技术实现?

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

标签:面试官,操作系统,MMap,内核,IO,原理,拷贝,CPU
From: https://www.cnblogs.com/vipstone/p/17993987

相关文章

  • Spring整合jasypt原理分析
    前言在我们系统中,有很多敏感数据,如MySQL及Redis的账号密码信息等,jasypt可以帮我们加密这些信息,使系统更加的安全。使用添加maven依赖<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2......
  • 《深入浅出计算机组成原理》学习笔记1——计算机基本组成与指令执行
    一丶冯·诺依曼体系结构:计算机组成的金字塔1.从装机的角度看计算机基本组成CPU:计算机最重要的核心配件,全称中央处理器,计算机的所有“计算”都是由CPU来进行的内存撰写的程序、打开的浏览器、运行的游戏,都要加载到内存里才能运行。程序读取的数据、计算得到的结果,也都要......
  • vue响应性原理
     核心实现类Observer:它的作用是给对象的属性添加getter和setter,用于依赖收集和派发更新Dep:用于收集当前响应式对象的依赖关系,每个响应式对象包括子对象都拥有一个Dep实例(里面subs是Watcher实例数组),当数据有变更时,会通过dep.notify()通知各个watcher。W......
  • Oracle RAC SCAN ip的原理、配置及优缺点
    在oracle11g中,SCANIP还用的很少。到oracle12.2或者19c,用户已经基本上清一色的切换到了SCANIP。所以很有必要理解oracle的SCANIP运行机制和配置。先回顾下VIP。RAC的每个节点都需要有一个虚拟IP,这就是VIP。VIP需要和PUBLICIP同一个子网,它们是由GI的Clusterware来管理......
  • R数据分析:非劣效性研究设计的统计处理方法,原理和实例
    在我们经常接触的统计模式中,我们是在寻求推翻原假设,证明差异,这种统计模型在传统的临床试验中,在各种统计推断中已经成为默认了。在传统的临床试验中通常会将一种新的治疗方法与标准治疗或安慰剂进行比较,从而证明这种新治疗具有更好的疗效,这类试验的原假设是这两种治疗方案的治疗效......
  • 《深入理解Kafka:核心设计与实践原理》PDF
    内容简介《深入理解Kafka:核心设计与实践原理》从Kafka的基础概念切入,循序渐进地转入对其内部原理的剖析。《深入理解Kafka:核心设计与实践原理》主要阐述了Kafka中生产者客户端、消费者客户端、主题与分区、日志存储、原理解析、监控管理、应用扩展及流式计算等内容。虽然Kafka的内......
  • 作者推荐 | 【深入浅出MySQL】「底层原理」探秘缓冲池的核心奥秘,揭示终极洞察
    缓存池BufferPool机制应用系统分层架构:一个优化策略是将最常访问的数据存放在缓存中,以加快数据访问速度,避免频繁地访问数据库。操作系统:借助缓冲池机制来优化数据访问,从而避免了反复直接访问磁盘的开销,极大地提升了数据访问的速度。缓冲池通过在内存中临时存储最常访问的数据,将频繁......
  • iOS 中 深拷贝和浅拷贝的区别
    在iOS开发中,深拷贝和浅拷贝是两种不同的对象复制方式,它们在处理NSArray、NSMutableArray以及其他集合类型时尤为重要。浅拷贝(ShallowCopy)浅拷贝仅复制对象的指针,而不复制对象本身。如果你对一个对象进行浅拷贝,新对象和原对象将指向相同的内存地址。这意味着如果你修改了其中一......
  • 将小游戏打包成单一exe文件的原理及应用
    哈喽大家好,我是咕噜美乐蒂,很高兴又见面啦!本文将介绍将小游戏原版文件打包成单一exe文件的原理,并探讨了这种打包方式的优点和应用场景。通过对打包工具和编译器的介绍,解释了它们如何将游戏的所有相关文件合并到一个可执行文件中,从而实现直接运行的便利性。同时,本文还提供了一些常见......
  • 计算机组成原理(期末版)
    1.三个周期指令周期:一条机器指令执行所需的时间(由若干个机器周期来表示)机器周期:完成一个规定操作所用的时间(如读写一次存储器等操作所需要的时间)时钟周期:(又称节拍脉冲)时钟周期是计算机系统中用来衡量处理器执行指令或完成一个操作所需时间的概念。它表示在处理器内部的时钟信......