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,这个容量就是计算机的物理内存. 虚拟内存 操作系统为每个进程分配了独立的虚拟地址空间,也就是虚拟内存,虚拟地址空间又分为用户空间 ...
随机推荐
- Lodop打印设计矩形重合预览线条变粗
LODOP中的打印设计是辅助进行开发的,实际打印效果应以预览为准,很多效果都是在设计界面显示不出来,或设计和预览界面有差异.例如add_print_text文本的字间距.行间距,旋转,还有允许标点溢出 ...
- codeforces589I
Lottery CodeForces - 589I Today Berland holds a lottery with a prize — a huge sum of money! There ar ...
- Nginx 防盗链 secure_link 模块
L:76 需要通过 --with-http_secure_link_module 编译进Nginx secure_link 指令 Syntax: secure_link expression; Def ...
- raise missingsectionheadererror:file containe no section headers问题解决
本人亲测,遇到这个问题,就换到管理员方式运行命令 因为太小白,所以这次重新装包的时候切换到D盘了,想着省一点儿C盘内存,结果,每次pip install安装的时候都是这个问题,中间还有什么反序列失败, ...
- BZOJ2738 矩阵乘法(整体二分+树状数组)
单个询问二分答案即可,多组询问直接整体二分再二维BIT.注意保证复杂度. #include<iostream> #include<cstdio> #include<cma ...
- flask之三方组件
Flask-session Flask-session跟框架自带的session有什么区别呢 框架自带的session是通过请求上下文~放入到Local中的~那如果我们想把session放入别的地方怎 ...
- Django 下载和初识
Django Django官网下载页面 安装(安装最新LTS版): pip3 install django==1.11.9 创建一个django项目: 下面的命令创建了一个名为"mysite ...
- 自学Linux命令行与Shell脚本之路
自学Linux命令行与Shell脚本之路[第一回]:初识Linux 1.1 自学Linux Shell1.1-Linux初识 1.2 自学Linux Shell1.2-Linux目录结构 1.3 ...
- NOI2009管道取珠(dp)
题意:给定两列球,可以从任意一列球的末尾弹出一个球,最后会得到一个序列,设第i种序列可以被a[i]种操作产生,那么会产生a[i]^2的贡献,求贡献和. Solution: 首先我们观察a[i]^2的含 ...
- 洛谷4451 整数的lqp拆分(生成函数)
比较水的一题.居然是一道没看题解就会做的黑题…… 题目链接:洛谷 题目大意:定义一个长度为 $m$ 的正整数序列 $a$ 的价值为 $\prod f_{a_i}$.($f$ 是斐波那契数)对于每一个 ...