技术开发站45793.com
第三章 第三节NIO零拷贝
发布时间:
2023年12月18日
1. NIO与零拷贝
1.1 零拷贝基本介绍
零拷贝是网络编程的关键,很多性能优化都离不开
Java程序中,常用的零拷贝有mmap(内存映射)和sendFile。
传统的IO数据读写
需要三次用户态和内核态切换
4次内存的拷贝
mmap优化
mmap经过内存映射(userbuffer 和 kernelbuffer 共享),将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据(直接从内核空间buffer拷贝到内核空间socketbuffer)。这样,进行网络传输时,可以减少内核空间到用户空间的拷贝次数。
sendFile优化(DMA copy)
linux2.1 :数据不经过用户态,直接从内核缓冲区 => socketBuffer => protocal engin.,由于和用户态完全无关,就减少了一次上下文切换.
linux2.4: 直接从内核缓冲区 => 协议栈(拷贝到socketBuffer信息很少,忽略不计)
零拷贝再次理解
零拷贝:指的是没有CPU拷贝。通过DMA拷贝。(所谓DMA拷贝就是通过其他硬件负责数据的转移,不需要CPU参与,解放了CPU。
DMA copy 和 CPU copy
)
零拷贝优势:更少的数据复制,减少上下文切换(内核态和用户态的切换)。
mmap 和 sendFile 的区别
mmap适合小数据量读写,sendFile适合大文件传输
sendFile可以利用DMA,减少cpu拷贝。mmap不能,它是用户buffer和内核buffer共享的。
1. 2 案例
使用NIO零拷贝方式传递(channel.transeferTo)一个大文件。速度快得多。
2. Java AIO 基本介绍
JDK1.7引入了AIO,采用了Proactor模式,简化了程序编写,有效的请求才启动线程,他的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时长较长的应用。
目前AIO还没有广泛使用。netty是基于NIO的而不是AIO.
3. BIO NIO AIO 对比
文章来源:https://blog.csdn.net/qq_44850917/article/details/135063278
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!
最新文章
Python教程
深入理解 MySQL 中的 HAVING 关键字和聚合函数
Qt之QChar编码(1)
MyBatis入门基础篇
用Python脚本实现FFmpeg批量转换
理解 AQS 和 ReentrantLock
windows下载安装ffmpeg最新版
postgresql 最简主从配置
docker运行redis
centos7通过systemctl启动springboot服务代替java -jar方式启动
yarn install报错
Kafka系列(一)
Cmake 中的list介绍
flex 2----居中
智能成绩表(75%用例)C卷(Java&&Python&&C++&&Node.js&&C语言)