您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Linux操作系统中的零拷贝技术,是怎么一回事

时间:2019-10-14 10:35:22  来源:  作者:

我们都知道,互联网的世界其实就是数据的世界,无论你是在微信上聊天,在玩王者荣耀,还是逛淘宝,看小姐姐直播,背后其实都是数据的传输。

 

Linux操作系统中的零拷贝技术,是怎么一回事

 

 

相信大部分学过计算机操作系统的程序员都知道,假如我们的数据存放在计算机的文件上(数据库实际上也是存放在文件上),要把文件上的内容拷贝给用户,需要经过多少次复制呢?

首先,我们需要把内容从文件中拷贝到我们的应用中,虽然这听起来只有一次拷贝,实际上操作系统会进行两次拷贝,首先会先把文件拷贝到操作系统内核,然后再从操作系统内核上拷贝到应用当中。同理,我们把内容拷贝到Socket传输给用户的过程也是一样的,需要先拷贝给操作系统内核,再拷贝给对应的Socket。一个简单的功能,竟然要经过4次拷贝。

那么如何优化这么一个过程呢?linux有一个非常牛的技术,叫做零拷贝,那么在JAVA中如何实现呢?我发现很多Java程序员,虽然说是精通Java更多的是精通JavaWeb。其实Java也是非常博大精深的,Java的NIO其实已经帮我们解决了这个问题。

在Java NIO中,我们可以通过FileChannel.map,可以越过内核态,直接从文件拷贝数据到应用当中,同样,可以把越过内核态,直接把数据从应用中拷贝到Socket中发送给用户。这样子,我们的系统调用,就变成了文件到应用到Socket,只要进行2次拷贝即可。

同时,我们Java NIO还提供给我们另外一个方法,可以不用经过应用,直接从文件中拷贝到Socket中,这就是FileChannel.transferTo。它会把数据从文件拷贝到内核中,然后从内核直接把数据再次拷贝给接收的Socket发送给用户。

总结

好了,这就是Java当中的零拷贝技术了。JavaNIO,在程序员面试中也是经常出现的,如果你有兴趣,欢迎关注我,我们一起学习,共同进步。同名公众号(沙茶敏碎碎念)



Tags:零拷贝技术   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
本文探讨Linux中 主要的几种零拷贝技术 以及零拷贝技术 适用的场景 。为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入:01 引文在写一个服务端程序时(Web Server或者...【详细内容】
2020-06-24  Tags: 零拷贝技术  点击:(77)  评论:(0)  加入收藏
零拷贝,从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能。我们也经常在 Java NIO,Netty,Kafka,RocketMQ 等框架中听到零拷贝,它经常作为其提升性能的一大亮点下面从...【详细内容】
2020-03-27  Tags: 零拷贝技术  点击:(90)  评论:(0)  加入收藏
传统IO过程考虑这样一个过程:我们从磁盘中读取一个文件数据,然后将数据通过网络传输到另一个机器。对用户来说可能就是简单的理解为两步操作。File.read(fileDesc, buf, len);...【详细内容】
2020-01-02  Tags: 零拷贝技术  点击:(73)  评论:(0)  加入收藏
我们都知道,互联网的世界其实就是数据的世界,无论你是在微信上聊天,在玩王者荣耀,还是逛淘宝,看小姐姐直播,背后其实都是数据的传输。 相信大部分学过计算机操作系统的程序员都...【详细内容】
2019-10-14  Tags: 零拷贝技术  点击:(84)  评论:(0)  加入收藏
本文讲解 Linux 的零拷贝技术,云计算是一门很庞大的技术学科,融合了很多技术,Linux 算是比较基础的技术,所以,学好 Linux 对于云计算的学习会有比较大的帮助。本文借鉴并总结了...【详细内容】
2019-08-07  Tags: 零拷贝技术  点击:(278)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条