操作系统中的零拷贝与java中的使用

下面是在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零拷贝的内容和示例代码可以参考这里

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值