认识零拷贝[通俗易懂]

认识零拷贝[通俗易懂]注意事项(1)零拷贝的含义是数据不从内核空间拷贝到用户空间,也不从用户空间拷贝到内核空间(2)零拷贝完全依赖操作系统,操作系统提供了就是提供了,没有提供就没有提供,java本身做不了任何事情传统的IO拷贝需求java读取磁盘上的文件,并且输出出去。这个过程包含两个步骤,一个是读,一个是写图片解读三列分别为用户空间、内核空间、硬件(1)read()syscall…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

注意事项

(1)零拷贝的含义是数据不从内核空间拷贝到用户空间,也不从用户空间拷贝到内核空间

(2)零拷贝完全依赖操作系统,操作系统提供了就是提供了,没有提供就没有提供,java本身做不了任何事情

传统的IO拷贝

需求

java读取磁盘上的文件,并且输出出去。这个过程包含两个步骤,一个是读,一个是写

图片解读

认识零拷贝[通俗易懂]

三列分别为用户空间、内核空间、硬件

  • (1)read() syscall :java客户端(jvm虚拟机)向操作系统发起读磁盘数据的请求
  • (2)ask for data :系统向磁盘读数据
  • (3)data to kernel buffer through DMA: 磁盘数据通过DMA读到内核缓存区
  • (4)copy data to user buffer :把数据内核缓冲区复制到用户缓冲区(java堆)中
  • (5)code logic coutinues:业务逻辑处理
  • (6)wirte() syscall,copies data to kernel socket buffer:java客户端向系统发起写请求,并且把用户缓冲区(java堆)数据复制到内核缓冲区
  • (7)weites data:从内核缓冲区写到磁盘
  • (8)done:返回结果
  • (9)write() returns:返回写入结果

图片分析

上图有4次上下文切换:

(1)read() syscall :java客户端(jvm虚拟机)向操作系统发起读磁盘数据的请求  —-》从用户态切换为内核态

(4)copy data to user buffer :把数据内核缓冲区复制到用户缓冲区(java堆)中—-》从内核态切换为用户态

(6)wirte() syscall,copies data to kernel socket buffer:java客户端向系统发起写请求,并且把用户缓冲区(java堆)数据复制到内核缓冲区—-》从用户态切换为内核态

(9)write() returns:返回写入结果—-》从内核态切换为用户态

上图有2次没有必要的数据拷贝(假设没有步骤5):

(4)copy data to user buffer :把数据内核缓冲区复制到用户缓冲区(java堆)中

(6)wirte() syscall,copies data to kernel socket buffer:java客户端向系统发起写请求,并且把用户缓冲区(java堆)数据复制到内核缓冲区

代码

InputStream 、OutputStream

Socket基础使用_CBeann的博客-CSDN博客

零拷贝

图片解读 

  • (1)sendfile() syscall : java客户端(jvm虚拟机)向操作系统发起读磁盘数据sendfile的请求
  • (2)ask for data :系统向磁盘读数据
  • (3)data to kernel buffer through DMA: 磁盘数据通过DMA读到内核缓存区
  • (4)wirte data to target socket buffer:从内核空间缓冲区写到socket缓冲区
  • (5)writes data:socket向目标发送数据
  • (6)done:返回结果
  • (7) sendfile() returns :返回sendfile结果

认识零拷贝[通俗易懂]

图片分析

上图有2次上下文切换(比传统的IO减少了2次切换):

(1)sendfile() syscall : java客户端(jvm虚拟机)向操作系统发起读磁盘数据sendfile的请求 —-》从用户态切换为内核态

(7) sendfile() returns :返回sendfile结果—-》从内核态切换为用户态

上图有3次数据拷贝(比传统的IO减少了1次):

(3)data to kernel buffer through DMA: 磁盘数据通过DMA读到内核缓存区

(4)wirte data to target socket buffer:从内核空间缓冲区写到socket缓冲区

(5)writes data:socket向目标发送数据

代码

 fileChannel.transferTo(, , );
 fileChannel.transferFrom(, , );

零拷贝升级版

升级版需要解决的问题:

上面零拷贝的第四步((4)从内核空间缓冲区写到socket缓冲区)是可以优化的

图片解读

看图片的下半部分:

看kernel buffer —————> socket buffer

Linux2.4之前的零拷贝是把 kernel buffer 中全部的数据 拷贝 到 socket buffer

Linux2.4之后的零拷贝是把kernel buffer中的地址和数据长度拷贝到到 socket buffer(优化后),类似

当真正发送数据的时候,客户端会从socketbuffer中拿到地址和数据长度找到kernel buffer 进行发送

这个过程只有2次数据拷贝,是真正意义上的零拷贝

认识零拷贝[通俗易懂]

认识零拷贝[通俗易懂]

参考

2018年最新深入netty 零基础到精通 张龙老师

视频去哪了呢?_哔哩哔哩_bilibili

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

https://mp.weixin.qq.com/s/dt0h2UhaoRECvjpeMZMsUA   (☆)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191078.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JSF标签_img标签详解

    JSF标签_img标签详解1.JSF入门藉由以下的几个主题,可以大致了解JSF的轮廓与特性,我们来看看网页设计人员与应用程序设计人员各负责什么。1.1简介JSFWeb应用程序的开发与传统的单机程序开发在本质上存在着太多的差异,

    2022年8月5日
    3
  • 树的先序遍历对应二叉树的_先序遍历输入一个二叉树

    树的先序遍历对应二叉树的_先序遍历输入一个二叉树笔试特别喜欢考这种题。先说一下思路。首先,需要明白前序、中序、后序遍历:①前序:根→左→右②中序:左→根→右③后序:左→右→根仅明白这个是不行的,还需要技巧。对于标题中的问题,我们很容易判断根节点是A,A的右节点是B,A的左边有CDFEGH,如下图:然后,将问题进行分解。去掉了AB结点之后,问题可分解如下:按照同样的套路,我们可以画出子问题的数大大概结构,如下图:与第一步画…

    2022年9月3日
    3
  • JS高级拖动技术 setCapture,releaseCapture

    JS高级拖动技术 setCapture,releaseCapture代码如下: window.onload=function(){ objDiv=document.getElementById(‘drag’); drag(objDiv); }; functiondrag(dv){ dv.onmousedown=function(e){ vard=document; e=e||window.event;

    2022年5月3日
    59
  • form表单提交的几种方法

    form表单提交的几种方法form表单提交的几种方法在form标签中添加Action(提交的地址)和method(post),且有一个submit按钮(<inputtype='submit'>)

    2022年7月3日
    22
  • 35岁以上的IT人士如果有一天被公司裁员了,该怎么办?

    35岁以上的IT人士如果有一天被公司裁员了,该怎么办?我觉得裁员和年龄无关,和本人的技能,工作态度,处事规则有关系。大家都知道华为裁员比例厉害,特别是对35岁以上的,会感到中年危机。但是我几个在华为的同学,都到了40岁了工作依然好好的,也没有见谁被裁掉。如果在工作中保持积极的态度,做事主动,平常多学习,和同事,领导的关系都不错,那么也不会被裁掉。作为已经到而立之年的中年人,给大家一点建议吧。在工作和生活中时刻保持乐观的心态,做事积极主动,多想多思考,与同事和领导友好相处,尽量让自己成为不可替代的人。那么你就不会被裁掉,也不会有中年危机。…

    2022年7月18日
    46
  • Android之include避免代码重复

    在做布局时,经常有些部分是重复的,比如title或者foot的地方,最简单的办法当然是直接复制过去,这里介绍include的用法,有过c++或者c经验的同学一看就明白了,就是把另一个布局包含进来.先看下实现的效果:里面上下各有两个文字布局,是用include包含进去的,直接看代码activity_main.xml:

    2022年3月11日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号