转: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. flask 下载本地文件

    下载本地文件就是找到文件路径  调用flask自带的send_file(路径)下载, 并返回 flask: # 下载文件 from flask import send_file@task_mgm.ro ...

  2. Druid数据库连接池

    一.Druid连接池的创建 package cn.zhouzhou; import java.io.IOException; import java.io.InputStream; import ja ...

  3. Python学习之路——day05

    今日内容:1.可变与不可变类型:可变类型:值可以改变,但是id不变,证明就是在改变原值,是可变类型不可变类型:值改变,但是id也跟着改变,证明是残生了新的值,是不可变类型 2.数字类型2.1整型:记录 ...

  4. codeforces534B

    Covered Path CodeForces - 534B The on-board computer on Polycarp's car measured that the car speed a ...

  5. Android组件化、模块化、插件化

    组件:指的是单一的功能组件,如地图组件(MapSDK).扫码组件(QRCode).支付组件(AnjukePay).路由组件(Router)等等: 模块:指的是独立的业务模块,如新房模块(NewHous ...

  6. 概念数据模型CDM基础

    概念数据模型CDM 概念数据模型是设计数据库不可或缺的一步,是整个数据库设计的关键,CDM的主要作用如下: 1)能够真实地模拟真实世界,是需求分析人员和数据库设计人员沟通的桥梁.2)将系统需求分析得到 ...

  7. Tarjan总结(缩点+割点(边)+双联通+LCA+相关模板)

    Tarjan求强连通分量 先来一波定义 强连通:有向图中A点可以到达B点,B点可以到达A点,则称为强连通 强连通分量:有向图的一个子图中,任意两个点可以相互到达,则称当前子图为图的强连通分量 强连通图 ...

  8. CS academy Binary Flips(dp)

    开学啦,没啥时间写博客..过几天就能又停课啦qwq 做点中等 \(dp\) 题来找找 noip 的感觉 233 题意 原题戳这里. 给你一个 \(n \times m\) 的矩阵 \(A\) ,一开始 ...

  9. 【BZOJ1188】分裂游戏(博弈论)

    [BZOJ1188]分裂游戏(博弈论) 题面 BZOJ 洛谷 题解 这道题目比较神仙. 首先观察结束状态,即\(P\)状态,此时必定是所有的豆子都在最后一个瓶子中. 发现每次的转移一定是拿出一棵豆子, ...

  10. VC++2010组件安装失败解决办法

    安装SQLSERVER时,安装不上,总是报错说 VC++2010组件安装错误. 单独安装时,也会报出严重错误无法安装.就是下面这两个 最后到网上找到一个办法解决了:如下: 下载这个软件 Microso ...