java零拷贝原理
来源:互联网 发布:子曰能以礼让为国乎 编辑:程序博客网 时间:2024/06/08 19:11
为何要懂零拷贝原理?因为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将数据从内核拷贝至协议引擎
- 避免了第2,3步的数据拷贝,参考下图:
- 零拷贝-mmap 对应到java中
为MappedByteBuffer//文件内存映射- 数据不会复制到用户空间,只在内核空间,与sendfile类似,但是应用程序可以直接操作该内存。
- 参考资料
- http://blog.chinaunix.net/uid-25314474-id-3325879.html
- http://blog.chinaunix.net/uid-28874972-id-3725082.html
- https://www.ibm.com/developerworks/cn/java/j-zerocopy/#fig1
- http://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/
- https://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy2
阅读全文
0 0
- java零拷贝原理
- 10.零拷贝原理
- Java Nio 零拷贝
- 零拷贝原理(zero copy)
- 零拷贝
- 零拷贝
- 零拷贝
- 零拷贝:
- Java深拷贝与浅拷贝原理
- 零拷贝原理-数据的收发-软中断和DMA
- netty学习十三:零拷贝底层实现原理
- 深拷贝 浅拷贝 内存零拷贝
- 零拷贝技术
- NTZC零拷贝技术
- 零拷贝与 sendfile
- linux 零拷贝技术
- 零拷贝技术
- 零拷贝的定义
- 获取设备信息脚本
- hibernate validate 自定义对类的验证,可以同时验证几个字段的关联关系
- 移除除input type="number"在不同浏览器下的箭头
- java 数据存入mysql表中乱码
- VC 6.0 实现串口通信
- java零拷贝原理
- 内存管理(3602017秋招真题)
- Python 工具pip的安装使用 xlrd
- System.IO.IOException: Sharing violation on pat
- angular-fullpage实现尾屏效果
- 宋牧春: Linux设备树文件结构与解析深度分析(1)
- spring-boot 实现通过访问路径后加参数返回json数据
- 写给自己的
- Apsara Clouder云计算专项技能认证的网站建设-部署与发布,你知道吗?