零拷贝相关知识点(一)

打印 上一主题 下一主题

主题 848|帖子 848|积分 2544

前言

大家好,我是程序员田螺
零拷贝是老生常谈的问题啦,大厂非常喜欢问。比如Kafka为什么快,RocketMQ为什么快等,都涉及到零拷贝知识点。最近技术讨论群几个同伴分享了阿里、虾皮的口试真题,也都涉及到零拷贝。因此本文将跟大家一起来学习零拷贝原理。
1. 什么是零拷贝
2. 传统的IO执行流程
3. 零拷贝相关的知识点回首
4. 零拷贝实现的几种方式
5. java提供的零拷贝方式
1.什么是零拷贝

零拷贝字面上的意思包括两个,“零”和“拷贝”:


  • “拷贝”:就是指数据从一个存储区域转移到另一个存储区域。
  • “零” :表示次数为0,它表示拷贝数据的次数为0。
合起来,那零拷贝就是不须要将数据从一个存储区域复制到另一个存储区域咯。
零拷贝是指计算机执行IO利用时,CPU不须要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及CPU的拷贝时间。它是一种<font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">I/O</font>利用优化技术。
所谓的【零拷贝】,并不是真正无拷贝,而是在不会拷贝重复数据到 jvm 内存中。
2. 传统 IO 的执行流程

做服务端开发的小同伴,文件下载功能应该实现过不少了吧。假如你实现的是一个web程序,前端请求过来,服务端的使命就是:将服务端主机磁盘中的文件从已毗连的socket发出去。关键实现代码如下:
代码语言:javascript
复制
  1. while((n = read(diskfd, buf, BUF_SIZE)) > 0)
  2.     write(sockfd, buf , n);
复制代码
传统的IO流程,包括read和write的过程。


  • <font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">read</font>:把数据从磁盘读取到内核缓冲区,再拷贝到用户缓冲区
  • <font style="color:rgb(10, 191, 91);background-color:rgb(243, 245, 249);">write</font>:先把数据写入到socket缓冲区,最后写入网卡设备。
流程图如下:



  • 用户应用进程调用read函数,向利用体系发起IO调用,上下文从用户态转为内核态(切换1)
  • DMA控制器把数据从磁盘中,读取到内核缓冲区。
  • CPU把内核缓冲区数据,拷贝到用户应用缓冲区,上下文从内核态转为用户态(切换2),read函数返回
  • 用户应用进程通过write函数,发起IO调用,上下文从用户态转为内核态(切换3)
  • CPU将用户缓冲区中的数据,拷贝到socket缓冲区
  • DMA控制器把数据从socket缓冲区,拷贝到网卡设备,上下文从内核态切换回用户态(切换4),write函数返回
从流程图可以看出,传统IO的读写流程,包括了4次上下文切换(4次用户态和内核态的切换),4次数据拷贝(两次CPU拷贝以及两次的DMA拷贝),什么是DMA拷贝呢?我们一起往返顾下,零拷贝涉及的利用体系知识点哈。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表