的了解 零拷贝 面试官 谈谈你对
零拷贝(Zero-copy)技术是一种计算机操作系统中用于提高数据传输效率的优化战略。在传统的数据传输环节中,须要将数据从一个缓冲区拷贝到另一个缓冲区,而后再传输给指标。这触及到屡次的 CPU 和内存之间的数据拷贝操作,会消耗 CPU 的期间和内存带宽。而零拷贝技术经过间接共享数据的内存地址,防止了两边的拷贝环节,从而提高了数据传输的效率。
要搞明确零拷贝技术就要先搞分明传统 IO 的口头流程,传统的 IO 的口头流程如下:
操作系统有用户态和内核态之分,这是由于计算机体系结构中的操作系统设计了两个不同的口头环境,以提供不同的配置和特权级别。
DMA(Direct Memory Access,间接内存访问)技术,绕过 CPU,间接在内存和外设之间启动数据传输。这样可以缩小 CPU 的介入,提高数据传输的效率。
零拷贝技术可以应用 Linux 下的 MMap、sendFile 等手腕来成功,使得数据能够间接从磁盘映射到内核缓冲区,而后经过 DMA 传输到网卡缓存,整个环节中 CPU 只担任治理和调度,而无需口头实践的数据复制指令。
MMap(Memory Map)是 Linux 操作系统中提供的一种将文件映射到进程地址空间的一种机制,经过 MMap 进程可以像访问内存一样访问文件,而无需显式的复制操作。
经常使用 MMap 可以把 IO 口头流程优化成以下口头步骤:
传统的 IO 须要四次拷贝和四次高低文(用户态和内核态)切换,而 MMap 只有要三次拷贝和四次高低文切换,从而能够优化程序全体的口头效率,并且节俭了程序的内存空间。
在 Linux 操作系统中 sendFile() 是一个系统调用函数,用于高效地将文件数据从内核空间间接传输到网络套接字(Socket)上,从而成功零拷贝技术。这个函数的关键目的是缩小 CPU 高低文切换以及内存复制操作,提高文件传输性能。
经常使用 sendFile() 可以把 IO 口头流程优化成以下口头步骤:
3.哪些中央用到了零拷贝技术?
在 Java 中,以下几个中央经常使用了零拷贝技术:
经常使用零拷贝技术可以缩小 CPU 拷贝,及缩小了高低文的切换带来的性能开支,提高了程序的全体口头效率,它们的区别对比如下表格所示:
CPU 拷贝/次数 |
DMA 拷贝/次数 |
高低文切换/次数 |
传统 IO |
||
sendFile() |
无论是传统 IO,还是零拷贝,其中两次 DMA 拷贝都不能省略,这是为什么?零拷贝技术除了 MMap 和 sendFile() 之外,还有没有其余的技术成功?