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

- 避免了第2,3步的数据拷贝,参考下图:
java的零拷贝机制的更多相关文章
- 深入剖析Linux IO原理和几种零拷贝机制的实现
深入剖析Linux IO原理和几种零拷贝机制的实现 来源 https://zhuanlan.zhihu.com/p/83398714 零壹技术栈 公众号[零壹技术栈] 前言 零拷贝(Zero ...
- 框架篇:Linux零拷贝机制和FileChannel
前言 大白话解释,零拷贝就是没有把数据从一个存储区域拷贝到另一个存储区域.但是没有数据的复制,怎么可能实现数据的传输呢?其实我们在java NIO.netty.kafka遇到的零拷贝,并不是不复制数据 ...
- Netty源码解析 -- 零拷贝机制与ByteBuf
本文来分享Netty中的零拷贝机制以及内存缓冲区ByteBuf的实现. 源码分析基于Netty 4.1.52 Netty中的零拷贝 Netty中零拷贝机制主要有以下几种 1.文件传输类DefaultF ...
- Java基础-零拷贝技术应用案例
Java基础-零拷贝技术应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 零拷贝技术在Hadoop生态圈中很多组件得到应用,典型的比如kafka组件,它就很成功的应用了零拷贝 ...
- Java后端进阶-网络编程(Netty零拷贝机制)
package com.study.hc.net.netty.demo; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled ...
- NIO学习笔记,从Linux IO演化模型到Netty—— Java NIO零拷贝
同样只是大致上的认识. 其中,当使用transferFrom,transferTo的时候用的sendfile(). 如果系统内核不支持 sendfile,进一步执行 transferToTrusted ...
- kafka零拷贝机制
kafka之所以那么快,其中一个很大的原因就是零拷贝(Zero-copy)技术,零拷贝不会kafka的专利,而是操作系统的升级,又比如Netty,也用到了零拷贝. 传统IO kafka的数据是要落入磁 ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- 【Java】Java中的零拷贝
物理内存 计算机物理内存条的容量,比如我们买电脑会关注内存大小有多少G,这个容量就是计算机的物理内存. 虚拟内存 操作系统为每个进程分配了独立的虚拟地址空间,也就是虚拟内存,虚拟地址空间又分为用户空间 ...
随机推荐
- powerdesigner 16.5 不允许有扩展属性,或对象不存在
创建完之后这边会出现 选择刚创建的用户 这样就可以了
- Python学习之路————Day03
今日内容: 1.IDE开发环境的安装 2.基本数据类型的使用 3.运算符 一. 算术运算符: 比较运算符 赋值运算符 逻辑运算符 身份运算符:is比较的是id 而==比较的是值 二.基本数据类型 为什 ...
- JQuery跳出each循环的方法(包含数组遍历)
0. 前言 也许我们通过 jquery 的循环方法进行数组遍历,但是当不符合条件时,怎么跳出当前循环?(即用each方法内,当不满足条件时想break跳出循环体,想continue继续执行下一个循环遍 ...
- OPENQUERY (Transact-SQL)
Syntax Copy OPENQUERY ( linked_server ,'query' ) Arguments linked_serverIs an identifier representin ...
- 【RNN】资源汇总
wesome Recurrent Neural Networks A curated list of resources dedicated to recurrent neural networks ...
- Java之视频读取IO流解帧实施方案
获取视频处理对象的方式有很多,读取本地文件.读取url.读取摄像头等,而直接读流解析视频的实施方案却难以寻觅.此处有两种方案处理视频流(此处设定场景为用户上传视频,同时两种方式均需服务端安装ffmpe ...
- CNN卷积神经网络人脸识别
图片总共40个人,每人10张图片,每张图片高57,宽47.共400张图片. 读取图片的py文件 import numpyimport pandasfrom PIL import Imagefrom k ...
- D - Mayor's posters POJ - 2528 离散化+线段树 区间修改单点查询
题意 贴海报 最后可以看到多少海报 思路 :离散化大区间 其中[1,4] [5,6]不能离散化成[1,2] [2,3]因为这样破坏了他们的非相邻关系 每次离散化区间 [x,y]时 把y+1点也加入 ...
- CF1106F Lunar New Year and a Recursive Sequence
题目链接:CF1106F Lunar New Year and a Recursive Sequence 大意:已知\(f_1,f_2,\cdots,f_{k-1}\)和\(b_1,b_2,\cdot ...
- 【HDU - 4348】To the moon(主席树在线区间更新)
BUPT2017 wintertraining(15) #8G 题意 给一个数组a,有n个数,m次操作.\(N, M ≤ 10^5, |A i| ≤ 10^9, 1 ≤ l ≤ r ≤ N, |d| ...