java的零拷贝机制

转: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将数据从内核拷贝至协议引擎
    6. 零拷贝-mmap 对应到java中
      为MappedByteBuffer//文件内存映射
      1. 数据不会复制到用户空间,只在内核空间,与sendfile类似,但是应用程序可以直接操作该内存。
    7. 参考资料

原文地址:https://www.cnblogs.com/fengli9998/p/10231329.html

时间: 2024-10-19 01:26:37

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

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

深入剖析Linux IO原理和几种零拷贝机制的实现 来源 https://zhuanlan.zhihu.com/p/83398714 零壹技术栈      公众号[零壹技术栈] 前言 零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及 CPU 的拷贝时间.它的作用是在数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现 CPU 的零参与,彻底消除 CPU 在这方面的负载.实现零拷贝

7. NIO与零拷贝

一.零拷贝 1.介绍 零拷贝描述的是CPU不执行拷贝数据从一个存储区域到另一个存储区域的任务,这通常用于通过网络传输一个文件时以减少CPU周期和内存带宽. 优点: 减少甚至完全避免不必要的CPU拷贝,从而让CPU解脱出来去执行其他的任务 减少内存带宽的占用 通常零拷贝技术还能够减少用户空间和操作系统内核空间之间的上下文切换 2.传统copy机制 Java 传统 IO 和 网络编程的一段代码: 1 File file = new File("test.txt"); 2 RandomAcc

理解Netty中的零拷贝(Zero-Copy)机制【转】

理解零拷贝 零拷贝是Netty的重要特性之一,而究竟什么是零拷贝呢? WIKI中对其有如下定义: "Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. 从WIKI的定义中,我们看到"零拷贝"是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源

零拷贝Zero copy-linux and java

背景-几种拷贝方式 方式1:Copying in Two Sample System Calls read(file, tmp_buf, len); write(socket, tmp_buf, len); 首先,调用read时,文件A copy到了kernel模式: 之后,CPU控制将kernel模式数据copy到user模式下: 调用write时,先将user模式下的内容copy到kernel模式下的socket的buffer中: 最后将kernel模式下的socket buffer的数据c

Java零拷贝

1.摘要 java 的zero copy多在网络应用程序中使用.Java的libaries在linux和unix中支持zero copy,关键的api是java.nio.channel.FileChannel的transferTo(),transferFrom()方法.我们可以用这两个方法来把bytes直接从调用它的channel传输到另一个writable byte channel,中间不会使data经过应用程序,以便提高数据转移的效率. 2.介绍 java 的zero copy多在网络应用程

Java中的反射机制

Java反射的概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 Java反射机制主要提供下面几种用途: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法 4.在运行时调用任意一个对象的方法 首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的 i

Linux 中的零拷贝技术,第 2 部分

技术实现 本系列由两篇文章组成,介绍了当前用于 Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景.第一部分主要介绍了一些零拷贝技术的相关背景知识,简要概述了 Linux 为什么需要零拷贝技术以及 Linux 中都有哪几种零拷贝技术.本文是本系列文章的第二部分,针对第一部分内容中提到的几种零拷贝技术分别进行更详细的介绍,并对这些零拷贝技术的优缺点进行分析. 0 评论: 黄 晓晨, 软件工程师, IBM 冯 瑞, 软件工程师, IBM 2011 年 1

从rocketMQ到零拷贝

rocketMQ是阿里的开源MQ,号称很强大很强大 rocketMQ的网络实现是依赖netty http://my.oschina.net/plucury/blog/192577 这篇文章中描述了netty的零拷贝实现: 根据文中的描述,"Linux中的sendfile()以及Java NIO中的FileChannel.transferTo()方法都实现了零拷贝的功能",似乎"FileChannel.transferTo()和sendfile()是同一层的实现",n

记录Java的垃圾回收机制和几种引用

一.Java的垃圾回收机制 Java的垃圾回收机制(java garbage collection)是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的堆内存空间. 注意粗体字的地方,java的垃圾回收线程是优先级比较低的线程,什么时候进行垃圾回收难以确定.当某些对象被标记为垃圾对象后,等垃圾回收线程运行时,就会将这些对象回收(确切的说应该是回收这些对象所占的堆内存空间). 二.什么样的对象会被标记成垃圾对象呢? 一般来说,所有指向对象的引用都已失效,不可能再有