转:https://blog.csdn.net/zhouhao88410234/article/details/77574689?fps=1&locationNum=9

为何要懂零拷贝原理?因为rocketmq存储核心使用的就是零拷贝原理。

    1. io读写的方式
      1. 中断
      2. DMA
    2. 中断方式
      1. 中断方式的流程图如下:
        1. 用户进程发起数据读取请求
        2. 系统调度为该进程分配cpu
        3. cpu向io控制器(ide,scsi)发送io请求
        4. 用户进程等待io完成,让出cpu
        5. 系统调度cpu执行其他任务
        6. 数据写入至io控制器的缓冲寄存器
        7. 缓冲寄存器满了向cpu发出中断信号
        8. cpu读取数据至内存
      2. 缺点:中断次数取决于缓冲寄存器的大小
    3. DMA : 直接内存存取
      1. DMA方式的流程图如下:
        1. 用户进程发起数据读取请求
        2. 系统调度为该进程分配cpu
        3. cpu向DMA发送io请求
        4. 用户进程等待io完成,让出cpu
        5. 系统调度cpu执行其他任务
        6. 数据写入至io控制器的缓冲寄存器
        7. DMA不断获取缓冲寄存器中的数据(需要cpu时钟)
        8. 传输至内存(需要cpu时钟)
        9. 所需的全部数据获取完毕后向cpu发出中断信号
      2. 优点:减少cpu中断次数,不用cpu拷贝数据
    4. 数据拷贝
      1. 下面展示了 传统方式读取数据后并通过网络发送 所发生的数据拷贝:
        1. 一个read系统调用后,DMA执行了一次数据拷贝,从磁盘到内核空间
        2. read结束后,发生第二次数据拷贝,由cpu将数据从内核空间拷贝至用户空间
        3. send系统调用,cpu发生第三次数据拷贝,由cpu将数据从用户空间拷贝至内核空间(socket缓冲区)
        4. send系统调用结束后,DMA执行第四次数据拷贝,将数据从内核拷贝至协议引擎
        5. 另外,这四个过程中,每个过程都发生一次上下文切换
      2. 内存缓冲数据,主要是为了提高性能,内核可以预读部分数据,当所需数据小于内存缓冲区大小时,将极大的提高性能。
      3. 零拷贝是为了消除这个过程中冗余的拷贝
    5. 零拷贝-sendfile 对应到java中
      为FileChannel.transferTo(long position, long count, WritableByteChannel target)//将数据从文件通道传输到了给定的可写字节通道
      1. 避免了第2,3步的数据拷贝,参考下图:
        1. DMA从拷贝至内核缓冲区
        2. cpu将数据从内核缓冲区拷贝至内核空间(socket缓冲区)
        3. DMA将数据从内核拷贝至协议引擎
        4. 这三个过程中共发生2次上下文切换,分别为发起读取文件和发送数据
      2. 以上过程发生了三次数据拷贝,其中有一次为cpu完成
      3. linux内核2.4以后,socket缓冲区做了调整,DMA带收集功能,如下图:
        1. DMA从拷贝至内核缓冲区
        2. 将数据的位置和长度的信息的描述符增加至内核空间(socket缓冲区)
        3. DMA将数据从内核拷贝至协议引擎
          所谓零拷贝,指的是应用内存与内核内存不存在拷贝。
          对应零拷贝技术有mmap及sendfile

java的零拷贝机制的更多相关文章

  1. 深入剖析Linux IO原理和几种零拷贝机制的实现

    深入剖析Linux IO原理和几种零拷贝机制的实现 来源 https://zhuanlan.zhihu.com/p/83398714 零壹技术栈      公众号[零壹技术栈] 前言 零拷贝(Zero ...

  2. 框架篇:Linux零拷贝机制和FileChannel

    前言 大白话解释,零拷贝就是没有把数据从一个存储区域拷贝到另一个存储区域.但是没有数据的复制,怎么可能实现数据的传输呢?其实我们在java NIO.netty.kafka遇到的零拷贝,并不是不复制数据 ...

  3. Netty源码解析 -- 零拷贝机制与ByteBuf

    本文来分享Netty中的零拷贝机制以及内存缓冲区ByteBuf的实现. 源码分析基于Netty 4.1.52 Netty中的零拷贝 Netty中零拷贝机制主要有以下几种 1.文件传输类DefaultF ...

  4. Java基础-零拷贝技术应用案例

    Java基础-零拷贝技术应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 零拷贝技术在Hadoop生态圈中很多组件得到应用,典型的比如kafka组件,它就很成功的应用了零拷贝 ...

  5. Java后端进阶-网络编程(Netty零拷贝机制)

    package com.study.hc.net.netty.demo; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled ...

  6. NIO学习笔记,从Linux IO演化模型到Netty—— Java NIO零拷贝

    同样只是大致上的认识. 其中,当使用transferFrom,transferTo的时候用的sendfile(). 如果系统内核不支持 sendfile,进一步执行 transferToTrusted ...

  7. kafka零拷贝机制

    kafka之所以那么快,其中一个很大的原因就是零拷贝(Zero-copy)技术,零拷贝不会kafka的专利,而是操作系统的升级,又比如Netty,也用到了零拷贝. 传统IO kafka的数据是要落入磁 ...

  8. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  9. 【Java】Java中的零拷贝

    物理内存 计算机物理内存条的容量,比如我们买电脑会关注内存大小有多少G,这个容量就是计算机的物理内存. 虚拟内存 操作系统为每个进程分配了独立的虚拟地址空间,也就是虚拟内存,虚拟地址空间又分为用户空间 ...

随机推荐

  1. ABP实践学习

    一.

  2. 安装mysql zip5.6版--安裝

    第一步当然是下载了,我下载的是压缩包形式的安装包,这种直接解压就可以了,地址是:https://dev.mysql.com/downloads/file/?id=468784 第二步就是解压了,解压到 ...

  3. 将数组Arrays转成集合List

    String[] split = pids.split("-"); //将数组split转成集合 List<String> asList = Arrays.asList ...

  4. JavaScript知识点总结[部分]

    变量 局部变量必须一个 var 开头,如果未使用var,则默认表示声明的是全局变量. <script type="text/javascript"> // 全局变量 n ...

  5. Jury Compromise POJ - 1015 dp (标答有误)背包思想

    题意:从 n个人里面找到m个人  每个人有两个值  d   p     满足在abs(sum(d)-sum(p)) 最小的前提下sum(d)+sum(p)最大 思路:dp[i][j]  i个人中  和 ...

  6. LOJ2269 [SDOI2017] 切树游戏 【FWT】【动态DP】【树链剖分】【线段树】

    题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FW ...

  7. DrawableAnimation小练习

    DrawableAnimation,也就是帧动画,将图片一张张显示出来,从而形成动画的效果 先在项目文件夹下新建一个目录drawable,然后在里面新建一个xml文件,自定义文件名,我的叫my_ani ...

  8. 基于FPGA的UART协议实现(通过线性序列机)

    //////////////////2018/10/15 更新源代码: 实现uart这东西其实早就写了,不过不太完善,对于一个完美主义者来说,必须解决掉它. 1.什么是UART?        通用异 ...

  9. CCPC-Wannafly Winter Camp Day1 (Div2, onsite) A B C E F I J

    A 机器人 链接:https://www.cometoj.com/contest/7/problem/A?problem_id=92 思路: 分两大类讨论: 1. B区没有点: (1)点都在起点左边 ...

  10. haar的简单应用(2)

    上次对图片进行了人脸识别,这次对摄像头捕获的内容进行识别 直接写注释来解释 import cv2 def CatchUsbVideo(window_name, camera_idx): #定义一个函数 ...