解释:
1、问题叙述:程序请求硬盘上的系统文件的时候,一般请求文件会在’系统缓存’和‘应用缓存’各存储一份,然后再由cpu操作应用缓存展示给用户。所以一般用户请求系统硬盘的文件时,文件在内存中可占了双份,而且系统和应用之间上下文存在多次切换,所以内存跟性能之间存在优化的空间。
2、dma技术解释(Direct Memory Access):dma技术未出现之前通过cpu操作磁盘io是非常占用cpu资源的;目前大多数的硬件设备,包括磁盘控制器、网卡、显卡以及声卡等都支持 DMA 技术,该技术解除了cpu在磁盘io方面的负载;
- 传统io
步骤:硬盘(dma)》内核缓冲(cpu)》用户缓冲(cpu)》socket缓冲(dma)》协议层
1、四次上下文切换。
2、四次copy
- Mmap(内存映射):
步骤:硬盘(dma)》内核缓冲(share用户缓冲)(cpu)》socket缓冲(dma)》协议层
优点
较缓存io,因为系统内核缓存和用户缓存共享,通过mmap访问硬盘数据减少了一次系统缓存至应用缓存之间的copy,提升了性能。
实现用户区域与系统内核之间的高效交互。
提供进程间共享内存间的相互通信方式。(如k8s的共享内存就要到这种方式)
可用于实现高效的大规模数据传输。(因为mmap的内存可大于物理内存,采取淘汰算法,将需要淘汰的内存页换成新的内存页)
缺点
文件很小,小于4096,因为mmap是页为单位,因此连续小文件会浪费内存。
对变长文件不适合,文件无法扩展;mmap到内存,所能操作的访问就确认了。
更新文件操作很多的情况不适合,因为会产生大量脏页回写,引发随机io。
rocketmq使用了mmap,java也能实现mmap
- 直接io
步骤:硬盘(dma?)》用户内存》协议层。
少了内核缓存这步骤,直接操作硬盘。
优点
不用经过内核缓冲,节省了内存,某种场景下算是加快了速度,nginx支持直接io;
数据库采用这种方式就很好,实时修改文件,及时响应修改。
缺点
没有内核缓冲,意味着每次访问文件都从硬盘访问,多线程同时访问同一文件的时候性能会比较差。
一般跟aio异步线程一起使用。
- sendFile (零拷贝)
步骤:
2.1内核:硬盘(dma)》内核缓冲(cpu)》socket缓存(dma)》协议层。(不经过用户层)
2.4内核以上:硬盘(dma)》内核缓冲(cpu)》des描述文件进入socket缓冲(dma)》协议层。(不经过用户层,文件不经过socket缓冲,只是描述文件进入socket缓冲)
2.1三次上下文切换,三次copy。
2.4三次上下文切换,两次copy,文件直接内核缓存传输到协议层。
优点
1、节省内存空间,只在内核缓冲存储了一份数据,减少内存拷贝(2-3次),上线文切换(3次)
2、充分利用了dma,减少cpu的负担。
缺点
1、数据不经过用户系统,都是在操作系统内核中传输,用户系统编写的对传输内容操作不了?
2、貌似传输文件大于2g会出问题。
暂未发现太多。。
kafka、nginx都支持零拷贝,用于加速外部请求;java也能实现零拷贝
相关推荐
用Netty实现的Spring-boot-protocol将springboot的WebServer更改为NettyTcpServer,为用户扩展了网络编程的能力。...sendFile, mmap. 示例:com.github.netty.http.example.HttpZeroCopyController.java4.HttpServlet
个人花大量时间整理出的实战资料,内容丰富,文档也很详细。无论做毕业设计还是用于学习技能,或工作中当做参考资料,都能发挥重要作用 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~ ...
Task&BackStack;.mmap
在linux环境下,用c语言编写的关于mmap使用方法的小程序
详细介绍mmap 内核态映射到用户态的使用
主要为大家详细介绍了利用mmap实现文件拷贝功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
前言零拷贝是服务器网络编程的关键,任何性能优化都离不开。那么,他们在 OS 里,到底是怎么样的一个的设计?本文将简单聊聊 mmap 和 sendFile 这两个
android jni下的sharemem,mmap实现
Vue.mmap笔记
壁虎Raft的实现,支持文件,内存和Rockdb存储,使用mmap和sendfile实现零复制关于raft算法可以参考这个动画
mmap记录是一个持久存储库。灵感来自xlog。
Docker2022.mmap
需要打开脑图mmap的可以下载这个马上就能安装好
里面包括 1. 一个用户空间的mmap将文件映射到内存进行操作的例子 2. 一个mmap内核驱动及对应的mmap用户空间的程序。
linux中关于mmap的个人总结。应用层mmap总结。
主要介绍了使用mmap实现多进程对大文件拷贝,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
深入解析Windows操作系统.mmap
有时候,应用层需要直接访问物理地址,这时应用层就需要调用应用层mmap接口继而调用驱动层的mmap接口将希望的物理地址映射成用户态能访问的虚拟地址。由于操作系统事先并没有创建这块物理地址与虚拟地址的映射关系,...
软件职场.mmap,思维导图,为IT职场新人提供就业思路。
介绍了嵌入式Linux的Mmap设备的原理和方法