下面是在Linux操作系统中将磁盘中的数据传输到网络设备上的示例图。


在图中可以看到数据先从磁盘上读取到用户空间而后再从用户空间写入到网络设备中,写入和读取一共经历四次拷贝,和四次状态的切换(用户到内核;内核到用户)。这对效率来说是不合适的,所以操作系统提供了另一种操作。用户通过sendfile()来使用这种方式。

可以看到用户调用sendfile()之后,直接在内核空间进行数据的传输了。但是在内核空间中还是进行了一次将内核中数据拷贝到socket buffer中的操作,相当于第二幅图中的2直接指向Socket。但是相对于传统的方式,只减少了一次数据拷贝,和上下文切换,没有做到真正的零拷贝。所以Linux2.4实现了下面的方式来实现真正的零拷贝,java NIO中的零拷贝也是指使用操作系统提供的下面这种方式。


数据从磁盘复制到kernel buffer,而后进行CPU copy,CPU copy不是复制数据,而是复制文件描述符(起始位置和长度)到socket buffer。直接将读取到内核的磁盘数据放置到protocol engine中发送出去。所以最终只进行了两次数据的拷贝。

java 的零拷贝多在网络应用程序中使用。关键的api是java.nio.channel.FileChannel的transferTo(),transferFrom()方法。我们可以用这两个方法来把bytes直接从调用它的channel传输到另一个writable byte channel,中间不会使数据经过应用程序,也就是用户空间,以便提高数据转移的效率。

具体性能相对于传统方式的比较可以在这里使用代码,亲自测试。

更多关于java零拷贝的内容和示例代码可以参考这里

操作系统中的零拷贝与java中的使用相关推荐

  1. 浅析操作系统和Netty中的零拷贝机制

    点击关注公众号,Java干货及时送达 零拷贝机制(Zero-Copy)是在操作数据时不需要将数据从一块内存区域复制到另一块内存区域的技术,这样就避免了内存的拷贝,使得可以提高CPU的.零拷贝机制是一种 ...

  2. java中的io复用_从 Java 中的零拷贝到五种IO模型

    在之前的文章中,我们聊过了 Java 中的零拷贝,零拷贝就是指数据不会在内核空间和用户空间之间相互拷贝.这样就减少了内核态与用户态的切换,自然就很高效. 拷贝文件只是 IO 操作中一个特殊的情况,大多 ...

  3. Netty、Kafka中的零拷贝技术到底有多牛?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:rrd.me/ggFBd 零拷贝,从字面意思理解就是数据不需 ...

  4. 深入探秘 Netty、Kafka 中的零拷贝技术!

    作者:ksfzhaohui 原文:juejin.im/post/5cad6f1ef265da039f0ef5df 零拷贝,从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能.我们也经常在 J ...

  5. linux 占用缓存前10_Linux 中的零拷贝技术

    什么是拷贝 要知道零拷贝,需要先知道什么是拷贝.其实这个"拷贝"来自于 Linux 中的标准 I/O 接口的基本数据拷贝的操作,而这一操作会导致数据在操作系统内核地址空间的缓冲区和 ...

  6. Linux 中的零拷贝技术,第 2 部分

    技术实现 本系列由两篇文章组成,介绍了当前用于 Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景.第一部分主要介绍了一些零拷贝技术的相关背景知识,简要概 ...

  7. 理解Netty中的零拷贝(Zero-Copy)机制

    理解Netty中的零拷贝(Zero-Copy)机制 发表于2年前(2014-01-13 15:11)   阅读(10209) | 评论(12) 164人收藏此文章,我要收藏 赞29 12月12日北京O ...

  8. Linux 中的零拷贝技术

    引言 传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输.这样做最大的好处是可以减 ...

  9. 系统在此应用程序中检测到基于堆栈的缓冲区_Linux 中的零拷贝技术

    转载:Linux 中的零拷贝技术,第 1 部分 引言 传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定 ...

最新文章

  1. 使用VS进行远程调试
  2. WPF系列学习之三(路由事件)
  3. arm汇编解析—qnnpack卷积实现
  4. 数据结构:堆和败者树的区别是什么?
  5. 语言图片渐入代码_这个可能打败Python的编程语言,正在征服科学界
  6. 吴恩达机器学习总结二:单变量线性回归
  7. config userc.php,框架内置Config.php配置
  8. Exception in thread main java.lang.NoClassDefFoundError解决了
  9. Windows Phone实用开发技巧(33):不重启程序切换当前语言
  10. catia设计树_CATIA目录树节点管理 | 坐倚北风
  11. mfc入门程序之简单的计算器
  12. 谷歌邮箱的注册以及GEE的注册使用教程
  13. 配置vscode解决code runner乱码
  14. 考研数学中的三角函数公式
  15. 头条小程序登录40014 bad params
  16. NX/UG二次开发-曲线-设置2D曲线最小曲率半径
  17. 华为MA5626-8密码恢复
  18. 【笔记】 C++中 方向键的输入
  19. STM32 HAL库ADC+DMA(非定时器)代码和遇到的问题
  20. Java生成包含大写字母,小写字母以及数字的无重复随机密码

热门文章

  1. suffix tree
  2. ios开发学习-网络(Networking) 效果源码分享--系列教程
  3. JS循环绑定对象或变量
  4. c语言sleep_编程代码:用C语言来实现下雪效果,这个冬天,雪花很美
  5. Swift实现CoreData存储数据
  6. HDUOJ---1863畅通工程
  7. Android应用自动更新功能实现使用AsyncTask!
  8. jdk中一些常见命令
  9. 如何编写企业解决方案书(转)
  10. NIO中的SelectionKey