首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你了解零拷贝吗?

二、传统读操作

三、传统写操作

上图是JAVA传统的写操作,具体流程:

六、mmap+write方式

使用mmap+write方式替换原来的传统IO方式,就是利用了虚拟内存的特性,看图

整体流程的核心区别就是,把数据读取到内核缓冲区后,应用程序进行写入操作时,直接是把内核的Read Buffer的数据 复制到 Socket Buffer 以便进行写入,这次内核之间的复制也是需要CPU参与的

注意:最后把Socket Buffer数据拷贝到很多地方,统称protocol engine(协议引擎)

这个流程就少了一个CPU Copy,提升了IO的速度。不过发现上下文的切换还是4次,没有减少,因为还是要应用程序发起write操作。那能不能减少上下文切换呢?

七、sendfile方式

这种方式可以替换上面的mmap+write方式,如:

mmap();

write();

替换为

sendfile();

这样就减少了一次上下文切换,因为少了一个应用程序发起write操作,直接发起sendfile操作。

到这里就只有3次Copy,其中只有1次CPU Copy;3次上下文切换。那能不能把CPU Copy减少到没有呢?

八、gather

Linux2.4内核进行了优化,提供了gather操作,这个操作可以把最后一次CPU Copy去除,什么原理呢?就是在内核空间Read Buffer和Socket Buffer不做数据复制,而是将Read Buffer的内存地址、偏移量记录到相应的Socket Buffer中,这样就不需要复制(其实本质就是和虚拟内存的解决方法思路一样,就是内存地址的记录),如图:

九、JAVA零拷贝

java nio实现零拷贝,JAVA提供了一下方法类:

1、MappedByteBuffer

2、DirectByteBuffer

3、FileChannel.transferTo

具体如何使用,小伙伴们上网自行查阅。

十、总结

零拷贝技术在很多中间件中,都有利用;如:Kafka,Spark、RocketMQ等,这个在网络传输数据时,能够提升速度,提升系统性能、吞吐量。小伙伴们不一定会编写,可以先了解基本原理就行。很多好的中间件产品都需要了解一些计算机原理方面的知识,才会更深入的理解。

好了,老顾今天就介绍到这里,谢谢!!!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O4IjBD-iFT8jcF1PZvRr79Lw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券