转: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. Druid数据库连接池

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

  2. 三星 SCX-4521NS 网络打印机 在XP 下 强行 设置 安装

    添加打印机加上之后,图标是半虚的,状态脱机,网上找了很多方法都不好使. 包括官方的:http://www.samsung.com/cn/support/skp/faq/442292 然后死马当活马医, ...

  3. 用MyEclipse自带工具生成WebService客户端代码

    本文章主要是介绍如何利用已经发布了的Webservice的wsdl来自动生成java的客户端代码.注意:本方法需要你采用的java版本是1.5或者以上的版本,采用MyEclipse来自动生成代码. w ...

  4. java基础1之基本数据类型

    java的数据类型 整数型(byte.short.int.long) 编程过程中,默认是int类型.long类型的字面值后面需要加上L或l PS:java底层,byte.short是按照32位计算的. ...

  5. Codeforces Round #429 Div. 1

    A:甚至连题面都不用仔细看,看一下样例就知道是要把大的和小的配对了. #include<iostream> #include<cstdio> #include<cmath ...

  6. Linux服务器下安装vmware虚拟机

    安装包 1.VMware 14 https://dl-sh-ctc-2.pchome.net/08/b7/VMware-Workstation-Full-14.1.3-9474260.x86_64.b ...

  7. python字符编码与文件打开

    一 字符编码 储备知识点: 1.计算机系统分为三层: 应用程序 操作系统 计算机硬件 2.运行Python程序的三个步骤 1.先启动python解释器 2.再将python文件当做普通的文本文件读入内 ...

  8. HDU1251 字典树板子题

    题意:中文题,统计以某字符串作为前缀的字符串个数 刚学字典树,理解起来十分简单,就是维护一个多叉树,这里用的是链表版本,后面就用的是数组版本了,个人更喜欢数组版本,这里的链表版本就因为 莫名其妙的错误 ...

  9. pip详解

    pip是一个安装和管理 Python 包的工具.python安装包的工具有easy_install, setuptools, pip,distribute等,pip是Python官方推荐的包管理工具 ...

  10. 微信小程序API 文档快速参考索引

    内容那么多,这个页面到底做了什么? 第一:解决微信文档APi文档使用不便: 第二:解决了内容搜索与索引:—— 最好是写成全文索引文档,但是比较需要时间,而且更新是一件麻烦的事:所以以下是直接 连接官网 ...