有哪些基于网站开发的报表设计器,建立大型网站吗,深圳做网站的网络公,国内ui做的好的网站有哪些什么是零拷贝#xff1f; 零拷贝是一种计算机系统中的 I/O 优化技术#xff0c;它的核心思想是在数据传输过程中尽可能地减少或完全避免 CPU 将数据从一个存储区域复制到另一个存储区域的操作#xff0c;从而减少了上下文切换和 CPU 拷贝时间#xff0c;提高了系统的性能和…什么是零拷贝 零拷贝是一种计算机系统中的 I/O 优化技术它的核心思想是在数据传输过程中尽可能地减少或完全避免 CPU 将数据从一个存储区域复制到另一个存储区域的操作从而减少了上下文切换和 CPU 拷贝时间提高了系统的性能和效率。在 Java 领域诸如 Netty、Kafka、RocketMQ 等框架就使用了零拷贝技术来提高性能和效率尤其在处理大规模数据传输时表现突出。 
什么是 DMA 技术 直接内存访问Direct Memory Access 技术。简单理解就是在进行 I/O 设备和内存的数据传输的时候数据搬运的工作全部交给 DMA 控制器而 CPU 不再参与任何与数据搬运相关的事情这样 CPU 就可以去处理别的事务。 
传统I/O是如何操作的 
read(file, tmp_buf, len);
write(socket, tmp_buf, len);期间共发生了 4 次用户态与内核态的上下文切换因为发生了两次系统调用一次是 read() 一次是 write()每次系统调用都得先从用户态切换到内核态等内核完成任务后再从内核态切换回用户态。 
其次还发生了 4 次数据拷贝其中两次是 DMA 的拷贝另外两次则是通过 CPU 拷贝的 
第一次拷贝把磁盘上的数据拷贝到操作系统内核的缓冲区里这个拷贝的过程是通过 DMA 搬运的。第二次拷贝把内核缓冲区的数据拷贝到用户的缓冲区里于是我们应用程序就可以使用这部分数据了这个拷贝到过程是由 CPU 完成的。第三次拷贝把刚才拷贝到用户的缓冲区里的数据再拷贝到内核的 socket 的缓冲区里这个过程依然还是由 CPU 搬运的。第四次拷贝把内核的 socket 缓冲区里的数据拷贝到网卡的缓冲区里这个过程又是由 DMA 搬运的。 那零拷贝的方案有哪些呢 
1、MmapWrite 在前面我们知道read() 系统调用的过程中会把内核缓冲区的数据拷贝到用户的缓冲区里于是为了减少这一步开销我们可以用 mmap() 替换 read() 系统调用函数。 
buf  mmap(file, len);
write(sockfd, buf, len);mmap() 系统调用函数会直接把内核缓冲区里的数据「映射」到用户空间这样操作系统内核与用户空间就不需要再进行任何的数据拷贝操作。 
具体过程如下 
应用进程调用了 mmap() 后DMA 会把磁盘的数据拷贝到内核的缓冲区里。接着应用进程跟操作系统内核「共享」这个缓冲区应用进程再调用 write()操作系统直接将内核缓冲区的数据拷贝到 socket 缓冲区中这一切都发生在内核态由 CPU 来搬运数据最后把内核的 socket 缓冲区里的数据拷贝到网卡的缓冲区里这个过程是由 DMA 搬运的。 我们可以得知通过使用 mmap() 来代替 read() 可以减少一次数据拷贝的过程。 
但这还不是最理想的零拷贝因为仍然需要通过 CPU 把内核缓冲区的数据拷贝到 socket 缓冲区里而且仍然需要 4 次上下文切换因为系统调用还是 2 次。 
2、SendFile 
在 Linux 内核版本 2.1 中提供了一个专门发送文件的系统调用函数 sendfile()函数形式如下 
#include sys/socket.h
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); 
它的前两个参数分别是目的端和源端的文件描述符后面两个参数是源端的偏移量和复制数据的长度返回值是实际复制数据的长度。 
首先它可以替代前面的 read() 和 write() 这两个系统调用这样就可以减少一次系统调用也就减少了 2 次上下文切换的开销。 
其次该系统调用可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里不再拷贝到用户态这样就只有 2 次上下文切换和 3 次数据拷贝。如下图 但是这还不是真正的零拷贝技术如果网卡支持 SG-DMAThe Scatter-Gather Direct Memory Access技术和普通的 DMA 有所不同我们可以进一步减少通过 CPU 把内核缓冲区里的数据拷贝到 socket 缓冲区的过程。 
具体过程如下 
第一步通过 DMA 将磁盘上的数据拷贝到内核缓冲区里第二步缓冲区描述符和数据长度传到 socket 缓冲区这样网卡的 SG-DMA 控制器就可以直接将内核缓存中的数据拷贝到网卡的缓冲区里此过程不需要将数据从操作系统内核缓冲区拷贝到 socket 缓冲区中这样就减少了一次数据拷贝 这就是所谓的零拷贝Zero-copy技术因为我们没有在内存层面去拷贝数据也就是说全程没有通过 CPU 来搬运数据所有的数据都是通过 DMA 来进行传输的。 
总结 
I/O操作数据拷贝次数上下文切换次数传统I/O2次CPU拷贝2次DMA拷贝4MmapWrite1次CPU拷贝2次DMA拷贝4SendFile1次CPU拷贝2次DMA拷贝2SendFile  支持 SG-DMA1次DMA拷贝1次SG-DMA拷贝2 零拷贝技术的文件传输方式相比传统文件传输的方式减少了 2 次上下文切换和数据拷贝次数只需要 2 次上下文切换和数据拷贝次数就可以完成文件的传输而且 2 次的数据拷贝过程都不需要通过 CPU2 次都是由 DMA 来搬运。 
所以总体来看零拷贝技术可以把文件传输的性能提高至少一倍以上。 ps以下是我整理的java面试资料感兴趣的可以看看。最后创作不易觉得写得不错的可以点点关注 
链接https://www.yuque.com/u39298356/uu4hxh?# 《Java面试宝典》